19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MATLAB-Sample 【基礎】行列操作

Last updated at Posted at 2014-03-18

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

> 
19
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?