【MATLAB】パス設定に関する"基礎"知識

# はじめに

以前、`resturedefaultpath` を使ったパス設定の初期化について紹介しました。

> 参照：[【MATLAB】何が起こっているか分からないが致命的っぽいエラーの処置方法](https://qiita.com/eigs/items/3def0ad104d2f2efed8a)

今回はパス設定にもう少しだけ踏み込んで、MATLAB を起動するたびに裏で必ず動いている、 

- `pathdef.m`  
- `userpath` 

について紹介します。パス設定のベース（基礎）ですね。

自分だけのパス設定で作業したいがチームでPCを共有している・・そんな時に役立つかもしれません。

## 関連 Q&A 

- [MATLAB Answers: MATLAB内でカス​タムパスを設定してい​ますが、MATLAB​のパスをリセットする​必要がありますが、実​行前にそれらをバック​アップできますか。](https://jp.mathworks.com/matlabcentral/answers/166888-matlab-matlab?s_eid=PSM_29435)

- [MATLAB Answers: MATLABを起動すると、「関数または変数 'matlab.in​ternal.edi​tor.Evalua​tionOutput​sService.p​rewarmExec​ution' が認識されません。」​のエラーが発生するの​はなぜですか？](https://jp.mathworks.com/matlabcentral/answers/228738-matlab-matlab-internal-editor-evaluationoutputsservice-prewarmexecution?s_eid=PSM_29435)



## そもそもパス（PATH）とは

MATLAB のパス設定を触っている方はどれくらいいらっしゃるのでしょう？

パスってなんだっけ？という方は、MATLABに限らずパス設定そのものについては良記事がありましたので、こちらも参照ください。

- [Pathを通すとは、環境変数とは](https://qiita.com/fuwamaki/items/3d8af42cf7abee760a81) by 
@fuwamaki さん
- [「PATH を通す」の意味をできるだけわかりやすく説明する試み](https://qiita.com/sta/items/63e1048025d1830d12fd) by @sta さん


# まずは `pathdef.m`

MATLAB ではパス設定は `pathdef.m` というファイルに保存されていて、MATLAB 起動時に読み込まれます。

ファイルのありかはおなじみ `which` コマンドで見つかります。

```m

>> which -all pathdef
C:\Program Files\MATLAB\R2019a\toolbox\local\pathdef.m
```

例えば `addpath` 関数でフォルダをパスに追加するなどした後、`savepath` 関数を実行するとこの `pathdef.m` が更新されるわけです。何かパス設定をいじるときには、このファイルさえバックアップ取っておけば安心です。

内容を確認するなら `>> edit pathdef` で。大事なパス設定が直書きされています（笑）自信のある方は手で書き換えてもいいですが（あまりよくない）気をつけてください。

もし、うっかり意図しない編集をしてしまったら、

```m
savepath
```

で元にもどる可能性はあります。やっぱりダメだったら

```m
restoredefaultpath
savepath
```
で初期設定に・・。

**注**：環境変数 `MATLABPATH` で起動時にパスを追加する方法もあります。（参照: [環境変数 MATLABPATH の設定](https://jp.mathworks.com/help/matlab/matlab_env/add-folders-to-matlab-search-path-at-startup.html#btpajlw?s_eid=PSM_29435)）


# ２つ目の `pathdef.m`？

さて、特に何もしなければ `pathdef.m` は１つだけで十分なんですが、冒頭で触れたように２つ以上用意できると便利な場面もあります。例えば、

- 複数人で共有しているPCなので、勝手にパスをいじると他の人に迷惑がかかる。
- `C:\Program Files\MATLAB\R2019a\toolbox\local` の編集権限が無く、パス設定を変更できない！

こんな時は `userpath` に `pathdef.m` を保存すればOKです。


## `userpath` とは？

`userpath` とはユーザー固有の作業フォルダのようなもの。特に設定した覚えが無くても、何らかのフォルダが `userpath` として指定されていると思いますので、興味がわいた方は確認してみてください。

```m
>> userpath
ans =
    'C:\Users\eigs\Documents'
```

このフォルダに pathdef.m があれば、`C:\Program Files\MATLAB\R2019a\toolbox\local` より優先されて読み込まれることになります。

`userpath` に `pathdef.m` をコピーしてから `which` コマンドで見てみると

```m

>> which -all pathdef
C:\Users\minoue\Documents\pathdef.m
C:\Program Files\MATLAB\R2019a\toolbox\local\pathdef.m  % Shadowed
```

の通り、もともとの `pathdef.m` より優先されています。この状態でパスをいじって `savepath` すると `userpath` にある `pathdef.m` が編集されます。

`>> userpath(絶対パス名)` で任意のフォルダを設定できますので、ユーザー固有のパス設定を持つことができるわけです。

## `userpath` 設定情報はどこに保存されている？

既におなじみ `prefdir` フォルダに保存されています。

```m
>> prefdir
ans =
    'C:\Users\eigs\AppData\Roaming\MathWorks\MATLAB\R2019a'
```

これもユーザー固有のものが持てますね。

## 複数の MATLAB バージョンを入れている場合は要注意

複数のMATLABバージョンで同じ `userpath` 設定だと、同じ `pathdef.m` を共有してしまうことになります。フォルダ構成は各バージョン同じではないので、大問題。`userpath` もバージョンごとに変える必要がありますね。 

-[MATLAB Answers: MATLABを起動すると、「関数または変数 'matlab.in​ternal.edi​tor.Evalua​tionOutput​sService.p​rewarmExec​ution' が認識されません。」​のエラーが発生するの​はなぜですか？](https://jp.mathworks.com/matlabcentral/answers/228738-matlab-matlab-internal-editor-evaluationoutputsservice-prewarmexecution?s_eid=PSM_29435)


# まとめ

パス設定の"基礎"を紹介しました。これでもう MATLAB のパス設定で迷うことはないですね。
ちなみに `userpath` フォルダは検索パスの**一番上**に追加されます。

```m
>> path
		MATLABPATH
	C:\Users\eigs\Documents
	C:\Program Files\MATLAB\R2019a\toolbox\matlab\capabilities
	C:\Program Files\MATLAB\R2019a\toolbox\matlab\datafun
(中略)
```

公式ページ：[MATLAB 検索パスの表示と変更](https://jp.mathworks.com/help/matlab/search-path.html?s_eid=PSM_29435)