MATLAB-Sample 【基礎】行列操作

MATLABで「行列」を操作したい時のサンプルコード。


# 行列を定義したい
 次のような行列$A$をMATLABに登録する。

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

```matlab
> %行は項の羅列で表現し、複数行になるときには「;」で区切る
> A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ];
```

# MATLABの対話環境に定義した行列を見たい
前項のように、対話環境に対して定義した行列の内容を表示する。

```matlab
> %行列を定義した変数名を入力してEnterキーを押下する
> A

A =

 1 2 3
 4 5 6
 7 8 9

```

# 行列の要素同士を演算
次の２つの行列$A$、$B$について、

```math
A = \left(
\begin{array}{cc}
1 & 2 \\
3 & 4 \\
\end{array}
\right),\space
B = \left(
\begin{array}{cc}
5 & 6 \\
7 & 8 \\
\end{array}
\right)
```

行列$A$、$B$をの要素同士を演算した次のような行列$X_1$、$X_2$、$X_3$、$X_4$、$X_5$を求める。

```math
\begin{array}{cl}
加算 & X_1 = \left(
\begin{array}{cc}
1 + 5 & 2 + 6\\
3 + 7 & 4 + 8\\
\end{array}
\right) = \left(
\begin{array}{cc}
6 & 8 \\
10 & 12 \\
\end{array}
\right)\\
減算 & X_2 = \left(
\begin{array}{cc}
1 - 5 & 2 - 6\\
3 - 7 & 4 - 8\\
\end{array}
\right) = \left(
\begin{array}{cc}
-4 & -4 \\
-4 & -4 \\
\end{array}
\right)\\
乗算 & X_3 = \left(
\begin{array}{cc}
1 \times 5 & 2 \times 6\\
3 \times 7 & 4 \times 8\\
\end{array}
\right) = \left(
\begin{array}{cc}
5 & 12 \\
21 & 32 \\
\end{array}
\right)\\
除算 & X_4 = \left(
\begin{array}{cc}
1 \div 5 & 2 \div 6\\
3 \div 7 & 4 \div 8\\
\end{array}
\right) = \left(
\begin{array}{cc}
\frac{1}{5} & \frac{1}{3} \\
\frac{3}{7} & \frac{1}{2} \\
\end{array}
\right)\\
冪乗 & X_5 = \left(
\begin{array}{cc}
1^5 & 2^6\\
3^7 & 4^8\\
\end{array}
\right) = \left(
\begin{array}{cc}
1 & 64 \\
2187 & 65536 \\
\end{array}
\right)\\
\end{array}
```

```matlab
> %行列A,Bを定義
> A = [ 1 2 ; 3 4 ];
> B = [ 5 6 ; 7 8 ];
> %要素同士を足し算
> X1 = A + B;
> X1

X1 =

  6  8
 10 12

> %要素同士を引き算
> X2 = A - B;
> X2

X2 =

 -4 -4
 -4 -4

> %要素同士を掛け算
> X3 = A .* B;
> X3

X3 =

  5 12
 21 32

> %要素同士を割り算
> X4 = A ./ B;
> X4

X4 =

    0.2000    0.3333
    0.4286    0.5000

> %Aの要素を基数、Bの要素を指数とした冪乗
> X5 = A .^ B;
> X5

X5 =

     1    64
  2187 65536

```

# 行列の積
「行列の積」は、前項で記載した「同じ位置の要素同士」の積ではなく、次のような演算として数学的に定義されている。
一般式でも書いておくけれども、分かりにくいからすっ飛ばして「具体例」から読んでもOK。

### 一般式
行列$A$($m$行$n$列)、$B$($n$行$m$列) を、

```math
A = \left(
    \begin{array}{cccc}
      a_{11} & a_{12} & \ldots & a_{1n} \\
      a_{21} & a_{22} & \ldots & a_{2n} \\
      \vdots & \vdots & \ddots & \vdots \\
      a_{m1} & a_{m2} & \ldots & a_{mn}
    \end{array}
  \right)
,
B = \left(
    \begin{array}{cccc}
      b_{11} & b_{12} & \ldots & b_{1m} \\
      b_{21} & b_{22} & \ldots & b_{2m} \\
      \vdots & \vdots & \ddots & \vdots \\
      b_{n1} & b_{n2} & \ldots & a_{nm}
    \end{array}
  \right)
```

のように定義した場合、行列の積 $A \cdot B$ は次のように計算される。

