コンピュータプログラミングIII ベクトルと行列の演算 担当:村松 muramatsu@st.seikei.ac.jp
学習内容 MATLABプログラムを作成する際の 基礎となることを
覚える
練習しながら
覚える
慣れる
学習内容 ベクトルと行列を作る 有用な行列を作る 行列の演算 行列の成分に施す関数
MATLABをたちあげて
ベクトルと行列を作る ベクトルを作る(1) このベクトルを作るためにはどうすれば良い?
考える
思い出す
やってみる
すぐに
答えを
みない!
出来たら次へ!
ベクトルと行列を作る ベクトルを作る(2) 方法1 X=[1 2 3 4 5] 5個の成分をスペースで区切って1行5列の行列を作る 5個の成分をコンマ「,」で区切って1行5列の行列を作る 方法3 X=[1;2;3;4;5] 5個の成分をセミコロン「;」で区切り5行1列の行列を作り, X=X’ と行列の転置をとる演算子「.’」もしくは「’」を用いて 1行5列の行列にする. (あとで説明するが「’」は厳密には共役転置) 方法4 X=1:5
ベクトルと行列を作る 等差数列をなす成分をもつベクトル(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] 直接行列を書き上げる.行は「;」で区切る 4 5 6 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(3) ふつう,単位行列といえば正方行列であるが, 行と列を指定すると,単位行列を部分として 含む行列を作成でき, eye(行数,列数) のように書く A=eye(2,4) A=eye(4,2)
有用な行列を作る 対角行列 ベクトルXの各成分を対角成分とする 対角行列を作るには組み込み関数 diag(X) を用いる 有用な行列を作る 対角行列 ベクトル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) 有用な行列を作る 正規乱数を成分とする行列(1) 各成分が平均0,分散1の正規分布に 従う独立な乱数である正方行列作る には組み込み関数 randn(サイズ) を用いる A=randn(3) 正方でない正規乱数行列を作るには randn(行数,列数) のように行数と列数を指定し A=randn(2,3) スカラーの一様乱数を発生するには A=randn
有用な行列を作る 正規乱数を成分とする行列(2) 有用な行列を作る 正規乱数を成分とする行列(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]の,各成分の常用対数が等差数列 となるベクトルを作りたい場合 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) 演算記号「\」「/」を使う 一次方程式 をとく場合は これをMatlabでは A\B で解ける X=A\B ※「\」は「 」と同じ意味. A\B=A B(BをAで(左から)割る) つまり”A\”はAの逆行列を左からかけることを意味している
行列の演算 行列の割り算(2) 演算記号「\」「/」を使う 一次方程式 をとく場合は これをMatlabでは B/A で解ける 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)
行列の演算 内積 ベクトル の内積演算 を求めるには,組み込み関数dotを使う X=1:3, Y=3:-1:1, Z=dot(X,Y)
行列の演算 内積 行列のときは列ベクトルごとの内積を計算する 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’
行列Aの 転置は?
A.’
行列の 除算(左から)は?
\
行列の 除算(右から)は?
/
行列成分毎の 除算(右から)は?
./
行列成分毎の べき乗は?
.^
内積は?
dot()
あとは
自分で
復習
行列の成分に施す関数
行列の成分に施す関数 行列の成分毎に計算 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 問題3 問題4
演習問題 問題5 問題6 問題7