□技術メモ - ベクトルと行列 ※管理人の個人的な技術メモです。 このページの内容は正確であることを保証しておりません。 このページではベクトルと行列に関する事について記述します。 ----------------------------------------------------------- http://3rd.geocities.jp/tnoguchislg/math/Math.txt 上記のページより議論を続けます。 -------- ○ベクトルと行列について ・スカラーが大きさのみを持つのに対して、 ベクトルは大きさだけではなく、方向も持つ量のことを言う。 これを抽象化して、要素を縦、または横に並べたものもベクトルと言う。 ・数や数式を行と列に沿って配したものを、行列という。 複数の縦ベクトルを横に並べたもの、もしくは 複数の横ベクトルを縦に並べたものも行列という。 -------- ○行列と行列式の表記 行列と行列式の記号は本来は正式なものを使いたいのですが、 このページでは以下の記述で代用します。 ・行列(matrix) mat|A B| |C D| ・行列式(determinant) det|A B| |C D| ※あくまでも本来の数学記号は、行列は( ) または[ ]、 行列式は | | で囲まれたものであることに注意して下さい。 -------- ○ゼロ行列(zero matrix) ・要素がすべて0である行列をゼロ行列という。 0 = mat|0 0| |0 0| -------- ○単位行列(unit matrix) ・対角成分がすべて1、それ以外が0の行列を単位行列という。 E = mat|1 0| |0 1| ・単位行列を掛けた行列は、元の行列と同じ行列になる。 AE = EA = A -------- ○転置行列(transposed matrix) ・要素の縦と横を入れ替えた行列を、転置行列といい、 X' または tX と表記する。 X = mat|a b c| |d e f| のとき、 |a d| tX = mat|b e| |c f| -------- ○逆行列 ・Aが正則行列のとき、逆行列A(-1) が存在し、以下が成立する。 A・A(-1) = A(-1)・A = E ・2×2行列の逆行列 A = mat|a b| |c d| の場合、 A(-1) = 1/(detA) * mat| d -b| |-c a| -------- ○余因子による逆行列の算出 Aの逆行列のij成分は Δij/detAになる。 Δijは余因子。 i列目、j行目を除いた行列の行列式に(-1)^(i+j)を掛けたもの。 ※4×4以上の行列で、筆算で余因子を使う方法は少々厳しい。 掃き出し法を使うのがおすすめ。 -------- ○掃き出し法による逆行列の算出 ・Aを単位行列に変換する1回以上の変形を、 単位行列に対しても同じ変換を実行することにより逆行列を求めることができる。 AとEを左右に並べることにより、これを同時に行う方法を掃き出し法という。 A = mat|1 2| |1 3| の場合は以下のようになる。 1 2|1 0 1 3|0 1 1段目を3倍、2段目を2倍する。 3 6|3 0 2 6|0 2 2段目を−1倍して、1段目に加算する。 1 0|3 -2 2 6|0 2 1段目を−2倍して、2段目に加算する。 1 0| 3 -2 0 6|-6 6 2段目に1/6を掛ける。 1 0| 3 -2 0 1|-1 1 したがって、 A(-1) = mat| 3 -2| |-1 1| 確認: A(-1)*A = mat|1 2| * mat| 3 -2| |1 3| |-1 1| = mat|3-2 -2+2| |3-3 -2+3| = mat|1 0| |0 1| ・掃き出し計算とは、単位行列化の計算のことを言う。 ・対角成分を軸(pivot)にして掃き出す方法を、ガウス・ジョルダン法という。 まず、対角成分をすべて1にすることから行えばよい。 -------- ○0と1で構成された行列の演算 ・単位行列、および0と1で構成された行列の演算について確認する。 変換結果をすぐにイメージできると便利なことが多い。 |1 0 0| |a| |a| mat|0 1 0| * mat|b| = mat|b| |0 0 1| |c| |c| |0 0 1| |a| |c| mat|0 1 0| * mat|b| = mat|b| |1 0 0| |c| |a| mat|0 1| * mat|a b| = mat|c d| |1 0| |c d| |a b| |1 1 1| |a| |a+b+c| mat|0 0 0| * mat|b| = mat|0 | |0 0 0| |c| |0 | |1 0 0| |a| |a| mat|1 0 0| * mat|b| = mat|a| |1 0 0| |c| |a| |1 1 1| |a| |a+b+c| mat|1 1 1| * mat|b| = mat|a+b+c| |1 1 1| |c| |a+b+c| -------- 〇平行移動、拡大、縮小、反転 ・平行移動 mat|x'| = mat|1 0 0 Dx|・mat|x| |y'| |0 1 0 Dy| |y| |z'| |0 0 1 Dz| |z| |1 | |0 0 0 1 | |1| ・拡大、縮小、反転 mat|x'| = mat|Rx 0 0 0|・mat|x| |y'| |0 Ry 0 0| |y| |z'| |0 0 Rz 0| |z| |1 | |0 0 0 1| |1| -------- ○行列の基本演算 ・和 2つの行列は、同じ型なら互いに加えることができる。 型が違う場合は和は定義されない。 ・スカラー倍 行列をスカラー倍したものは、行列の各要素をスカラー倍したものに等しい。 ・積 l×m 行列A と m×n 行列B の積は l×n 行列となる。 C=ABの、(i,j)成分Cijは以下の通り。 Cij = Σ(k=1→m) Aik・Bkj ・ブロック成分の積 行列が区分行列に分解されるとき、それらのブロックのサイズが適切なら、 ブロック成分ごとに積を計算することができる。 例として、以下の行列の積は、 左側の行列を2×2のブロック、右側の行列を1×2のブロックにすることにより、 ブロック成分ごとの計算をすることができる。 mat|a b 0 0| * mat|n 0| |c d 0 0| |m 0| |x y 1 0| |0 p| |z w 0 1| |0 q| = mat|A 0| * mat|N 0| |X E| |0 P| = mat|AN 0| |XN P| -------- ○行列の基本演算 その2 ・複数の行列の積 行列に対して、別の行列との積を求める場合は左側から掛ける。 行列Xに対して、A、B、Cを順番に掛けた結果の行列Yは以下となる。 Y = C・B・A・X ・行列の積は可換ではない(交換法則は成り立たない) 多くの場合、以下が成り立つ。(単位行列やゼロ行列などは除く) B・A ≠ A・B ・結合法則が成り立つ (A・B)・C = A・(B・C) ・分配法則が成り立つ (A+B)・C = A・C + B・C A・(B+C) = A・B + A・C -------- ○行列の基本変形 ・以下の6つの変形を行列の基本変形といい、掃き出し法で使うことができる。 行の変形 二つの行を入れ替える。 ある行を、0でない値で定数倍する。 ある行に、他の行の定数倍を加える。 列の変形 二つの列を入れ替える。 ある列を、0でない値で定数倍する。 ある列に、他の列の定数倍を加える。 ・基本行列 以下の正方行列を基本行列という。 基本行列を使うことで行列の基本変形を行うことができる。 P i,j は、単位行列の i行目と j行目を取り換えた行列 Q i,c は、単位行列の (i,i) 成分を c にした行列 R i,j,c は、単位行列の (i,j) 成分を c にした行列 ・基本行列を掛けることで、基本変形を適用することができる。 行についての変形 P i,j を左からかけると、i行と j行が交換される。 Q i,c を左からかけると、i行が c倍される。 R i,j,c を左からかけると、i行に j行の c倍が加わる。 列についての変形 P i,j を右からかけると、i列と j列が交換される。 Q i,c を右からかけると、i列が c倍される。 R i,j,c を右からかけると、j列に i列の c倍が加わる。 -------- ○2次元の回転行列 2次元の回転行列は以下の通り。 R(θ) = mat|cosθ -sinθ| |sinθ cosθ| mat|x'| = mat|cosθ -sinθ|・mat|x| |y'| |sinθ cosθ| |y| -------- ○3次元の回転行列 ・ここでは最終的には、座標(X1, Y2, Z3)に対して、 法線ベクトル vec(Xr, Yr, Zr)を中心として回転した座標を 算出することを目標とする。 ・作図のイメージとして、左下に原点、 右側にX軸の進行方向、右上にY軸の進行方向、上側にZ軸の進行方向 を想定する。 Xr, Yr, Zr は全て正とする。 法線ベクトルは、Z軸を初期状態として、Y軸方向にθx、X軸方向にθy、回転しているとする。 ・任意の法線ベクトルを中心とした回転を行うには、法線ベクトルをZ軸の進行方向に変換できればよい。 この状態で2次元の回転行列を適用して、再び元の法線ベクトルになるように逆変換を掛けてやればよい。 手順としては以下になる。 1. 法線ベクトル vec(Xr, Yr, Zr)を座標と捉えて、 座標(Xr, Yr, Zr)を、X軸を中心に、-θx 回転させて、Y=0の座標に変換する。 変換後の座標はXZ平面上に存在する。 2. 1で算出した座標に対して、Y軸を中心に、-θy 回転させて、X=0の座標に変換する。 1、2、の手順は逆でもよい。 最終的に変換後の座標はZ軸上に存在する。 3. 座標(X1, Y2, Z3)に対して、1、2、と同じ変換を行う。 4. 3の変換結果に対して、Z軸を中心に、角度θの回転を行う。 2次元の回転行列を適用すればよい。 5. 4の変換後の座標に対して、2の逆変換、1の逆変換を適用する。 変換後の値が求める座標となる。 -------- ○3次元の回転行列 その2 ・上記の手順を実現するには、XYZ軸それぞれを中心にした回転を実現できればよい。 XYZ軸、それぞれの回転について考える。 ・Z軸の進行方向から見たとき、横方向にX軸, 縦方向にY軸が存在する。 従って、Z軸の進行方法に視点を置いて、θz回転する変換は以下の通り。 mat|x'| = mat|cosθz -sinθz|・mat|x| |y'| |sinθz cosθz| |y| ・X軸の進行方向から見たとき、横方向にY軸, 縦方向にZ軸が存在する。 従って、X軸の進行方法に視点を置いて、θx回転する変換は以下の通り。 mat|y'| = mat|cosθx -sinθx|・mat|y| |z'| |sinθx cosθx| |z| ・Y軸については少々わかりにくい。 Y軸の進行方向から見たとき、上方向にZ軸, 左方向にX軸が存在する。 これを時計回りに90°回転すると、横方向にZ軸, 縦方向にX軸、回転角はθyとなる。 これをY軸の進行方向の逆側から見たとき、横方向にX軸, 縦方向にZ軸、回転角は-θyとなる。 従って、Y軸の進行方法に視点を置いて、θy回転する変換は以下の通り。 mat|x'| = mat| cosθy sinθy|・mat|x| |z'| |-sinθy cosθy| |z| ・上記を3×3の行列に変換すると以下になる。 |x'| = |1 0 0 | |x| mat|y'| = mat|0 cosθx -sinθx|・mat|y| |z'| |0 sinθx cosθx| |z| |x'| = | cosθy 0 sinθy| |x| mat|y'| = mat| 0 1 0 |・mat|y| |z'| |-sinθy 0 cosθy| |z| |x'| = |cosθz -sinθz 0 | |x| mat|y'| = mat|sinθz cosθz 0 |・mat|y| |z'| |0 0 1 | |z| -------- ※以下、行列について議論を続けます。 http://3rd.geocities.jp/tnoguchislg/math/Math3.txt に続く。