MATLAB・Scilab参考資料2

2016.7.19
コンピュータ数学 MATLAB・Scilab の使い方
– 行列とベクトルの計算 –
本資料では,MATLAB,及び Scilab における行列・ベクトルの計算について説明します.MATLAB のコ
ンソールは >>,Scilab のコンソールは --> と表示されます.
また,計算した結果が 2.2204e-16 のように e を含んだ形で表示されることがありますが,これは
2.2204 × 10−16 を表しています.このような非常に小さい値は,0 とみなしてもらって構いません.
基本的な演算命令
1
1.1
演算子
MATLAB,Scilab では表 1 にある演算子を用いて,四則演算とべき乗を計
算できます.
表 1 MATLAB・Scilab
の演算子.
>> a = 1.4;
>> b = 3.5;
演算
演算子
>> a + b
加算
+
ans =
減算
-
乗算
*
除算
/
べき乗
^
4.9000
>> a - b
ans = -2.1000
>> a * b
ans =
4.9000
>> a / b
ans =
0.4000
>> a^2
ans =
1.2
1.9600
ベクトル・行列の定義と演算
ベクトルと行列の定義
1.2.1
MATLAB,Scilab ではベクトルと行列を簡単に定義することができます.例えば 3 次元ベクトル x として
 
1
x= 2 
3
を定義するには,
>> x = [1; 2; 3]
x =
1
2
3
1
と入力します.x の成分 1, 2 の後にセミコロン ; が入っていますが,これは改行を表しています.セミコロ
ンをつけないで入力すると,
>> x = [1 2 3]
x =
1
2
3
となり,x は 3 次元行ベクトルとして定義されます.
行列も同じように定義できます.例えば,3 行 3 列の行列

1
A= 4
7
2
5
8

