【初心者向け】一部自己流なMATLABノウハウ

# はじめに
私は卒業研究で、MATLABを使った数値解析を行っていました。
とはいえ、研究室に配属された当初はほとんどプログラムを書いたことがなく、そういう人目線でのMATLABの入門記事があればと感じていました。
また、研究活動のリモートワーク化により、「知っておくと便利だけど人に教えるほどではない」ことを研究室のメンバー内で共有しづらくなったように思います。
そこで本記事は、研究等で突然MATLABを使うことになった初心者の方に向けて、MATLABの基礎と、知っておく必要はないけど知っていると便利"かもしれない"ことを共有できたらと考えています。

# 本記事の構成
本記事は、Section 1 と Section 2 の2部構成です。
Section 1 では、MATLABを動かすことを目標にします。
初歩的な内容なので、MATLABを動かしたことがある方は Section 2 から見ていただけるとよいかと思います。
Section 2 では、私がMATLABを使用した過程で学んだノウハウをお伝えします。
Section 2 に関しては、一部自己流かもしれない内容を含みます。ご自身で取捨選択をお願いします。
また、悩んだ挙げ句ノウハウと題してしまいましたが、本記事で扱う大半はググれば出てくる内容となっています。若干タイトル詐欺みたいなところがあり、申し訳ありません。
# 環境
MATLAB R2021a
OS Windows 10
バージョン等の違いによって一部内容に差異がある可能性があります。

