行列の作り方

はじめに

最初にも述べたようにに、MATLABでは変数は全て行列データとして表現されます。
本稿では変数への行列の代入、および行列の加工方法について解説します。

スクリプトファイルを新規に作成し、適当な名前で保存して下さい(test.mなどでOK)。
以下、このmファイルにプログラムを記述し、実行して行って下さい。

値を代入して行列を作る

数値の代入
mファイルに下記のコードを記入し、実行して下さい。

A = 10;
B = 20;
C = A + B

C = 30 という結果が出力されたと思います。
AおよびBという名前の変数に数値を代入し、Cという変数にこれらの和を代入しています。

コードの三行目で、行末にセミコロン(;記号)が付いていないことに注意して下さい。
セミコロンを付けるとコマンドウィンドウに結果が出力されないため、計算結果を確認したい三行目のみ
セミコロンを付けないようにしています。
全ての行からセミコロンを取り除く、あるいは全ての行にセミコロンを付けるとどうなるか、試してみて下さい。

行列(ベクトル)の代入
mファイルに下記のコードを記入し、実行して下さい。

A = [1 2 3];
B = [2 3 0];
C = A + B

変数に行列を代入するには、行列の要素を[ ]で囲んで定義し、各要素(数値)の間にスペースを空けます。
他言語の経験がある人だと、数値の区切りにスペースではなくコンマを使いたくなるかもしれません。
そのような記法も可能です。すなわち、

A = [1, 2, 3];
B = [2,3,0];
C = A + B

などと書いても全く同じ意味になります。
ただ、MATLABの場合にはコンマ区切りではなくスペース区切りで書く方が普通のようです。

二次元行列の代入
mファイルに下記のコードを記入し、実行して下さい。

A = [1 2 3; 4 5 6] % 2行3列の行列
B = [1 1 1; 2 2 2; 3 3 3] % 3行3列の行列

複数の行がある行列を代入するには、各行末にセミコロンを付けます。

%記号を用いることでコード内にコメントを加えることが出来ます。
%以降から行末までの内容はプログラム実行時には無視されるため、ここにコメントを自由に記入できます。

数列の代入
コロン(:)を用いることで、数列を定義できます。

A = 25:-5:0
B = 0:3:10
C = 1:5 % C = 1:1:5 と同じ意味

「開始値:差分:終了値」という意味です。
Aの場合、25で始まり、-5ずつ変化し、0まで行く、という数列となります。
Bの場合は、0から3ずつ増えて、終了値10に最も近い値である9が最後の数値になります。
Cは、差分値を省略した書き方です。差分値が1の場合は、これを省略することが出来ます。

複素行列の代入
下記のようにして複素行列を定義できます。

C = [1+2i 1-2i; 5+i 5-2i]

関数を利用して行列を作る

値を手入力する以外にも、関数を使って行列を定義することができます。

zeros()
全ての要素が0であるような行列(零行列)を作成する関数です。

A = zeros(3); % 3x3行の零行列
B = zeros(2, 3); % 2x3の零行列

ones()
全ての要素が1であるような行列を作成する関数です。

A = ones(3); % 3x3行の行列
B = ones(2, 3); % 2x3の行列

rand()
各要素がランダムな0から1の範囲の値になります。

A = rand(3); % 3x3行のランダム行列
B = rand(2, 3); % 2x3のランダム行列
C = rand(1); % ランダムな数値を1つ欲しい時はこのように使う

diag, eye, linspace, logspace, magic
その他にもいくつかの便利な関数があります。詳しくは検索して下さい。

行列を組み合わせる

複数の行列を組み合わせることで新たな行列を作成できます。

ベクトルの連結
二つのベクトルA, BからベクトルCを作ります。

A = 1:3;
B = 5:7;
C = [A B]

ベクトルから行列を作る
二つのベクトルA, Bから行列Cを作ります。

A = 1:3;
B = 5:7;
C = [A; B]

行列に行を追加する
行列AにBという行を追加し、行列Cを作ります。

A = ones(3);
B = [3 4 5];
C = [A; B]

行列に列を追加する
行列AにBという列を追加し、行列Cを作ります。

A = ones(3);
B = [3; 4; 5];
C = [A B]

行列から行列を作る

A = [1 2; 3 4];
A = [A zeros(2); zeros(2) ones(2)]
B = [1 2; 3 4];
B = [B zeros(2); zeros(2,3) ones(2,1)]

これは少し複雑かもしれません。
まず、自己代入という方法に慣れて下さい。
A = [1 2];
A = [A 3 4 5]; % 自己代入(Aに自分自身を代入)
このようにすると、Aは[1 2 3 4 5]となります。
これの二次元行列版が上記の例です。

行列の加工

行列を加工する様々な方法について。

行列の要素を置換する
行列Aの(2,1)要素(2行目-1列目の要素)を別の値(2)に置き換えます。

A = ones(2);
A(2, 1) = 2

行列に要素を追加する
行列Aの(2,4)要素(2行目-4列目の要素)に2を代入します。

A = ones(2);
A(2, 4) = 2

Aは元々2×2の行列であり、(2,4)要素は存在しません。
そこに値を代入された時、Aは自動的に2×4の行列に拡張されます。
(2,4)要素は2となり、それ以外の要素は0で埋められます。

行列をベクトルに変換する
4×3行列であるAをベクトルにします。

A = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
B = A(:)

転置行列を作る
’記号を使うことで行列を転置(行と列を入れ替える操作)ができます。

A = [1 2 3; 4 5 6];
A = A'
B = [1 2 3 4];
B = B'

行列のサイズを変更する
reshape関数を使って行列のサイズを変更できます。

A1 = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
A2 = reshape(A1, 2, 6) % A1を 2x6 の行列に変更する
A3 = reshape(A1, 1, 12) % A1を 1x12 の行列に変更する
B1 = 1:6;
B2 = reshape(B1, 2, 3) % 2x3の行列に変更する

行列から行または列を取り除く
コロンと空行列を使って行列から特定の行や列を削除できます

A = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
A(:, 2) = [] % Aの2列目を削除
A = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
A([1 4], :) = [] % Aの1行目と4行目を削除

行または列を逆順にする
コロンと空行列を使って行列から特定の行や列を削除できます

A1 = 1:5;
A2 = A1(5:-1:1) % A1の5番目の要素から1番目の要素まで-1ずつ要素番号を移動しながらA2に代入

B1 = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
B2 = B1(:, 3:-1:1) % 全ての行について、列を逆順にする
B3 = B1(4:-1:1, :) % 全ての列について、行を逆順にする

C1 = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
C2 = fliplr(C1) % 
C3 = flipud(C2) % 

D1 = [1 2 3; 4 5 6; 7 8 9; 0 0 0];
D2 = flipdim(D1,2) % 
D3 = flipdim(D1,1) % 

diag, rot90, triu, tril
その他にも行列を加工するための様々な関数があります。詳しくは検索して下さい。

コメント