MATLAB入門コースの楽しみ方 (我流)

# はじめに

hibs@MATLAB Ambassadorは多くの方の協力を得て, 先日, MATLAB講習会を成功させることができました!! 本当にありがとうございました.

![Dec2021_MATLABOnramp_poster_Twitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/15e78fa6-c223-218f-7c83-249192187870.png)

さて, 今回行った講習会は, 上のポスターの通り, MATLAB初学者向けの「[MATLAB入門](https://jp.mathworks.com/learn/tutorials/matlab-onramp.html)」の一部を一緒にやっていくという比較的簡単な内容でした. しかし, 講習会終了後のアンケートでは, MATLABを経験者の方も大変満足されたご様子でした. そこで, 今回のMATLAB講習会の内容に沿って, 私個人のMATLAB入門コースの楽しみ方を記録していこうと思います!!

# 「MATLAB入門」とは

[MATLAB入門](https://jp.mathworks.com/learn/tutorials/matlab-onramp.html)とは, MATLABを開発しているMathWorks社が提供している自主学習コースの1つです. これはどんな方でも[MathWorksアカウント](https://jp.mathworks.com/mwaccount/)を作成することで, **無償**で体験することができます.

# 我流の楽しみ方の概要

さて, 私のMATLAB入門の楽しみ方のどこが我流なのか?
それは, **MATLAB入門を実施中に関連する情報を一気に手に入れてしまう**ところです. 

「どうせ学習するなら, 一度で多くの知識を入れたほうが効率よくね???」

という, なんとも馬鹿っぽそうな思考の基, 発案した楽しみ方になっております. 

# MATLAB入門スタート!!

早速, 「MATLAB入門」スタートです!!　今回は講習会の内容に沿いますので, 対象範囲は以下になります.

* コース概要
* コマンド
* ベクトルと行列
* 配列の計算
* データのプロット

## 1. コース概要
MATLABの自主学習コースではおなじみの動画パートになります. 私は, いつもここをTOEIC対策に使用していました. 例えば, こんな感じです.

**1.** What will this course introduce?
(A) How to control car engine
(B) How airplanes fly
(C) The difference between MATLAB Online and Desktop version
(D) How to write MATLAB Language

**2.**  Why this course provides some projects?
(A) To introduce fundamental MATLAB commands
(B) To check what you learn and use them
(C) To leave and come back later
(D) To build a development environment

**3.** How many hours this course will take to complete?
(A) Half-hour
(B) One hour
(C) Two hour
(D) Eight hour

正解: **1.** (D), **2.**(B), **3.**(C)

## 2. コマンド

### コマンドの入力

ここでは, 基本的な算術演算を行いますね. そこで, 見るべきなのは, MathWorksの[算術演算ドキュメンテーション](https://jp.mathworks.com/help/matlab/ref/plus.html)!! 驚いたのは, MathWorksが"**+**"にまでドキュメンテーションを用意していることです. 普通のプログラミングの本なら, 「まあ当然だよね～」とほんの数行しか説明を書かないところにMathWorksはhtmlファイル1つを用意しておいてくれました!!

そして, 「中身はただの足し算かな～」と思いきやそんな甘くはない. 例えば, [plus,+ドキュメンテーション](https://jp.mathworks.com/help/matlab/ref/plus.html)の中身は,

* 配列のスカラーの加算
* stringの付加
* 2つの配列の加算
* 行ベクトルと列ベクトルの加算
* ベクトルを行列に追加

となっており, かなり充実していました. ちなみに, 私は「行ベクトルと列ベクトルの加算」は知りませんでした!!

```math
a = \begin{bmatrix}
a_1 & a_2
\end{bmatrix}, 
b = \begin{bmatrix}
b_1 \\ b_2 \\ b_3
\end{bmatrix}, 
a + b = \begin{bmatrix}
a_1+b_1 & a_2+b_1 \\
a_1+b_2 & a_2+b_2 \\
a_1+b_3 & a_2+b_3
\end{bmatrix}
```

### 変数の命名

題名の通り, ここでの主役は「変数」です. どんなプログラミング言語でも, 変数の名前にはできない文字列も存在します. MATLABでは, それらが[変数名ドキュメンテーション](https://jp.mathworks.com/help/matlab/matlab_prog/variable-names.html)にまとめられています. また, MATLABキーワードも変数名として使用することはできません. MATLABキーワードは,

```code:matlab
>> iskeyword
```

で確認ができます.

### 変数の保存と読み込み

ここでは, 便利なコマンドたちの登場です. MATLAB入門では,

```code:matlab
>> save
>> load
>> clear
>> clc
```

が登場してきますが, 他の便利コマンドたちもたくさんあり, その一部は, [コマンドの入力ドキュメンテーション](https://jp.mathworks.com/help/matlab/entering-commands.html)にまとめられています.

中でも私のような理工系の大学生がよく使うのは,

```code:matlab
>> format long
```

ではないでしょうか? 大学生にもなると, 計算は手では行わなくなっていきます. その計算の中身を理解していることが前提の基, よりミスの少ないコンピュータに計算を任せることが多くなります. しかし, そんなコンピュータにもミスをするときがあります. その中で, 丸め誤差があるかもしれない場合, 変数が表している値を確認することが原因追及の手段の1つとなります. [format](https://jp.mathworks.com/help/matlab/ref/format.html)は普段は見やすいように省略して描いてくれている数値を, 省略せずにすべて見せるためのコマンドです. ちなみに, [MATLAB内の数値型は既定ではdouble型になります](https://jp.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html).

そして, 素敵なMathWorksさんは[丸め誤差の回避方法についてまでドキュメンテーションを準備してくれています](https://jp.mathworks.com/help/symbolic/recognize-and-avoid-roundoff-errors.html). 

### 組み込みの関数および定数の使用

ここで言う事は1つだけです!! **わからなかったらググってドキュメンテーションを探そう!!**

## 4. ベクトルと行列

### 配列の手動入力

ここでは, ","と";"を使って, スカラー, ベクトル, 行列を含む配列を作成していきます. ここでは, 今後, 様々なMATLAB自主学習コースを進めていくにあたり, 必ずと言っていいほど覚えなければならないことがあります. それは, **「行」と「列」**です!! 

**行ベクトル**は,

```math
\begin{bmatrix}
行_1 & 行_2 & 行_3
\end{bmatrix}
```

です. 対して, **列ベクトル**は,

```math
\begin{bmatrix}
列_1 \\ 列_2 \\ 列_3
\end{bmatrix}
```

です!! これは, 自主学習コースだけでなく, プログラムを書いていく際にも必要になってきます. また, ミスの原因にもなりやすい部分です. もし, ミスをしてしまった場合は, [転置](https://jp.mathworks.com/help/matlab/ref/transpose.html)を使いましょう!!

### 等間隔のベクトルの作成

ここでは, [:](https://jp.mathworks.com/help/matlab/ref/colon.html?s_tid=doc_ta), または, [linspace](https://jp.mathworks.com/help/matlab/ref/linspace.html)を用いた等間隔のベクトルの作成方法が紹介されています. この:をいかにうまく使うかがMATLABコーディングでは重要になってきます. :をより多く使うことによりコードの量が減り, 可読性を高められることは言うまでもないでしょう.


### 配列作成関数

配列作成関数はなぜあるのか? 1つはとても大きな配列を手動で入力するのは大変ですよね? そして, もう一つの理由は, 計算速度が向上するからです. もし, 今までにMATLABを使ったことがあるなら, 1度は以下の忠告をMATLABに言われたことがあるのではないでしょうか?

**変数のサイズがループごとに変更されているようです. 高速化するために[事前割り当て](https://jp.mathworks.com/help/matlab/matlab_prog/preallocating-arrays.html)を検討してください.**

これは, 計算速度が遅くなることを示唆しています. もし, 回避できるのであればしたいですよね. そこで, 配列作成関数の登場です. これにより, 必要な大きさの配列を1行で準備してしまえます. 簡単で計算速度も向上するので, とても便利です. 注意するべきことは, やはり, **「行」と「列」**です. 配列作成関数においては, 引数は次の順序で入力します.

```code:matlab
zeros(行数,列数)
```

また, 他にも, [MATLABのパフォーマンス向上術](https://jp.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html)はまとめられています. 


## 6. 配列の計算

### ベクトルに対する配列演算の実行

MATLABは行列などの計算を自然に行うためのルールがあるので, とっても楽にコードが書けます. そのルールは[配列と行列の演算ドキュメンテーション](https://jp.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html)にまとめられています.

また, MATLABは行列演算に特化しているので, for文を使うより*を使ったほうが速く計算を行えます.(最近はfor文も速くなっているそうです.)
> @eigs さん [【MATLAB】最近forループが速くなっているらしいよ](https://qiita.com/eigs/items/6d10a98faac0e01a0856)


## 9. データのプロット

### ベクトルのプロット

MATLABでは実に多くの種類の図を作成することができます. その一部は, [MATLABプロットのタイプドキュメンテーション](https://jp.mathworks.com/help/matlab/creating_plots/types-of-matlab-plots.html)に記載されています. また, 実際に作成された図が, [MATLAB Plot Gallery](https://jp.mathworks.com/products/matlab/plot-gallery.html)に載っています. 

### プロットへの注釈の追加

図だけでは, その図を使って何を言いたいのかが全く分かりません.

* 図の数値が何を示しているのか?
* 図のどこに重要なデータが含まれているのか

などを示す必要があります. この問題の中では,

```code:matlab
>> xlim
>> ylim
>> xlabel
>> ylabel
>> legend
>> title
```

などが紹介されています. これらは, [基本プロット関数ドキュメンテーション](https://jp.mathworks.com/help/matlab/learn_matlab/basic-plotting-functions.html)に書かれています. この部分についてはたくさんの人が経験を基にたくさんの記事を書いてくださっています. 

> @larking95 さん [MATLABでLaTeX論文用の図を整形する](https://qiita.com/larking95/items/7ed862f743a3e661e6da)
> @kouichi-c-nakamura さん [MATLABで論文用の図を作るコツ](https://qiita.com/kouichi-c-nakamura/items/468fe09874461911dfab)
> @jirojiro さん [MATLABの図を論文に載せるに耐えうる外見にする](https://qiita.com/jirojiro/items/67ffc62a7c5786f52ccb)
> @eigs さん [このプロットどうやって描いたの？：Phase Modulation（位相変調）](https://qiita.com/eigs/items/cf3a64f7248bce76ce53)
> @tohruk さん [1.2 豊富な可視化機能：MATLAB基本関数](https://qiita.com/tohruk/items/59e527a3e8b540219cc1)
> 公式ドキュメンテーション [ラインに沿ったマーカーのトレース](https://jp.mathworks.com/help/matlab/creating_plots/trace-marker-along-line.html)
> YouTube MATLAB Japan Channel [【論文や研究に】MATLABでデータを綺麗に可視化する基本テクニック](https://www.youtube.com/watch?v=SAzbnvXV9Rg)

ちなみに私がよく使うようになったのは, [xline](https://jp.mathworks.com/help/matlab/ref/xline.html?s_tid=doc_ta), [yline](https://jp.mathworks.com/help/matlab/ref/yline.html?s_tid=doc_ta)です. 重要な値に線を引き, 何が重要なのかを文字で記述すると, なかなか様になるグラフが作れます.

![Systemreact175mm5hits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/0a93e983-e078-7383-6b27-067a8526004f.png)

また, 作った図を保存するには[saveas](https://jp.mathworks.com/help/matlab/ref/saveas.html?s_tid=doc_ta)が便利です.

# 終わりに

今回は, 講習会の内容を基に書いたため, たった5章だけになってしまったが, 時間をかけて我流を紹介しつくしていこうと考えています!!