```math
A \cdot B = \left(
\begin{array}{cc}
 \sum_{k=1}^n a_{1k} b_{k1} & \sum_{k=1}^n a_{1k} b_{k2} & \ldots & \sum_{k=1}^n a_{1k} b_{km} \\
 \sum_{k=1}^n a_{2k} b_{k1} & \sum_{k=1}^n a_{2k} b_{k2} & \ldots & \sum_{k=1}^n a_{2k} b_{km} \\
 \vdots & \vdots & \ddots & \vdots \\
 \sum_{k=1}^n a_{mk} b_{k1} & \sum_{k=1}^n a_{mk} b_{k2} & \ldots & \sum_{k=1}^n a_{mk} b_{km} \\
\end{array}
\right)
```
### 具体例
一般式は分かりにくいので具体例で説明する。MATLABでもその方が都合が良いので。

行列$A$、$B$を次のように定義する。

```math
A = \left(
\begin{array}{cc}
1 & 2 & 3\\
4 & 5 & 6 \\
\end{array}
\right)
,
B = \left(
\begin{array}{cc}
7 & 8 \\
9 & 10 \\
11 & 12 \\
\end{array}
\right)
```

行列$A$、$B$について行列の積を求めた場合は次のようになる。

```math
\begin{eqnarray*}
A \cdot B & = & \left(
\begin{array}{cc}
1 \times 7 + 2 \times 9 + 3 \times 11 & 1 \times 8 + 2 \times 10 + 3 \times 12 \\
4 \times 7 + 5 \times 9 + 6 \times 11 & 4 \times 8 + 5 \times 10 + 6 \times 12 \\
\end{array} \right) \\
& = & \left(
\begin{array}{cc}
58 & 64 \\
139 & 154 \\
\end{array}
\right)
\end{eqnarray*}
```

このように行列の積を求めたい場合は、MATLABでは次のように入力する。

```matlab
> %行列A,Bを定義
> A = [ 1 2 3 ; 4 5 6 ];
> B = [ 7 8 ; 9 10 ; 11 12 ];
> %行列の積
> X = A * B ;
> X

X =

  58  64
 139 154

```


# 行列を連結したい
次の２つの行列$A$、$B$について、

```math
A = \left(
\begin{array}{cc}
1 & 2 \\
3 & 4 \\
\end{array}
\right),\space
B = \left(
\begin{array}{cc}
5 & 6 \\
7 & 8 \\
\end{array}
\right)
```
行列$A$、$B$を縦、横に連結した行列Xを生成する。

```matlab
> %行列A,Bを定義
> A = [ 1 2 ; 3 4 ];
> B = [ 5 6 ; 7 8 ];
> %横に連結した行列Xを生成。
> X = [ A B ];
> X

X =

 1 2 5 6
 3 4 7 8

> %縦に連結した行列Yを生成。
> Y = [ A ; B ];
> Y

Y =

 1 2
 3 4
 5 6
 7 8 

```

# 転置（縦と横の要素を入れ替える）
 次の行列$A$の縦と横の要素を入れ替え、$A^T$のように変換する。

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

```matlab
> A = [ 1 2 3 ; 4 5 6 ];
> AT = A.';
> AT

AT =

 1 4
 2 5
 3 6 

```


# 行列から部分行列を抽出する
 次の行列$A$をベースに考える。

```math
A = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & 8 & 9 & 10 \\
11 & 12 & 13 & 14 & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right)
```
これに対し、次のように枠線で囲った数字を要素とする行列$B$を取得する。

```math
A = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{8} & \fbox{9} & 10 \\
11 & 12 & \fbox{13} & \fbox{14} & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right) \Longrightarrow
B = \left(
\begin{array}{cc}
8 & 9 \\
13 & 14 \\
\end{array}
\right)
```

表記方法は次のようになる。

```matlab
行列変数名(行開始位置:行終了位置, 列開始位置:列終了位置);
```

抽出したい要素は、2行目から3行目に掛けた、3列目から4列目までなので、

```matlab
A(2:3, 3:4)
```

という表記になる。では実験。

```matlab
> %まずは行列Aを定義
> A = [ 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15; 16 17 18 19 20 ];
> A

A =

  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15
 16 17 18 19 20 

> %行列Bとして部分行列を抽出
> B = A(2:3, 3:4)
> B

B =
  8  9
 13 14 

>
```

また、1行だけ、あるいは1列だけ抽出することも可能。
まずは次のように2行目（の第3列と第4列）のみを抽出したいパターン。

```math
A_1 = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{8} & \fbox{9} & 10 \\
11 & 12 & 13 & 14 & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right)
```
この場合、行は開始位置のみを指定する。こんな感じ。

```matlab
行列変数名(行開始位置, 列開始位置:列終了位置);
```

では実験。

