大学の卒業研究で使っているMATLABの基礎知識

僕は現在（2020年12月時点）大学4年生で、卒業研究をやっています。
自分の研究ではセンサーを使ってデータを取得し、それを数値解析する必要があります。
そこでMATLABを使っているのですが、非常に便利だな～と感じています。

その書き方や関数について、使っている中で学んだ基礎知識をまとめてみます。
「もっとこうした方がいいよ」等ありましたら、コメントでご教授いただけると嬉しいです。

## 基本

- セミコロン
- 出力
- 計算
- if
- for

### セミコロン

MATLABでは、終わりにセミコロンをつけます。

### 出力

`disp` という関数を使います。
使用例を以下に示します。

```matlab
a = 10;
b = 'Hello world!';
disp(a); disp(b);

% 出力
% 10
% Hello world!
```

### 計算

自分が実際に使った基本的なものを挙げます。

- 和：`sum`
- 平均：`mean`
- 絶対値：`abs`
- 切り上げ：`ceil`
- 切り捨て：`floor`

使用例を以下に示します。

```matlab
a = [1 2 3]; b = -5; c = 3.2;
disp(sum(a));
disp(mean(a));
disp(abs(b));
disp(ceil(c));
disp(floor(c));

% 出力
% 6
% 2
% 5
% 4
% 3
```

### if

if文の基本的な書き方は以下の通りです。
ある数値が正か負か0かを判定する例を示します。

```matlab
num = 5;
if num > 0
    disp('正の数です。');
elseif num == 0
    disp('0です。');
else
    disp('負の数です。');
end

% 出力
% 正の数です。
```

### for

for文の基本的な書き方は以下の通りです。
1から10までの数値を足す例を示します。

```matlab
sum = 0;
for I = 1 : 10
    sum = sum + I;
end
disp(sum);

% 出力
% 55
```

## ベストプラクティス

[こちらの記事](https://qiita.com/sshojiro/items/bd2ce703e605ffc9451e)に全て書かれてあります。
[[#matlab] Matlabのベスト・プラクティス](https://qiita.com/sshojiro/items/bd2ce703e605ffc9451e)

自分が気になったものだけ、以下に示します。

- camelCaseで書く
- 予約語とかぶらないように
- スペース推奨

### camelCaseで書く

> 「hogeData」や「HogeData」のように単語の先頭を大文字にしてつなげる表記方法のことです。

[キャメルケース (camel case)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1179.html)

### 予約語と被らないように

当然のことですが、個人的に驚いたのが `i` や `j` が予約語だったことです。
`i` と `j` は虚数単位を表すようです。
以下に、公式ドキュメントから引用します。

> i は関数なので、オーバーライドして変数として使うこともできます。ただし、複素数の計算に使用する場合は変数名に i および j を使用しないことを推奨します。

試してみたところ、例えばfor文のループで `i` を使うことはできたんですが、本やネット記事を見ても大文字の `I` を使っていることが多かったです。
複素数の計算ではないため問題ないとは思いますが、なんとなく気持ち悪いので僕もfor文のループでは大文字の `I` を使うようにしました。

### スペース推奨

昨年やっていた先輩や先生のコードは、なぜかギュウギュウに詰めて書いていました。
「MATLABでは詰めて書くのかな」と思いましたが、そんなことはないようです。

## グラフ関連

- タイトル
- 軸ラベル
- 凡例

### タイトル

`title` という関数を使います。
使用例を以下に示します。

```matlab
title('検証結果');
```

### 軸ラベル

`xlabel` と `ylabel` という関数を使います。
それぞれ横軸・縦軸にラベルをつけることができます。
使用例を以下に示します。

```matlab
% 横軸ラベル
xlabel('Frequency [Hz]');
% 縦軸ラベル
ylabel('Amplitude spectrum [kPa]');
```

### 凡例

`legend` という関数を使います。
使用例を以下に示します。

```matlab
legend('従来手法', '提案手法1', '提案手法2');
```

## その他の便利なもの

- 複数行
- 零行列
- データの結合
- ワークスペースからデータを取得
- 関数ハンドル

### 複数行

3つのピリオド `...` を使います。
使用例を以下に示します。

```matlab
sum = 1 + 2 + 3 + 4 ...
        + 5 + 6 + 7 ...
        + 8 + 9 + 10;
disp(sum);

% 出力
% 55
```

### 零行列

零行列とは、成分が全て0の行列のことです。
`zeros` という関数を使います。
使用例を以下に示します。

```matlab
a = zeros(2); % 2行2列
b = zeros(2, 3); % 2行3列
disp(a); disp(b);

% 出力
% 0 0
% 0 0
%
% 0 0 0
% 0 0 0
```

### データの結合

- 水平
- 垂直

#### 水平

`horzcat` という関数を使います。
使用例を以下に示します。

```matlab
data1 = [1 2];
data2 = [3 4];
data = horzcat(data1, data2);
disp(data);

% 出力
% 1 2 3 4
```

#### 垂直

`vertcat` という関数を使います。
使用例を以下に示します。

```matlab
data1 = [1 2];
data2 = [3 4];
data = vertcat(data1, data2);
disp(data);

% 出力
% 1 2
% 3 4
```

### ワークスペースからデータを取得

`evalin` という関数を使います。
第一引数は `'base'` として、第二引数にワークスペースにあるデータの名前を与えます。
使用例を以下に示します。

```matlab
data = evalin('base', 'data');
```

### 関数ハンドル

`@` をつけることで関数ハンドルを作成できます。
以下、公式ドキュメントから引用します。

> 関数ハンドルは、関数への関連付けを格納する MATLAB® データ型です。関数を間接的に呼び出すことで、呼び出し位置によらずに関数を呼び出すことができます。

使用例を以下に示します。

```matlab
function out = hogeFunction1(data)
    % 処理1
end

function out = hogeFunction2(data)
    % 処理2
end

% f = @hogeFunction1;
f = @hogeFunction2;

out = f(data);
```

データに対して関数を選択的に適用したいときに使いました。
使わないものは上記のようにコメントアウトしていました。

## 参考

- [[#matlab] Matlabのベスト・プラクティス](https://qiita.com/sshojiro/items/bd2ce703e605ffc9451e)
- [キャメルケース (camel case)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1179.html)