3
6 
9
を定義するには,以下のように入力します.
>> A = [1 2 3; 4 5 6; 7 8 9]
A =
1
2
3
4
5
6
7
8
9
この行列は 1 行あたり 3 つの要素があるので,3 つの要素ごとにセミコロンをつけて改行します.
行列とベクトルの要素の参照方法
1.2.2
MATLAB,Scilab では,行列やベクトルの特定の要素を参照することができます.例えば上記の行列 A の
3 行 1 列目を参照したい場合は
>> A(3,1)
ans = 7
と入力すると,7 という要素が書き出されます.ベクトルの場合も同様に,
>> x(2)
ans = 2
で参照が可能です.x(2,1) としても同様の結果が得られます.
行列・ベクトルに関する演算
1.2.3
◦ 行列・ベクトルの加算と減算
行列・ベクトルでの加減算を行うには,2 つの行列・ベクトルの行数と列数は等しくなければいけません.
>> A = [1 2 3;4 5 6;7 8 9];
>> A = [1 2 3;4 5 6;7 8 9];
>> x = [1; 4; 6];
>> B = [1 3 5;7 9 2;4 6 8];
>> B = [1 3 5;7 9 2;4 6 8];
>> y = [1; 3; 5];
>> A + B
>> A - B
>> x + y
ans =
ans =
ans =
2
5
8
0
-1
-2
2
11
14
8
-3
-4
4
7
11
14
17
3
2
1
11
図1
行列の加算.
図2
行列の減算.
2
図3
ベクトルの加算.
◦ 行列とベクトルに関する乗算
行列の乗算 A * B の計算では,行列 A の列数と行列 B の行数が等しくないといけません.A または B がベ
クトルの場合も同様です.下記の一番右の例では,A の列数と B の行数が等しくないため,エラーメッセージ
が表示されています(Scilab では,エラーメッセージの内容が若干異なります).
>> A = [1 2 3;4 5 6;7 8 9]; >> A = [1 4 6; 2 7 9];
>> A = [1 2; 4 5; 7 8];
>> x = [3; 7; 5];
>> B = [1 3;5 6;7 8];
>> B = [1 3 5;7 9 2;4 6 8];
>> A * x
>> A * B
>> A * B
ans =
ans =
エラー:
32
63
75
77
100
120
*
内部行列の次元は一致しなければ
なりません。
122
図4
行列とベクトルの乗算.
図5
行列の乗算.
図6
行列の乗算が定義されない例.
◦ 行列のべき乗
行列でもスカラーと同じように,演算子^ を用いて行列のべき乗を計算することができます.但し,行列の
べき乗は行数と列数が等しい正方行列の場合に限ります.
>> A = [2 3 -1; 4 7 8;-5 9 6] >> A = [2 3 -1; 4 7 8;-5 9 6] >> A = [2 3 -1; 4 7 8;-5 9 6]
A =
>> A^2
>> A^3
ans =
ans =
2
3
-1
21
18
16
34
333
219
4
7
8
-4
133
100
24
1819
1668
-5
9
6
-4
102
113
-165
1719
1498
図7
行列 A.
図8
行列 A の 2 乗 (A2 ).
図9
行列 A の 3 乗 (A3 ).
◦ 行列の転置
行列を転置させたい場合は,変数の後に ’ をつけます.
>> A = [1 2 3; 4 5 6]
>> x = [1; 2; 3];
A =
>> y = [2; 5; 9];
1
2
3
4
5
6
>> x’ * y
ans =
>> A’
39
ans =
1
4
2
5
3
6
図 10 行列 A とその転置.
図 11 ベクトル x の転置とベクトル y の積(内積の計算).
3
数学で用いられる定数と関数
2
円周率 π は,MATLAB では pi,Scilab では %pi という変数で,あらかじめ登録されています.ですので,
円周率を自分で手入力する必要はありません.(もし円周率が登録されていない環境で円周率が必要になった
場合は,π = 4 arctan 1 という式を使って計算すると楽です.覚えておきましょう.)
数学で用いられる代表的な MATLAB,Scilab の組み込み関数を表 2 に示します.Mathematica と異なり,
MATLAB,Scilab の組み込み関数は 関数名は全て小文字で,カッコは (
) です.もしエラーが出た場
合は,カッコを確認してみましょう.
表 2 MATLAB・Scilab の組み込み関数.
関数
MATLAB・Scilab の組み込み関数
sin x
sin(x)
cos x
cos(x)
tan x
tan(x)
log x
log(x)
log10 x
log10(x)
x
exp(x)
e
√
x
sqrt(x)
arcsin x
asin(x)
arccos x
acos(x)
arctan x
atan(x)
|x| (x の絶対値)
abs(x)
行列に関する命令
3
3.1
値の代入などを行う命令
行列に値を代入する命令として,以下の命令が用意されています.
• zeros:全ての要素の値が 0 の行列を設定する命令
m = 2; n = 3;
A =
A = zeros(m,n)
=⇒
0
0
0
0
0
0
• ones:全ての要素の値が 1 の行列を設定する命令
m = 3; n = 2;
A =
A = ones(m,n)
=⇒
1
1
1
1
1
1
• eye:対角要素が 1,その他の要素が 0 の行列を設定する命令(正方行列でなくてもよい)
m = 3; n = 2;
A =
A = eye(m,n)
=⇒
1
0
0
1
0
0
4
• rand:行列要素を乱数で設定する命令
m = 2; n = 3;
A =
A = rand(m,n)
=⇒
0.7968
0.1588
0.8478
0.1138
0.3558
0.5828
• diag:対角要素だけを取り出す命令
m = 2; n = 3;
ans =
A = rand(m,n);
=⇒
diag(A)
3.2
0.7968
0.3558
行列に関する演算を行う命令
MATLAB,Scilab には,行列の行列式,階数,逆行列を計算したり,連立一次方程式を解く命令などが用
意されています.
• det:行列の行列式を求める命令(正方行列でなくてはいけません)
m = 3; n = 3;
ans =
A = rand(m,n);
=⇒
det(A)
-0.0994
• rank:行列の階数を求める命令
m = 50; n = 100;
ans =
A = rand(m,n);
=⇒
rank(A)
50
• inv:行列の逆行列を求める命令
A = [ 1 -1 0; -1 2 -1; 0 -1 2 ];
ans =
=⇒
X = inv(A);
3
2
1
X
2
2
1
A*X
1
1
1
1
0
0
0
1
0
0
0
1
ans =
• \(バックスラッシュ):連立一次方程式を解く命令
m = 3; n = 3;
x =
A = rand(m,n);
=⇒
-10.1395
b = rand(m,1);
x = A\b
norm(b-A*x)
3.7206
-0.3592
ans =
7.3277e-16
連立一次方程式 Ax = b を解いて x を求め,∥b − Ax∥2 を計算しています.誤差の影響でこの値は完
全に 0 にはなりませんが,十分に良い x が求められていることを示しています.7.3277e-16 が出力結
果として表示されていますが,これは 7.3277 × 10−16 を表しています.
【補足】Mac OS X 環境におけるバックスラッシュの入力について
Mac OS X 環境でバックスラッシュを入力するには,「option キー」を押しながら「Y
=キー」を押します.
5
グラフの描画
4
MATLAB, Scilab でグラフの描画するには plot 関数を利用します.ここでは例として,4 つの点 A(0, 0),
B(2, −1),C(4, 0),D(2, 1) を結んでできる菱形 ABCD を描画します.点 A, B, C, D の x 座標,y 座標を第
1 成分,第 2 成分にもつベクトル a, b, c, d をそれぞれ





 

0
2
4
2
a =  0  , b =  −1  , c =  0  , d =  1 
1
1
1
1
とします.菱形 ABCD を描画するには,以下のコードを実行します.MATLAB において,1 つのグラフに
複数の図形を描画するには hold on コマンドを実行します.Scilab では,最初から 1 つのグラフに複数の図
形を描画できる設定になっているので,このコマンドの実行は必要ありません.
¶
MATLAB・Scilab コード
³
0; 1 ];
% 点 A に対応するベクトル.
b = [ 2; -1; 1 ];
% 点 B に対応するベクトル.
c = [ 4;
0; 1 ];
% 点 C に対応するベクトル.
d = [ 2;
1; 1 ];
% 点 D に対応するベクトル.
a = [ 0;
X = [ a b c d a ];
% 点 A, B, C, D をまとめた行列.
plot( X(1,:), X(2,:) );
hold on;
% 菱形 ABCD の描画
% Scilab では不要.MATLAB で 1 つのグラフに複数の図形を描画するためのコマンド.
a1 = [ -2; -3; 1 ];
b1 = [
0; -4; 1 ];
c1 = [
2; -3; 1 ];
d1 = [
0; -2; 1 ];
X1 = [ a1 b1 c1 d1 a1 ];
plot( X1(1,:), X1(2,:) );
% 別の図形の描画
µ
´
1
0.5
0
−0.5
−1
−1.5
−2
−2.5
−3
−3.5
−4
−2
図 12 MATLAB で描画したグラフ.
−1.5
−1
−0.5
0
0.5
1
1.5
2
2.5
図 13 Scilab で描画したグラフ.
6
3
3.5
4