Coursera 機械学習で説明されたOctaveの文法・構文まとめ　その１

## このページはなに？

CourseraというQiita民みんな大好き機械学習動画で説明された
Octaveの文法・構文をまとめるページ

説明されたけど説明早すぎて頭に入らないだろ！っていう自分用

## 算術演算子

### スカラー（行列でない値）に対する処理

| 操作 | 文法 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
| 和 | + | 6 + 5 | 11 |
| 差 | - | 6 - 5 | 1
| 乗 | * | 6 * 5 | 30 |
| 除 | / | 6 + 5 | 1.2000 |
| べき乗 | ^ | 5 ^ 2 |  25 |

### 行列に対するスカラーの算術演算処理

| 操作 | 文法 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
| 和 | .+ | [1 2 3] .+ 2 | [3 4 5] |
| 差 | .- | [1 2 3] .- 2 | [-1 0 1] |
| 乗 | .* | [1 2 3] .* 2 | [2 4 6] |
| 除 | ./ | [1 2 3] ./ 2 | [0.50000 1.00000 1.50000] |
| べき乗 | .^ | [1 2 3] .^ 2 |  [1 4 9] |

### 行列同士の算術演算


※A, Bはそれぞれ行列とする

| 操作 | 文法 | 例 | 備考 | 
|:--:|:--:|:--:|---|
| 和 | + | A + B | A,Bの行数、列数が一致している必要がある。 |
| 差 | - | A - B | A,Bの行数、列数が一致している必要がある。 |
| 積 | * | A * B | Aの行数と、Bの列数が一致している必要がある。|
| 商 | / | A / B | Aの行数と、Bの列数が一致している必要がある。|

### 行列の項目同士の算術演算

| 操作 | 文法 | 例 | 備考 | 
|:--:|:--:|:--:|---|
| 和 | .+ | A .+ B | A,Bの行数、列数が一致している必要がある。処理内容はA + Bと同じ。　 |
| 差 | .- | A .- B | A,Bの行数、列数が一致している必要がある。処理内容は A - B と同じ。 |
| 乗 | .* | A .* B | A,Bの行数、列数が一致している必要がある。|
| 除 | ./ | A ./ B | A,Bの行数、列数が一致している必要がある。|

例えば、

```math
A = \left(
    \begin{array}{ccc}
      1 & 2 & 3 \\
      4 & 5 & 6
    \end{array}
  \right)\\

B = \left(
    \begin{array}{ccc}
      2 & 4 & 6 \\
      8 & 10 & 12
    \end{array}
  \right)\\
```
のとき、

```matlab
A .* B 
```

は、以下のような結果になります。

```math
\begin{pmatrix}
2 & 8 & 18 \\
32 & 50 & 72
\end{pmatrix}
```



## 比較演算子

| 操作 | 文法 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
|等号| == | 1 == 3 | 0 |
|否定| ~=| 1 ~= 3| 1 |
|比較| <,>,<=,>= | 1 > 3| 0 |

Trueは`1`、Falseは`0`で表現される

## 論理演算子

| 操作 | 文法 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
|AND| && | 1 && 0 | 0 |
|OR | &#124;&#124; | 1 &#124;&#124; 0 | 1 |
|XOR | XOR( , ) | XOR(1,1) | 0 |

## 変数宣言

### 通常の値

```matlab
a = 3
```
いきなり変数名に＝で代入する

### 行列

```matlab
a = [1 2 3; 2 3 4]
```

行列も同様いきなり変数名を書いて＝で代入する。
行列は、大括弧`[ ]`で宣言し、
スペース区切りで列を、
セミコロン`;`区切りで行を表現する

従って、`[1 2 3; 2 3 4; 7 8 9]`とは

```math
\begin{pmatrix}
1 & 2 & 3 \\
2 & 3 & 4 \\
7 & 8 & 9 
\end{pmatrix}
```
という意味になる。

なお、途中で改行入れても大丈夫なので、
こういう書き方もあり。

```matlab
a = [1 2 3; 
2 3 4]
```

## 表示操作

### 値の表示

Aという変数があったとしたら、