```matlab
> A1 = A(2, 3:4)

A1 =
 8 9

> 
```

次に、3列目（の第2行と第3行）のみを抽出したいパターン。

```math
A_2 = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{8} & 9 & 10 \\
11 & 12 & \fbox{13} & 14 & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right)
```
この場合、列は開始位置のみを指定する。

```matlab
行列変数名(行開始位置:行終了位置, 列開始位置);
```

では同じように。


```matlab
> A2 = A(2:3,3)

A2 =
  8
 13 

> 
```

次のように要素を単独抽出する場合は、

```math
A_2 = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{8} & 9 & 10 \\
11 & 12 & 13 & 14 & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right)
```
行、列ともに開始位置しか指定しなければよい。

```matlab
> A3 = A(2, 3)

A3 =
 8

> 
```

最後。行列ともに全ての要素を抽出したい場合。

```math
A_4 = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
\fbox{6} & \fbox{7} & \fbox{8} & \fbox{9} & \fbox{10} \\
\fbox{11} & \fbox{12} & \fbox{13} & \fbox{14} & \fbox{15} \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right) \hspace{20pt}
A_5 = \left(
\begin{array}{ccccc}
1 & 2 & \fbox{3} & \fbox{4} & 5 \\
6 & 7 & \fbox{8} & \fbox{9} & 10 \\
11 & 12 & \fbox{13} & \fbox{14} & 15 \\
16 & 17 & \fbox{18} & \fbox{19} & 20 \\
\end{array}
\right)
```

次のように全ての要素を取り出したい行側または列側の引数で「:」のみを記述する。

```matlab
行列変数名(行開始位置:行終了位置, :);  %全ての列を抽出対象にしたい
行列変数名(:, 列開始位置:列終了位置);  %全ての行を抽出対象にしたい
```
では実験。

```matlab
> A4 = A(2:3, :)

A4 =
  6  7  8  9 10
 11 12 13 14 15 

> A5 = A(:, 3:4)

A5 =
  3  4
  8  9
 13 14
 18 19

```

# 行列の要素を変更する

対象としたい要素の指定は前項と同じように記述する。すなわちこれらのパターン。

```matlab
%部分行列を指定
行列変数名(行開始位置:行終了位置, 列開始位置:列終了位置);

%単独行を指定
行列変数名(行位置, 列開始位置:列終了位置);

%単独列を指定
行列変数名(行開始位置:行終了位置, 列位置);

%単独要素を指定
行列変数名(行位置, 列位置);

%全ての列を指定
行列変数名(行開始位置:行終了位置, :);

%全ての行を指定
行列変数名(:, 列開始位置:列終了位置);  

```

指定した要素、または部分行列に対し、サイズが合致するように値、または行列を代入すればOK。
部分行列と単独要素のみ実験。（全部やるのはちょっとシンドイ。。）

まずは部分行列から。

```math
A = \left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{8} & \fbox{9} & 10 \\
11 & 12 & \fbox{13} & \fbox{14} & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right) \Longrightarrow
\left(
\begin{array}{ccccc}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & \fbox{80} & \fbox{90} & 10 \\
11 & 12 & \fbox{130} & \fbox{140} & 15 \\
16 & 17 & 18 & 19 & 20 \\
\end{array}
\right) \Longrightarrow
```
枠線で囲った要素を10倍した要素に変更。

```matlab
> %まずは行列を定義
> A = [ 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15; 16 17 18 19 20 ];
> A

A =

  1  2  3　4  5
  6  7  8  9 10
 11 12 13 14 15
 16 17 18 19 20

> %2行目～3行目、かつ3列目～4列目を変更
> A(2:3,3:4) = [ 80 90; 130 140 ];
> A
A =
   1   2   3   4   5
   6   7  80  90  10
  11  12 130 140  15
  16  17  18  19  20
> 
```
次に単独要素の変更。

```math
A = \left(
\begin{array}{ccc}
1 & 2 & 3 \\
4 & \fbox{5} & 6 \\
7 & 8 & 9 \\
\end{array}
\right) \Longrightarrow
\left(
\begin{array}{ccc}
1 & 2 & 3 \\
4 & \fbox{50} & 6 \\
7 & 8 & 9 \\
\end{array}
\right)
```
対象は2行目2列目。値の$5$を、$50$に書き換えてみる。

```matlab
> %まずは行列を定義
> A = [ 1 2 3; 4 5 6; 7 8 9 ];
> A

A =

  1  2  3
  4  5  6
  7  8  9

> %2行目2列目を変更
> A(2,2) = 50;
> A

A =

  1  2  3
  4 50  6
  7  8  9

> 
```