MATLABで「行列」を操作したい時のサンプルコード。
行列を定義したい
次のような行列$A$をMATLABに登録する。
A = \left(
\begin{array}{cc}
1 & 2 & 3\\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{array}
\right)
> %行は項の羅列で表現し、複数行になるときには「;」で区切る
> A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ];
MATLABの対話環境に定義した行列を見たい
前項のように、対話環境に対して定義した行列の内容を表示する。
> %行列を定義した変数名を入力してEnterキーを押下する
> A
A =
1 2 3
4 5 6
7 8 9
行列の要素同士を演算
次の2つの行列$A$、$B$について、
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$を求める。
\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}
> %行列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$列) を、
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$ は次のように計算される。
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$を次のように定義する。
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$について行列の積を求めた場合は次のようになる。
\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では次のように入力する。
> %行列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
行列を連結したい
次の2つの行列$A$、$B$について、
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を生成する。
> %行列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$のように変換する。
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)
> A = [ 1 2 3 ; 4 5 6 ];
> AT = A.';
> AT
AT =
1 4
2 5
3 6
行列から部分行列を抽出する
次の行列$A$をベースに考える。
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$を取得する。
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)
表記方法は次のようになる。
行列変数名(行開始位置:行終了位置, 列開始位置:列終了位置);
抽出したい要素は、2行目から3行目に掛けた、3列目から4列目までなので、
A(2:3, 3:4)
という表記になる。では実験。
> %まずは行列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列)のみを抽出したいパターン。
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)
この場合、行は開始位置のみを指定する。こんな感じ。
行列変数名(行開始位置, 列開始位置:列終了位置);
では実験。
> A1 = A(2, 3:4)
A1 =
8 9
>
次に、3列目(の第2行と第3行)のみを抽出したいパターン。
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)
この場合、列は開始位置のみを指定する。
行列変数名(行開始位置:行終了位置, 列開始位置);
では同じように。
> A2 = A(2:3,3)
A2 =
8
13
>
次のように要素を単独抽出する場合は、
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)
行、列ともに開始位置しか指定しなければよい。
> A3 = A(2, 3)
A3 =
8
>
最後。行列ともに全ての要素を抽出したい場合。
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)
次のように全ての要素を取り出したい行側または列側の引数で「:」のみを記述する。
行列変数名(行開始位置:行終了位置, :); %全ての列を抽出対象にしたい
行列変数名(:, 列開始位置:列終了位置); %全ての行を抽出対象にしたい
では実験。
> 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
行列の要素を変更する
対象としたい要素の指定は前項と同じように記述する。すなわちこれらのパターン。
%部分行列を指定
行列変数名(行開始位置:行終了位置, 列開始位置:列終了位置);
%単独行を指定
行列変数名(行位置, 列開始位置:列終了位置);
%単独列を指定
行列変数名(行開始位置:行終了位置, 列位置);
%単独要素を指定
行列変数名(行位置, 列位置);
%全ての列を指定
行列変数名(行開始位置:行終了位置, :);
%全ての行を指定
行列変数名(:, 列開始位置:列終了位置);
指定した要素、または部分行列に対し、サイズが合致するように値、または行列を代入すればOK。
部分行列と単独要素のみ実験。(全部やるのはちょっとシンドイ。。)
まずは部分行列から。
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倍した要素に変更。
> %まずは行列を定義
> 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
>
次に単独要素の変更。
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$に書き換えてみる。
> %まずは行列を定義
> 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
>