```matlab
A
```

または、

```matlab
disp(A)
```

### 演算結果の非表示

```matlab
A;
```
命令文の最後にセミコロン`;`を付けると、
その命令文の結果は、画面表示しない。

**セミコロンには、メソッドチェーンの効果もある。**

## フォーマット

| 操作 | 文法 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
|long型で表示| format long | format long; pi | 3.141592653589793 |
|short型で表示| format short | format short; pi | 3.1416 |
|桁数を自分で指定| sprintf( フォーマット , 値　) | sprintf( '%0.3f', pi) | 3.142 |

## 特殊な行列生成

### 全部が1の行列生成

```matlab
ones(行数,列数)
```

`ones(3,4)`は

```math
\begin{pmatrix}
1 & 1 & 1 & 1 \\
1 & 1 & 1 & 1 \\
1 & 1 & 1 & 1 
\end{pmatrix}
```
になる。

### 全部が0の行列生成

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

`zeros(3,2)`は

```math
\begin{pmatrix}
0 & 0 \\
0 & 0 \\
0 & 0
\end{pmatrix}
```
になる

### 乱数行列生成

```matlab
rand(行数,列数)
```

`rand(2,2)`は

```math
\begin{pmatrix}
0.099779 & 0.352953 \\
0.633659 & 0.604628 
\end{pmatrix}
```
などになる。もちろん値は実行ごとに異なります。

### 正規分布乱数行列生成

```matlab
randn(行数,列数)
```
正規分布するような乱数行列がどこで生きてくるのかはわかりませんが、
コースの中で説明されていたので一応掲載

### 単位行列生成

単位行列とは、ナナメの線が1で、それ以外が0のやつ。
こういうやつ

```math
\begin{pmatrix}
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & 1
\end{pmatrix}
```

作り方

```matlab
eye(行列数)
```

### 魔方陣

魔方陣とは、縦横ナナメの合計が全て同じ値になる行列
こういうやつ

```math
\begin{pmatrix}
8 & 1 & 6\\
3 & 5 & 7\\
4 & 9 & 2
\end{pmatrix}
```
縦横ナナメどれの合計も15になっている。

作り方

```matlab
magic(行列数)
```

## 行列操作

### 特定の行を取り出す

```matlab
X = [1 2; 3 4; 5 6];
X(1,:)
```

結果

```math
\begin{pmatrix}
1 & 2 
\end{pmatrix}
```

### 特定の列を取り出す
```matlab
X = [1 2; 3 4; 5 6];
X(:,1)
```

結果

```math
\begin{pmatrix}
1 \\
3 \\
5 
\end{pmatrix}
```

### 1行目と3行目だけ取り出す

```matlab
X = [1 2; 3 4; 5 6];
X([1 3],:)
```

結果

```math
\begin{pmatrix}
1 & 2 \\
5 & 6 
\end{pmatrix}
```

### 1列目と3列目だけ取り出す

```matlab
X = [1 2 3; 3 4 5 ; 5 6 7];
X(:,[1 3])
```

結果

```math
\begin{pmatrix}
1 & 3 \\
3 & 5 \\ 
5 & 7 
\end{pmatrix}
```

### 特定の行を変更する

```matlab
X = [1 2 3; 3 4 5 ; 5 6 7];
X(1, :) = [ 10 20 30 ]
```

結果

```math
\begin{pmatrix}
10 & 20 & 30 \\
3 & 4 & 5 \\ 
5 & 6 & 7 
\end{pmatrix}
```

```matlab
X(:, 1) = [ 10 ;30 ;50 ]
```
などとすることで、列の変更も可能ですし、


```matlab
X(:, 1) .+ 10
```
などとすれば、特定行のみ演算することも可能

### 行列を横に追加する

```math
\begin{pmatrix}
1 & 2 & 3 \\
3 & 4 & 5 
\end{pmatrix}
```

という行列matrixAの横に、

```math
\begin{pmatrix}
9 & 10 & 11 \\
12 & 13 & 14 
\end{pmatrix}
```
という行列matrixBを追加したい場合、

```matlab
[matrixA matrixB]
```
または