# Section 1 超初級編
Section 1 はMATLABを最低限動かせるようになる方法をお伝えします。
## 1-1 ドキュメンテーションを読む
[Mathworksのドキュメンテーション](https://jp.mathworks.com/help/matlab/)を読みましょう。
日本語の説明はもちろんのこと、関数の実行例も豊富で、かなり良心的です。
インターネットブラウザで「〇〇(〇〇にはやりたい事を入れる) MATLAB」などと検索すれば関数がヒットするので、新しい関数を習得したり、関数名は分かっていて使用方法が思い出せないときは関数名で検索しましょう。
後者の場合、コマンドウィンドウ上で、`doc 関数名`と検索すれば、ブラウザを開かずともドキュメンテーションを開くこともできます。関数名の前半だけ思い出せているけど後半思い出せない場合などは、Tabキーで補完すると便利です。

## 1-2 エラー文を読む
エラー文を読みましょう。エラー文の内容が理解できなければ調べましょう。
エラー文は次の形式 `エラー: エラー内容(行xx)` で表示され、クリックするとエラーが起こった行が自動で開かれます。
エラーを辿ると、ほとんどの場合、MATLAB関数でエラーが起きているので、ドキュメンテーションを開いて仕様を確認しましょう。
## 1-3 デバッグする
エディタの行番号の右の「ー」をクリックすると赤い丸が付きます。これが[ブレークポイント](https://jp.mathworks.com/help/matlab/matlab_prog/set-breakpoints.html)です。エラー文を読んでも原因が分からない場合は、エラーが起きた行にデバッグポイントを設定して、再実行します。すると、エラーが起こる手前で処理が止まり、変数の中身を確することができます。変数の中身は[ワークスペース](https://jp.mathworks.com/help/matlab/ref/workspace.html)から確認することができます。3次元配列で中身を確認できない時は、ある次元のインデックスを任意の値に設定して、`permute`関数で2次元配列に直すなどしていました。
また、ブレークポイントを手動で解除するのが面倒な場合は、`dbclear all`を実行すれば一括で解除することができます。
MATLABのデバッグに関する超絶丁寧な記事がありましたので、共有させていただきます。

https://qiita.com/shun-kusano/items/7409129f8a87f23b1cfa

## 1-4 パスについてちょっと知る
プログラミング自体が初めての方が一定数ぶち当たる壁は、パス設定かと思います。例えば、「先輩が残したプログラムを自分のPCにも入れたけど動かない」というケースです。もしかするとパスが通っていないことが原因かもしれません。
パスを通すということは、MATLABにファイルの在り処を知らせるという事です。
とりあえずは、①`pathdef.m`(後述)というファイルに設定が保存されている。②同一名称の関数が合った場合、[ルール](https://jp.mathworks.com/help/matlab/matlab_prog/function-precedence-order.html)にしたがって探し出される。の2つだけやんわりと理解しておけば問題ないと思います。
パスの追加方法についてですが、一時的な場合は画像(左)のようにMATLABアプリのフォルダ上で右クリックして追加するか、再起動後も継続したい場合は画像(右)のように設定からGUIで編集するのが良いと思います。
![15669133830957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611084/7877e1e3-7226-c5e4-a860-97c242800c69.png)
パス設定の基礎知識や、`pathdef.m`についてはこちらの記事が分かりやすいです。

https://qiita.com/eigs/items/96697bd372cd45508ff1


# Section 2 脱初級編
Section 1 の内容を抑えれば、MATLABを最低限扱えるようになったと思います。
Section 2では、「知っていなくても大丈夫だけど知っておくと便利」的なことをお伝えします。
## 2-1 作業を簡潔化する

### ショートカットを使う
ストレスなくコーディングする上で、ショートカットは重要です。以下に、私が良く使うショートカットを紹介します。(注:WindowsですがMacでも同じようなショートカットがあるかと思います。
`F5：実行、Ctrl + D：関数を開く、Ctrl + R ：コメントアウト、Ctrl + T：アンコメント、Ctrl + F：ファイル内検索、Ctrl + H：ファイル内置換、Ctrl + Shift + F : 全ファイル検索、Ctrl + C ：実行の強制終了`
検索や置換等のように一般的なエディタに搭載されているものは基本あります。
Ctrl + D で関数を開くショートカットは、エディタ上の関数名にマウスカーソルを置いた状態で関数を辿るようにコードを確認するのに使いますが、便利です。
初期で割り当てられたショートカットが気に入らない場合は、[カスタマイズ](https://jp.mathworks.com/help/matlab/matlab_env/keyboard-shortcuts.html)することも可能です。

### できるだけ自動化する
自動化というと意味が広いですが、ここでは連続でスクリプトを実行する方法についてお伝えします。
ある程度の計算になると、解析に数日かかるものはざらですが、例えば1回に5時間かかるスクリプトを、条件を変えて10回(50時間)回す必要があったとします。これらの実行を全て手動でやろうとすると、寝ている間に計算が止まってしまいますし、一回の処理が終わった後に結果を手動でまとめる必要があるので、処理が終わるのを気にしなければいけません。
連続でスクリプトを実行すれば、金曜の夜に実行したら月曜の朝には終わり、月曜にまとめて結果を整理するだけなのでとても楽です。
スクリプトを連続で実行するには、動かしたいスクリプトを複数用意して、それらに終了時結果を保存するような処理を追加します。(この方法については後述します)
そして、以下のように`run`を並べるだけです。
`run("script1");`
`run("script2");`
上記の例はあくまで愚直な一例にすぎませんが、プログラムがやってくれることは全てプログラムに任せようというマインドが重要だと私は思います。自動化のために時間を使うことが逆に時間がかかるのでは？と感じられるかもしれませんが、コードは再利用できますし、長い目で見るとメリットが大きいと思います。
### コードの処理時間を気にする
自動化をしても、コードの処理時間が長ければ効率が悪いです。
そこで[「プロファイリング」](https://jp.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html)を活用し、時間がかかっている処理を特定した後で、その部分を高速化することを検討します。簡易的な計測には`tic`と`toc`も有効です。
高速化について細かいことは割愛しますが、以下が参考になります。

https://jp.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html

コードの内容にもよりますが、私の経験上、配列の再生成を行わない(事前割り当て)、ベクトル化、の2つを意識すると処理時間が改善されることが多いように思います。特にMATLABは並列計算が得意なので、できるだけベクトル化すること、既存のMATLAB関数に置き換えられそうな処理はMATLAB関数で書いてしまうことをお勧めします。
MATLABの関数は内部で最適化されているらしいので、独自のアルゴリズムを実装する場合より早い場合が多いです。
### ソースコードをバージョン管理する
MATLABでもGitが使えます。Gitを初めて聞いた方向けに説明すると、ソースコードの歴史を管理できるものです。例えば大事な発表前にバグが発生して、バグがなかった前のコードに戻りたい時に、コマンド一つで戻ることができたり、バグがいつ埋め込まれたかを特定するのに役立ちます。(あくまでこれはバージョン管理システムのメリットの一側面ですが)
MATLABでGithubを使う場合、以下が参考になるかと思います

https://qiita.com/kennykogure/items/5ac71b58e560f56f5977


## 2-2 解析結果や解析条件を保存する
### 出力ファイルをまとめる用のフォルダを作成する
`mkdir`で[フォルダを作成](https://jp.mathworks.com/help/matlab/ref/mkdir.html)することができます。
フォルダ名は、自分で指定するのも一つの手ですが、実行時刻や設定した変数の値が指定されるようにしておくと、毎回名前をつける手間が省ける上に後で見返したときに分かりやすいのでお勧めです。作ったフォルダの中に、解析結果や解析条件等の出力ファイルを格納していきます。
### 解析結果をmat形式で保存する
`save`で[ワークスペースの変数をファイルに保存](https://jp.mathworks.com/help/matlab/ref/save.html?searchHighlight=save&s_tid=srchtitle_save_1)することができます。
指定するファイル名を、
`ファイルを入れたいフォルダの絶対パス名¥ファイル名`
とすることで、生成したフォルダ直下に`.mat`形式のファイルが記録されます。
### 解析結果を動画で保存する
私は実装したコードの振る舞いを確認したいときに、図を繰り返し描画して動画で確認したりします。このとき、時間がかからない処理であれば画面を眺めるだけでいいですが、時間がかかる処理の場合`writeVideo` で[動画を作成](https://jp.mathworks.com/help/matlab/ref/videowriter.writevideo.html?searchHighlight=writevideo&s_tid=srchtitle_writevideo_1)すれば、後で一気に確認することができて便利です。なお、グラフを繰り返し描画するのはそれなりに時間がかかるので、確認したいとき以外は表示しないような条件分岐を書いておくといいかもしれません(そういうときの検証にこそ、プロファイリングが役に立ちます)
### 解析結果をエクセルに保存する
`writematrix`で、[テキストファイルやcsvファイルにデータを保存](https://jp.mathworks.com/help/matlab/ref/writematrix.html?searchHighlight=writematrix&s_tid=srchtitle_writematrix_1)することができます。自動化が大好きな私ですが、正直エクセルへの書き込みに関してのみ、自動化が最適だとは言い切れないところです。csv形式で保存したい明確な理由がない限り、csvで保存するメリットを感じづらいことや、作図をしたいのであればMATLABで事足りる、と個人的に考えているからです。もちろん、Excelでちょこっとグラフを確認したいときなど、Excelを使いたい場面もあります。そのようなときは手動の方が楽かもしれません。ただ、形式がきまっていて何度も実行するプログラムであったり、MATLABのライセンスがない人に結果を共有したい場合があれば、覚えておいて損はない関数かと思います。
### 解析条件をテキストファイルに保存する
`diary`を使うと、[コマンドウィンドウのテキストをファイルに保存](https://jp.mathworks.com/help/matlab/ref/diary.html?searchHighlight=diary&s_tid=srchtitle_diary_1)することができます。例えば、プログラム中のパラメータの値を記録するのに便利です。ファイルに保存する方法は他にも多々ありますが、`diary`を使う利点は、記録したい変数をコマンドウィンドウに出力する(「；」なして記述する)だけで済むので、特別な処理を記述する必要がないことです。また、エラーや警告も、併せて記録することができます。
## 2-3 作図系
### 図のフォーマットの指定を行う
フォント等、グラフの指定は各自こだわりがあると思います。
毎回Figureプロパティで設定するのは少々面倒なので、初期設定にしてしまうと楽です。
MATLABでは検索パス上のuserpathフォルダに`starup.m`を配置しておくことで、起動時に実行するコマンドを指定できます。
この`startup.m`に初期設定を追加することでFigureプロパティのデフォルト値を定義することができます。

https://jp.mathworks.com/help/matlab/ref/startup.html

https://mechlog.hateblo.jp/entry/2017/09/16/225342

### 画面上のFigureを一気に消す
コマンドプロンプトで`close all` を入力すると消えます。
close関数の仕様は[こちら](https://jp.mathworks.com/help/matlab/ref/close.html?searchHighlight=close%20all%3B&s_tid=srchtitle_close%20all%253B_1)です。
個人的によく使うという理由で紹介しました。
### イタリックにする
理系の論文では変数をイタリックにする必要があると思います。
例えば、グラフの横軸が「x [m]」で、xだけイタリックにしたい場合は、
グラフ描画後に`xlabel('{\it x} [mm]')`などとすれば可能です。
それ以外にも、上付き文字、太字等の指定が可能です。

https://jp.mathworks.com/help/matlab/creating_plots/greek-letters-and-special-characters-in-graph-text.html

### 解像度の良い画像を得る
大きいサイズの画像を作って、論文やプレゼン資料に貼り付けるときに縮小すれば解像度が良くなります。大きいサイズの画像を作る([画像の大きさを指定する](https://jp.mathworks.com/help/matlab/ref/print.html?searchHighlight=print&s_tid=srchtitle_print_1))には、fig形式の図を作成した後で、`print`を使用すると簡単にできます。
`print`の使用例を以下に示します。
`print(gcf,'-djpeg','-r400','output.jpg')`


## 2-4 その他
### ファイルの差分を確認する
画像(左)のように、2つのファイルを選んで右クリック後、「選択したファイル/フォルダーを比較」をクリックすると、画像(右)のように、ファイルの差分を確認することができます。私はこれに最近気づいたのですがこれって常識なのでしょうか。(それまでMATLAB外でしていた...)
![15668893476942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611084/9eced5d2-7dbb-b46c-4674-f5239e498d18.png)

### アドオンエクスプローラーを活用する
アドオンエクスプローラーでは、Mathworks社及びユーザコミュニティの作成したToolboxを検索したりダウンロードしたりできます。Mathworks社が提供するToolboxは基本的に有料で購入する必要があるかと思いますが、ユーザが共有したものについてはそれぞれのライセンスに基づいてダウンロードできます。他の方のコードを見ることは勉強になりますし、実装する前にここで検索してみると、似たようなコードが既に共有されていたりします。
MATLABからアドオンエクスプローラーを開く方法ですが、ホームの「アドオン」→「アドオンの入手」の手順で開くことができます。
![15668943370719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611084/3b48f6f8-7d3c-d878-db3b-221a4c14cfac.png)

### MATLAB Answersを活用する
MATLABに特化した知恵袋みたいな感じです。詳しいユーザさんやスタッフ様が回答してくれることがあります。
質問で解決する以外にも、他人が読める文章に直すことで自力解決することや、検索で欲しい情報が落ちてたりします。

https://jp.mathworks.com/matlabcentral/answers/help

### GPU計算をする
こちらは、MATLABライセンスに加えて、Parallel Computing Toolboxというものが別途必要となります。GPU計算とは一部の並列処理をGPUで計算することで高速で行う技術なのですが、MATLABの場合は専用の知識がなくても簡単にできます。流れは以下の通りです。
1. `gpuArray`でGPUにデータを転送
2. 演算を実行
3. `gather`でGPU上のデータをワークスペースに転送


2番の演算が時間のかかる演算(例えば要素数の多いfft)である場合、計算速度が格段に改善されます。ただこれは、裏返すと2番がGPU計算に適さない演算である場合1番と3番がネックになって逆に速度が低下するということでもあります。
また、2番の演算は対応している関数に制限があるので、[こちら](https://jp.mathworks.com/help/matlab/referencelist.html?type=function&capability=gpuarrays)等からご確認ください。
ご自身のコードがGPU計算で高速化が可能か気になる場合は、Parallel Computing Toolboxの試用版を購入して一度試されると良いかもしれません。

http://titech-ssr.blog.jp/archives/1047211879.html

# おわりに
他にもまだまだあるのですが、理系学生が卒業研究で困らないためのものに絞って紹介させていただきました。
MATLABは本当に様々なことができるので、必要に応じて調べてみてください。
経験者の方からすると物足りない内容だったかもしれませんが、もし新しい発見が一つでもあれば幸いです。
記事へのご指摘や、みなさん流のノウハウ等がありましたら是非、コメントにご記入ください。
拙い文章でしたが、最後まで目を通していただきありがとうございました。