コンピュータプログラミングIII ベクトルと行列の演算

コンピュータプログラミングIII
ベクトルと行列の演算
担当:村松
[email protected]
学習内容
MATLABプログラムを作成する際の
基礎となることを
覚える
練習しながら
学習内容
ベクトルと行列を作る
有用な行列を作る
行列の演算
行列の成分に施す関数
MATLABをたちあげて
ベクトルと行列を作る
ベクトルを作る(1)
このベクトルを作るためにはどうすれば良い?
考える
思い出す
やってみる
すぐに
答えを
みない!
出来たら次へ!
ベクトルと行列を作る
ベクトルを作る(2)
方法1 X=[1 2 3 4 5]
5個の成分をスペースで区切って1行5列の行列を作る
方法2 X=[1,2,3,4,5]
5個の成分をコンマ「,」で区切って1行5列の行列を作る
方法3 X=[1;2;3;4;5]
5個の成分をセミコロン「;」で区切り5行1列の行列を作り,
X=X’
と行列の転置をとる演算子「.’」もしくは「’」を用いて
1行5列の行列にする.
(あとで説明するが「’」は厳密には共役転置)
方法4 X=1:5
ベクトルと行列を作る
等差数列をなす成分をもつベクトル(1)
ベクトル X  [ X1  X n ] の
成分が交差dの等差数列:
X 2  X1  d ,, X i  X1  (i 1)d ,, X n  X1  (n 1)d
は最初の値(X1),公差(d),最後の値(Xn)を用いて
X=X1:d:Xn
の形で書ける
ベクトルと行列を作る
等差数列をなす成分をもつベクトル(2)
例)
X=1:1:5 (公差1は省略でき,X=1:5ともかける)
X=1:0.25:2
X=5:-1:2
ベクトルと行列を作る
等差数列をなす成分をもつベクトル(練習問題)
練習1
練習2
練習3
ベクトルと行列を作る
行列を書く(1)
方法1 A=[1 2 3;4 5 6;7 8 9]
直接行列を書き上げる.行は「;」で区切る
方法2 A=[1 2 3
456
7 8 9]
二次元の形で改行を使って書く
方法3 X=1:3;Y=4:6;Z=7:9; A=[X;Y;Z]
ベクトルを作って,それを合わせて
行列を作る
※ベクトルの成分数は等しくないといけない
有用な行列を作る
零行列
作ってみる
有用な行列を作る
零行列
成分がすべて0の正方行列を作る組み込み関数
zeros(要素数)
を用いる
A=zeros(3)
正方行列ではない零行列を作るには,
行と列の数を指定し
zeros(行数,列数)
のように書く
A=zeros(2,3)
有用な行列を作る
1行列
成分がすべて1の正方行列を作る組み込み関数
ones(要素数)
を用いる
A=ones(3)
正方行列ではない零行列を作るには,
行と列の数を指定し
ones(行数,列数)
のように書く
A=ones(2,3)
有用な行列を作る
単位行列
単位行列を作る組み込み関数
eye(要素数)
を用いる
A=eye(3)
ふつう,単位行列といえば正方行列であるが,
行と列を指定すると,単位行列を部分として
含む行列を作成でき,
eye(行数,列数)
のように書く
A=eye(2,4)
A=eye(4,2)
有用な行列を作る
対角行列
ベクトルXの各成分を対角成分とする
対角行列を作るには組み込み関数
diag(X) を用いる
X=1:4, A=diag(X)
主対角線より上や下にベクトル成分を
配置した行列を作るには対角線より
上下を正負の整数で指定
diag(X,移動数)
のように書く
X=1:3, A=diag(X,1)
X=1:3, A=diag(X,2) 行列のサイズに注意!
X=1:3, A=diag(X,-1)
有用な行列を作る
一様乱数を成分とする行列
各成分が一様分布に独立に従う乱数で
ある正方行列作るには組み込み関数
rand(サイズ) を用いる
A=rand(3)
正方でない一様乱数行列を作るには
rand(行数,列数)
のように書く
A=rand(2,3)
スカラーの一様乱数を発生するには
A=rand
有用な行列を作る
正規乱数を成分とする行列(1)
各成分が平均0,分散1の正規分布に
従う独立な乱数である正方行列作る
には組み込み関数
randn(サイズ) を用いる
A=randn(3)
正方でない正規乱数行列を作るには
randn(行数,列数)
のように行数と列数を指定し
A=randn(2,3)
スカラーの一様乱数を発生するには
A=randn
有用な行列を作る
正規乱数を成分とする行列(2)
ある値xが平均0,分散1の正規分布に従うとき
vx+aは平均a,分散v2の正規分布に従う
これを利用すると,
平均はAvr=-1,分散がVar=2の正規分布からの乱数から
なる2行3列の行列は
randn(‘seed’,100); %種を設定
Avr=-1; Var=2;
A=sqrt(Var).*randn(2,3)+Avr
で求まる.
種を100に設定しているため,右の図と
同一の行列が作成されるはず
復習
3×3の
0行列は?
zeros(3)
3×3の
1行列は?
ones(3)
3×3の
単位行列は?
eye(3)
対角要素が
Xの行列は?
diag(X)
一様乱数を
成分とする
3×3行列は?
rand(3)
正規乱数を
成分とする
3×3行列は?
randn(3)
有用な行列を作る
乱数の種(1)
一様乱数randや正規乱数randnを発生する場合に,
乱数の種を設定してから作る場合がある.
実行して作成される行列をみてみよう
A=rand(2)
B=rand(2)
有用な行列を作る
乱数の種(2)
実行して作成される行列をみてみよう
rand(‘seed’,2012); A=rand(2)
rand(‘seed’,2012); B=rand(2)
rand(‘seed’,数字)
randn(‘seed’,数字) 乱数の種を設定できる
乱数の種を設定してから乱数を作成すると
同じ乱数列を作成することができる.
乱数の種を調べたい場合は
rand(‘seed’) %一様乱数の場合
randn(‘seed’) %正規乱数の場合
とすれば確認できる
有用な行列を作る
等間隔な成分をもつベクトル
成分が等差数列を成すベクトルX=[X1・・・Xn]を作りたい場合
linspace(最初の値,最後の値,成分数)
を用いる
X=linspace(0,1,5)
3番目の引数を省略すると,
成分数=100とみなされる.
X=linspace(0,1)
有用な行列を作る
成分の対数が等間隔になるベクトル
ベクトルX=[X1・・・Xn]の,各成分の常用対数が等差数列
log10 xk  (k 1)d  log10 x1 , k  1,...,n
となるベクトルを作りたい場合
logspace(log10最初の値,log10最後の値,成分数)
を用いる
X=logspace(1,4,4)
3番目の引数を省略すると,
成分数=50とみなされる.
X=logspace(0,10)
行列の演算
行列の演算
行列の加算と減算
加算:+ 減算:行列同士の加算,減算
A=[1 2 3;4 5 6]
B=[6 5 4;3 2 1]
C=A+B,D=A-B
スカラーを加えたり引いたりすると,
行列の各成分に対し加えたり
引いたりした結果が得られる
A=[1 2 3;4 5 6]; B=[6 5 4;3 2 1];
C=A+6,D=A-6
行列の演算
行列の乗算とスカラー倍
行列の掛け算は「*」を使う
A=[1 2 3;4 5 6], B=[6,5;4,3;2,1],
C=A*B
スカラーを行列に掛けるときも
「*」を使う
A=[1 2 3;4 5 6], B=-2*A
行列の演算
行列の成分ごとの演算(1)
2つの行列の成分同士を掛けたい場合, 演算記号「.*」を使う
A=[1 2 3;4 5 6], B=[4 5 6;1,2,3], C=A.*B
注意)AもBも2行3列の行列のため
C=A*Bの計算はエラーになる!
行列の演算
行列の成分ごとの演算(2)
2つの行列の成分同士の掛け算はふつうの線形台数ではあまり
見かけない.
しかし,この種の演算はシミュレーションなどの場面で役立つ!
スカラー倍の演算は「.*」を用いた方が安全.
A=[1 2 3;4 5 6],B=-2.*A
【確認】
A=[1 2;3 4],B=[2 3;4 5];
C=A*B
D=A.*B
行列の演算
行列の転置(1)
行列の転置には「’」か,
または「.’」を用いる
「’」: 共役転置
「.’」: 転置
A=[1+i, 2, 3+4i;4,5-2i,6]
B=A’,C=A.’
行列の演算
行列の転置(2)
また,転置を使うと,
行ベクトル⇒列ベクトル
列ベクトル⇒行ベクトル
の変換が簡単
X=[1 2 3], Y=X’,Z=Y’
行列の演算
行列の割り算(1)
演算記号「\」「/」を使う
一次方程式 AX  b
AX  b
をとく場合は
X  A 1b
これをMatlabでは
A\B
で解ける
A=[1 2 3;4 5 6;7 8 10];B=[1 2 3]’:
X=A\B
※「\」は「 」と同じ意味.
A\B=A B(BをAで(左から)割る)
つまり”A\”はAの逆行列を左からかけることを意味している
行列の演算
行列の割り算(2)
演算記号「\」「/」を使う
一次方程式 XA  b
AX  b
をとく場合は
X  bA1
これをMatlabでは
B/A
で解ける
A=[1 2 3;4 5 6;7 8 10];B=[1 2 3]:
X=B/A
※
B/A BをAで(右から)割る)
つまり”/A”はAの逆行列を右からかけることを意味している
行列の演算
行列の成分ごとの除算
演算記号「.\」「./」を使う
A=[1 2 3;4 5 6], B=[4 5 6;1 2 3],
C=A.\B, D=A./B
行列の演算
行列のべき乗(1)
正方行列を何回か掛けるには
演算記号「^」を使う
A=[1 2 3;4 5 6;7 8 9], B=A^3
これは
C=A*A*A
と同じ
行列の演算
行列の成分ごとのべき乗(1)
演算記号「.^」を使う
A=[1 2 3;4 5 6;7 8 9], B=A.^3
これは
C=A.*A.*A
と同じ
行列の演算
行列の成分ごとの関係演算
2つの数値に関する関係式は,次のような値をとる
X==Y:XとYが等しいとき1を,そうでないとき0をとる
X~=Y:XとYが等しくないとき1を,そうでないとき0をとる
X<Y:XがYより小さいとき1を,そうでないとき0をとる
X<=Y:XがY以下のとき1を,そうでないときき0をとる
X>Y:XがYより大きいとき1を,そうでないとき0をとる
X>=Y:XがY以上のとき1を,そうでないとき0をとる
行列の演算
行列の成分ごとの関係演算(2)
A=[0 1 0 2],B=[0 0 3 -2]
Cequal=(A==B)
Cnotequal=(A~=B)
Cless=(A<B)
Clessequal=(A<=B)
Cgreat=(A>B)
Cgreatequal=(A>=B)
行列の演算
内積
ベクトル X  [ X1, X 2 ,..., X n ]Y  [Y1, Y2 ,...,Yn ]
( X , Y )  X1Y1    X nYn
を求めるには,組み込み関数dotを使う
X=1:3, Y=3:-1:1, Z=dot(X,Y)
の内積演算
行列の演算
内積
行列のときは列ベクトルごとの内積を計算する
 a11 a12 a13 