```matlab
[matrixA,matrixB]
```

とする。※行数が一致している必要があります。

結果は、

```math
\begin{pmatrix}
1 & 2 & 3 & 9 & 10 & 11 \\
3 & 4 & 5 & 12 & 13 & 14 
\end{pmatrix}
```

となる

### 行列を縦に追加する

縦に追加するには、

```matlab
[matrixA ;matrixB]
```
とする。※列数が一致している必要があります。

結果は、


```math
\begin{pmatrix}
1 & 2 & 3 \\
3 & 4 & 5 \\
9 & 10 & 11 \\
12 & 13 & 14 
\end{pmatrix}
```

となる

### 行列を列ベクトル（1列行列）にする。


```matlab
X = [1 2 3; 3 4 5 ; 5 6 7];
X(:)
```

とすることで、3ｘ3の行列を以下のように、列ベクトルに変換できる

結果

```math
\begin{pmatrix}
1 \\
3 \\
5 \\
2 \\
4 \\
6 \\
3 \\
5 \\
7 
\end{pmatrix}
```

### 行列を転置する。

```matlab
X = [1 2 3; 3 4 5 ; 5 6 7];
X'
```

結果

```math
\begin{pmatrix}
1 & 3 & 5 \\
2 & 4 & 6 \\
3 & 5 & 7 
\end{pmatrix}
```


## ディレクトリ操作

| 関数 | 機能 | 
|:---:|:---:|
| cd | ディレクトリ変更 |
| pwd | 現在位置表示 |
| ls | 現在位置のファイル一覧表示 |  |  |
|  |  |  |  |


## ファイル操作

### ファイル読み込み

```matlab
load filename.dat
```
上記のような読み取りを行うと、filename という変数にファイル内容が格納されている。

格納する変数名が異なる場合は、

```matlab
VarName = load('filename.dat')
```
とする。

### ファイル保存

```matlab
save filename.ext VarName -ascii
```

###


## その他関数

| 関数 | 機能 | 例 | 例の結果 |
|:---:|:---:|:---:|:---:|
| size(行列) | 行列のサイズを求める | size([1 2; 3 4; 5 6]) | [3 2] |
| size(行列,次元) | 行列の指定した次元の項目数を求める | size([1 2; 3 4; 5 6], 1) | 3 |
| length(ベクトル) | 指定したベクトル（1行だけ、1列だけの行列）の項目数を求める | size([1 2 3 4])  | 4 |
| log(行列 or スカラー) | 対数値を求める | log([1; 2; 3])  | [0.00000; 0.69315; 1.09861] |
| exp(行列 or スカラー) | 指数値を求める | exp([1; 2; 3])  | [2.7183; 7.3891; 20.0855] |
| abs(行列 or スカラー) | 絶対値を求める | abs([1; -2; -3])  | [1; 2; 3] |
| max(行列 or スカラー) | 最大値を求める | max([1; -2; -3])  | 1 |
| sum(行列) | 合算する。ベクトルでない場合は列単位で合算 | sum([1 -2 -3])  | -5 |
| prod(行列) | すべて掛け合わせる。ベクトルでない場合は列単位で掛け合わせ| prod([1 -2 -3])  | 6 |
| floor(行列) | 小数点切り下げ| floor([1.0 1.5 2.8])  | [1 1 2] |
| ciel(行列) | 小数点切り上げ| ciel([1.0 1.5 2.8])  | [1 2 3] |
| find(条件式) | 値を探す。戻り値は値の位置番号の行列 | find([1; -2; -3] > -3 )  | [ 1 ; 2] |
| who | 実行時点で保持されている変数一覧を表示する | who | X Y ans t w y1 |
| whos | whoの実行結果に加えて、行列のサイズ、Byteサイズ等を表示する | whos  | (省略) |
| clear | 保持されている変数を消去する | clear | (なし) |

max()については、

```matlab
[val , indicator] = max(A)
```
などとすることで、最大値と、行列内の位置を変数に格納することができる。

find については、

```matlab
[row , column] = find(A < 3)
```
などとすることで、条件に一致する行番号と列番号の行列を取得できる。