MATLABにおいて基本となるデータ構造は、行列(2次元配列)です。通常の数値や前回扱った1次元配列(数列、横ベクトル)も、次のコードから分かるように内部的には行列として扱われています。
x = 5
size(x)
y = [1,2,3,4,5]
size(y)
x = 5 ans = 1 1 y = 1 2 3 4 5 ans = 1 5
xは1×1行列、yは1×5行列であることが分かります。
3次元配列、4次元配列、…も使用可能ですが、使い方が複雑かつこの授業では必要ないため、説明は割愛します。
0から1までで間隔0.01の数列がMATLABで何×何行列として扱われるかを確認してください。
%演習1のコード
a = [1,2,3,4] %横ベクトル(カンマで区切る)
b = [1 2 3 4] %横ベクトル(半角スペースで区切る)
c = [1;2;3;4] %縦ベクトル(セミコロンで区切る)
a = 1 2 3 4 b = 1 2 3 4 c = 1 2 3 4
d = 1:8 %1から8まで増分1で並べた横ベクトル
e = 0:3:20 %0から20まで増分3で並べた横ベクトル
f = 20:-3:0 %20から0まで増分-3で並べた横ベクトル
d = 1 2 3 4 5 6 7 8 e = 0 3 6 9 12 15 18 f = 20 17 14 11 8 5 2
g = linspace(0,pi,10) %区間[0,π]内の等間隔の10個の点からなる横ベクトル
g = Columns 1 through 8: 0.00000 0.34907 0.69813 1.04720 1.39626 1.74533 2.09440 2.44346 Columns 9 and 10: 2.79253 3.14159
a:b:c
の書き方でlinspace(0,pi,10)
と同じベクトルを作成してください。
%演習2のコード
ベクトルの成分へのアクセスは、次のようにvector(index)
の形で行います。indexは0ではなく1から始まることに注意してください。
x = [1,3,5] %横ベクトルの場合
x(2) %第2成分の値を参照
x(3) = 7; %第3成分の値を変更
x
y = [2;4;6] %縦ベクトルの場合
y(2) %第2成分の値を参照
y(3) = 8; %第3成分の値を変更
y
x = 1 3 5 ans = 3 x = 1 3 7 y = 2 4 6 ans = 4 y = 2 4 8
ベクトルに対する演算には、行列としての演算と成分ごとの演算があります。これらの区別が必要な演算では、演算子の前にピリオドが必要です。ベクトルのサイズが適切でない場合はエラーになりますので、注意しましょう。
x = [1,2,3,4];
y = [5,6,7,8];
x+y %行列としての足し算 成分ごとの足し算でもある
x-y %行列としての引き算 成分ごとの引き算でもある
x+2 %サイズが合わないが、スカラーを各成分に足すと解釈される
x-2 %サイズが合わないが、スカラーを各成分から引くと解釈される
ans = 6 8 10 12 ans = -4 -4 -4 -4 ans = 3 4 5 6 ans = -1 0 1 2
x = [1,2,3,4];
y = [5,6,7,8];
z = [1;2;3;4];
x*y %行列としての掛け算 サイズが合わないのでエラー
x*z %サイズが合っているので、行列としての掛け算ができる
x.*y %成分ごとの掛け算
x*2 %サイズが合わないが、スカラーを各成分に掛けると解釈される
x^2 %行列としてのべき乗 サイズが合わないのでエラー
x.^2 %成分ごとのべき乗
error: operator *: nonconformant arguments (op1 is 1x4, op2 is 1x4) ans = 30 ans = 5 12 21 32 ans = 2 4 6 8 error: for x^y, only square matrix arguments are permitted and one argument must be scalar. Use .^ for elementwise power. ans = 1 4 9 16
x = [1,2,3,4];
y = [5,6,7,8];
x./y %成分ごとの割り算
x/2 %各成分をスカラーで割る
ans = 0.20000 0.33333 0.42857 0.50000 ans = 0.50000 1.00000 1.50000 2.00000
x = [1,2,3,4];
z = [1;2;3;4];
x' %行列としての転置
z'
ans = 1 2 3 4 ans = 1 2 3 4
ベクトルの1ノルム、2ノルム、無限大ノルムを次のようにして求めることができます。
x = [1,2,3];
norm(x,1) %1ノルム
norm(x) %2ノルム
norm(x,'Inf') %無限大ノルム
ans = 6 ans = 3.7417 ans = 3
A = [1,2,3;4,5,6;7,8,9] %行をセミコロンで区切る、各行の成分をカンマで区切る
B = [A,A] %ベクトルや行列を横や縦に並べて
C = [A;A] %新しい行列を作成できる
A = 1 2 3 4 5 6 7 8 9 B = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9 C = 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
行列の成分へのアクセスは、次のようにmatrix(i,j)
の形で行います。iとjは1から始まります。
A = [1,2,3,4;5,6,7,8;9,10,11,12]
display('Aの第2行、第3列の成分:')
A(2,3)
display('Aの第1,2行、第2,3列が成す部分行列:')
A(1:2,2:3)
display('Aの第1,3行、第1,4列が成す部分行列:')
A([1,3],[1,4])
A = 1 2 3 4 5 6 7 8 9 10 11 12 Aの第2行、第3列の成分: ans = 7 Aの第1,2行、第2,3列が成す部分行列: ans = 2 3 6 7 Aの第1,3行、第1,4列が成す部分行列: ans = 1 4 9 12
A(1:2,2:3) = 100; %Aの第1,2行、第2,3列の値を変更
A
A = 1 100 100 4 5 100 100 8 9 10 11 12
行列に対する演算は、ベクトルに対する演算と概ね同じです。
A = [1,2,;3,4];
B = [1,1];
C = [1;1];
A/B %xA=Bの解xを求める
A\C %Ax=Cの解xを求める
ans = 1.5000 3.5000 ans = -1 1
以下では、特殊な行列の作成方法を紹介します。
A = eye(5) %単位行列
A = Diagonal Matrix 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
A = zeros(5,5) %全ての成分が0の行列
A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A = ones(5,5) %全ての成分が1の行列
A = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
x = 1:5
A = diag(x) %xを対角成分として持つ行列
diag(A) %行列Aの対角成分
x = 1 2 3 4 5 A = Diagonal Matrix 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 ans = 1 2 3 4 5
以下の条件を満たす行列を作成してください。
%演習3のコード
演習1~演習3に取り組んでください。