b11 b12 b13 
A  a21 a22 a23  B  b21 b22 b23 
a31 a32 a33 
b31 b32 b33 
3
3
3
i 1
i 1
i 1
dot( A, B)  [ ai1bi1 , ai 2bi 2 , ai 3bi 3 ]
A=[1:3; 2:2:6; 3:3:9]
B=[3:-1:1;3:-1:1;3:-1:1]
Z=dot(X,Y)
確認
行列の
足し算は?
行列の
引き算は?
行列の
乗算は?
行列の
成分毎の
乗算は?
行列Aの
共役転置は?
行列Aの
転置は?
行列の
除算(左から)
は?
行列の
除算(右から)
は?
行列成分毎の
除算(右から)
は?
行列成分毎の
べき乗は?
内積は?
あとは
自分で
復習
行列の成分に施す関数
行列の成分に施す関数
行列の成分毎に計算
abs():絶対値
angle():位相角
sqrt():平方根
real():実部
imag():虚部
exp():指数関数
log():対数関数
log10():常用対数関数
三角関数:sin(),cos(),tan(),asin(),acos(),atan(),atan2(,)など
行列の成分に施す関数
A=[0:pi./3:pi; pi:pi./3:2.*pi; 2.*pi:pi./3:3.*pi]
B=sin(A),C=cos(A)
行列の成分に施す関数
A=logspace(1,4,4)
B=log10(A)
A=[1:3;4:6;7:9]
B=sqrt(A)
確認
ベクトルと行列を作れるようになった?
有用な行列を作ることができる?
行列の演算ができる?
行列の成分に関数をつかえる?
演習問題
問題1
問題2
問題4
問題3
演習問題
問題5
問題6
問題7