サイトトップ

Director Flash 書籍 業務内容 プロフィール

ActionScript 3.0 for 3D

□Math03 行列と座標変換

数値をテーブルのように縦横に並べたものが行列です。並べた数値は、一定の決まりにしたがってまとめて計算できます。つまり、行列は同じような計算を大量に行いたいときに使うと便利です。

私たちになじみ深い例は、フィルタでしょう。フィルタは予め決められたカラー演算を、画像のすべてのピクセルに対して適用します。また、2次元あるいは3次元空間における拡大・縮小や回転、移動といった座標変換も、行列の演算で表すことができます。本章では、おもに座標変換を扱う行列の基礎についてご説明します。


行列を使うと、数値がまとめて計算できる。

Tips Math03-001■行列を引数とするフィルタ
多くのフィルタは、行列演算を内部的に行います。したがって、フィルタを使うとき、とくに行列を気にする必要はありません。

けれども、行列を引数にとるフィルタもあります。たとえば、カラーマトリクスフィルタ(ColorMatrixFilter)やコンボリューション(畳み込み)フィルタ(ConvolutionFilter)です。前者は各カラーチャネル間の操作、後者は各ピクセルの周囲のピクセルとのカラー演算を行列で表し、それぞれのコンストラクタの引数として渡します。

もっとも、座標変換の場合(MatrixやMatrix3Dクラス)とは異なり、それらの行列を表すクラスは用意されていません。そのため、引数には行列の各行をひとつにつなげた配列(Arrayインスタンス)で渡します。

[*筆者用参考] 行列の数学「行列のスカラ倍と乗算」。


Math03-01 行列とは
行列」は、数を行と列からなる長方形に並べたものです。「行」が横、「列」は縦を示します。行と列の数は、いくつでも構いません。1行だけあるいは1列だけでも行列です。

行列のなかの数値ひとつひとつを、行列の「成分」または「要素」と呼びます。成分は行と列で特定され、変数で示すときには行と列の番号をその順番で添字にします。ひとつの行列は、成分すべてを括弧()または[]で括ります。

     

行列の大きさは、行×列で表します。上記の行列は、先頭から順に2×2行列、3×2行列、1×2行列、3×1行列です。行と列の数が等しい行列は、「正方行列」と呼ばれます。そのとき、行列数を次数として、たとえば上記第1番目の2×2行列は、2次正方行列と書表わすこともあります。

また、1行(上記第3番目)あるいは1列(上記第4番目)の行列は、ベクトルを行列として表したものと捉えられます。したがって、それぞれ行(横)ベクトルとか列(縦)ベクトルと呼ばれたりします。ActionScriptの座標変換では、列ベクトルが用いられます。

座標変換を扱うときにもっともよく使われるのは、正方行列と列ベクトルです。行列は、連立1次方程式を解くために考え出されました。連立方程式も、正方行列と列ベクトルを使って表せます。たとえば、つぎの2元連立1次方程式を考えてみましょう。xyが変数、abcdは係数で、pqは定数です。

ax + by = p
cx + dy = q

この連立1次方程式を行列で表すために、まず2次正方行列Aおよび2次元列ベクトルXとPを、つぎのように定めます。

, ,

行列は、ベクトルの拡張と捉えることもできます。ただし、ベクトルとひとつ大きく異なるのは、乗算が定められていることです(行列の計算については、次節以降に詳しく説明します)。上記2元連立1次方程式は、正方行列Aと列ベクトルXとの積AXを用いてつぎのように表せます。

AX = P

この連立1次方程式を解くというのは、列ベクトルXを求めることです。後でご説明するように、正方行列には逆行列というものが定められています。正方行列Aの逆行列はA-1と表し、上記の式から列ベクトルXがつぎのように導かれます。

X = A-1P

具体的な計算はさておき、連立1次方程式とその解がとても簡単な行列の式になることにご注目ください。実数aについてa-1というのは、aの逆数つまり1/aです。したがって、行列を使うと連立1次方程式が、あたかもつぎのような変数xの単純な1次方程式のように書表わせるのです。

ax = pのとき、x = p/a = a-1p (xとa、pはいずれも実数。ただし、a≠0とする)

しかも、連立1次方程式の変数の数はふたつと決まっていません。xyzの3変数になったら、正方行列と列ベクトルの次数をひとつ増やせばいいだけです。それでも、AX = Pという行列の式はまったく変わりません。

もっとも、式が簡単に書けることは、計算が楽になることを意味しません。行列の成分の数はもとの連立1次方程式の変数と係数および定数の数と変わらない訳ですから、計算の手間はほぼ同じといえます。筆者が高校の数学で行列を習ったときも、計算が面倒なので嫌いでした。

しかし、行列のよいところは、手間さえ惜しまなければ求める結果が機械的に計算できることです。授業では筆算させられましたが、今私たちの前には大量の機械的な計算を文句もいわずやってくれるコンピュータがあります。行列演算は、まさにコンピュータにうってつけの処理です。私たちは、ただ行列の成分を定め、計算式を立てるだけでよいのです。

[イラスト] 高校でも筆算止めて、コンピュータで3Dアニメーションやれば、行列も面白くなるのに。

Tips Math03-002■2元連立1次方程式の解
2元連立1次方程式は、行列を使わなくても、通常の式の変形や代入を使うだけでさほど手間なく解けるでしょう。本文と同じ、つぎの2元連立1次方程式の解を求めます。

ax + by = p
cx + dy = q

xとyはつぎのように導かれます。ただし、ad - bc≠0とします。

x = (pd - qb)/(ad - bc), y = (aq - cp)/(ad - bc)

後に述べるとおり、正方行列には行列式というものが定められます。2次正方行列Aの行列式は|A|で表し、つぎのようなスカラー値になります。

この行列式を用いると、xyはつぎの式で表せます。

,

Math03-02 行列のスカラー倍および和と差
行列はベクトルを拡張したものでした。ですから、共通の性質や計算規則も少なくありません。まず、行列のスカラー倍は、各成分にそのスカラー値を乗じます。たとえば、2次正方行列Aにスカラー値kを掛ける計算はつぎのとおりです。

乗じるスカラー値k = 0とすると、行列のすべての成分は0になります。すべての成分が0の行列はゼロ行列と呼ばれ、Oで表されます。

つぎに、ふたつの行列の足し算と引き算を行うには、互いの行と列の数がともに等しくなければなりません(正方行列でなくて構いません)。行列の足し算は、対応する成分をそれぞれ加えます。引き算は逆に、引かれる行列の成分から引く行列の対応する成分をそれぞれ差引きます。


Tips Math03-003■引き算を足し算にする
行列の引き算は引く方の行列にスカラー値-1を掛け、ふたつの行列を足すと考えても同じ結果になります。

A - B = A + (-1)B =

なお、ふたつのm×n行列の行と列の数が等しく、かつ対応する成分(つまり行列Aの成分amnと行列Bの成分bmn)すべてが等しいとき、ふたつの行列は等しいといいます。たとえば、以下のようにふたつの2次正方行列が等しいとすると、a11 = b11かつa12 = b12かつa21 = b21かつa22 = b22となります。

行列の演算は、もちろん一般にm×n行列に対して定義されています。ただ、m×n行列Aをつねに以下のように書くのは煩わしいです。そこで、第i行第j列の成分aijで代表させて、A = [aij]と表します。行列のスカラー倍と足し算・引き算およびO行列について、シンタックスMath03-001にまとめます。

シンタックスMath03-001■行列のスカラー倍と足し算・引き算およびO行列
行列のスカラー倍

行列A = [aij]にスカラーkを掛ける計算はつぎのとおり。

kA = [kaij]

行列のスカラー倍については、つぎの演算法則が成立つ。

(p + q)A = pA + qA
p(A + B) = pA + pB
p(qA) = (pq)A
行列の足し算と引き算

ふたつの行列A = [aij]とB = [bij]があるとき、その和A + Bと差A - Bはそれぞれつぎのように求められる。

A + B = [aij + bij]
A - B = [aij - bij]

行列の足し算については、つぎの演算法則が成立つ。なお、引き算A - Bは、A + (-1)Bと考える。

A + B = B + A
(A + B) + C = A + (B + C)
ゼロ行列

すべての成分が0の行列をゼロ行列と呼びOで表す。ゼロ行列Oは、任意の行列Aに対してつぎの式を成立たせる。

A + O = O + A = A

Math03-03 行列の積および単位行列と逆行列
行列のスカラー倍や足し算・引き算は、ベクトルと同じ要領で計算しました。行列では、さらに掛け算が定義されています。加減算は対応する成分同士を足し引きすればよかったのに対し、乗算のやり方は少し変わっています。


行列の積
座標変換を扱う行列では、掛け算が重要な役割を果たします。たびたび登場するのが、まず正方行列と列ベクトル、そしてつぎに正方行列同士の乗算です。先に正方行列と列ベクトルの掛け算から説明しましょう。2次正方行列と2次元列ベクトルの積は、2元連立1次方程式の行列表現で使われました(前述Math03-01「行列とは」)。

AX =

2次正方行列と2次元列ベクトルとの積は、2次元列ベクトルになります。第1に、掛けられる2次正方行列Aの第1行目の2成分(a, b)と、掛ける列べクトルXの(第1列の)2成分(x, y)とをそれぞれ掛合わせ、その和(ax + by)を結果となる積の列ベクトルの第1行(第1列)目の成分とします(図Math03-001左図)。

第2に、正方行列Aの第2行目の2成分(c, d)と、列べクトルXの(第1列の)2成分(x, y)とをそれぞれ掛合わせ、その和(cx + dy)を結果となる積の列ベクトルの第2行(第1列)目の成分とします(図Math03-001右図)。

図Math03-001■2次正方行列と2次元列ベクトルとの乗算
  
掛けられる正方行列Aの各行と掛ける列ベクトルXの列の成分をそれぞれ掛合わせて足し、結果となる積の列ベクトルの各行の成分とする。

掛けられる正方行列の各行の成分に対して、掛ける列ベクトルの成分をそれぞれ掛合わせて足し、結果となる積の列ベクトルの各行の成分としています。いわば横(行)と縦(列)の成分を掛け算して足し合わせる操作で、ややこしく感じるかもしれません。しかし、このような演算の決まりにしておく方が、変換を繰返す処理を考えたときに都合がよいのです。

ところで、今見たとおり加減算と異なり、乗算ではふたつの行列の大きさ(行列数)が同じでなくても構いません。けれども、掛け算ができるための条件はあります。乗じる行列の行と乗じられる行列の列の成分をそれぞれ掛合わせるには、掛けられる行列の列数と掛ける行列の行数が等しくなければなりません。

2次正方行列の列数は2で、2次元列ベクトルの行数も2ですので、ふたつの積を求めることはできます(図Math03-002左図)。しかし、掛合わせる順序を入替えると、列ベクトルの列数は1で2次正方行列の行数は2ですので、掛け算ができなくなります(Math03-002右図)。つまり、行列の乗算は交換法則が成立ちません。

図Math03-002■掛けられる行列の列数と掛ける行列の行数は等しくなければならない
  
掛けられる行列の列数と掛ける行列の行数が等しくなければ、行列の掛け算はできない。

つぎは、正方行列同士の乗算です。正方行列は行と列の数が同じですから、もちろん掛け算できます。そして、その積は、同じ次数の正方行列になります。つまり、正方行列は、いくつでも掛合わせられるということです。

また、ふたつの正方行列は、掛ける順序を変えて乗算することもできます。しかし、積の行列の成分は、掛ける順序が変われば値も変わります。行列は一般に交換法則が成立たないことにご注意ください。

AB≠BA   (AとBは正方行列とする)

いくつでも掛けられて、順序を変えると結果が変わるというと、フィルタが想い起こされるでしょう。フィルタのこの性質は、行列の乗算から受継いでいるのです(Tips 03-001「行列の乗算は順序によって結果が変わる」参照)。

具体的に、ふたつの2次正方行列同士の積は、つぎのように求められます。

a11   a12 b11   b12 = a11b11 + a12b21   a11b12 + a12b22
a21   a22 b21   b22 a21b11 + a22b21   a21b12 + a22b22

この計算は、後の掛合わせる正方行列を列に分けるとわかりやすいでしょう。まず、後の行列の第1列目を列べクトルと考えて、前の正方行列に乗じます。その掛合わせた結果が、積の行列の第1列目になります。

a11   a12 b11   b12 = a11b11 + a12b21   a11b12 + a12b22
a21   a22 b21   b22 a21b11 + a22b21   a21b12 + a22b22

つぎは、後の行列の第2列目を同じように列べクトルと見て、前の正方行列に乗じます。その掛合わせた結果を、今度は積の行列の第2列目とするのです。

a11   a12 b11   b12 = a11b11 + a12b21   a11b12 + a12b22
a21   a22 b21   b22 a21b11 + a22b21   a21b12 + a22b22

もっと分解してみましょう。さらに、前の掛けられる正方行列を行に分けます。すると、行ベクトルと列ベクトルの乗算と見ることができます。行ベクトルと列べクトルは、次数が同じであれば掛け算できます(ただし、順序が変わると計算できません)。前の掛けられる行列の第1行目と後の掛ける行列の第1列目を乗算した結果は、積の行列の第1行1列目の成分となります。

a11   a12 b11   b12 = a11b11 + a12b21   a11b12 + a12b22
a21   a22 b21   b22 a21b11 + a22b21   a21b12 + a22b22

この計算に見覚えはないでしょうか。ベクトルの内積です。ふたつのベクトルA1(a11, a12)とB1(b11, b21)の内積は、つぎのとおりでした。

A1・B1 = a11b11 + a12b21

この結果は、積の行列の第1行1列目の成分と同じです。残りの成分の計算もすべて、つぎのように掛けられる行列Aの行と掛ける行列Bの列との内積になっているのです。

AB = Aの1行目とBの1列目の内積   Aの1行目とBの2列目の内積
Aの2行目とBの1列目の内積   Aの2行目とBの2列目の内積

Tips Math03-004■掛けられる行列の行と掛ける行列の列で積の行列ができる
行列の乗算が行に列を90度回して掛けることは、違和感を覚えるかもしれません。行列の積が何を意味するのか、具体的な数字を当てはめて見てみましょう。たとえば、つぎのような2次正方行列同士の乗算を考えます。

100   200 100   60 = 100×100 + 200×50   100×60 + 200×60
60   40 50   60 60×100 + 40×50   60×60 + 40×60
= 20000   18000
8000   6000

ふたつの2次正方行列を、ハンバーガー店のある日のデータに見立てます。店はAとBのふたつあり、商品はハンバーガーとポテトです。掛けられる行列のデータは、商品1個当たりの売上と原価です(表Math03-001左表)。掛ける行列は、ふたつの店のそれぞれの商品の販売個数を示します(表Math03-001右表)。

表Math03-001■ハンバーガー店のある日のデータ
1個当たり ハンバーガー ポテト
売上 100円 200円
原価 80円 40円
販売数 A店 B店
ハンバーガー 100個 60個
ポテト 50個 60個

ふたつのデータを2次正方行列として乗算すると、表Math03-002のような店ごとの損益データができ上がります。まず、積の行列の行は、掛けられる行列の行である売上と原価を表します。つぎに、積の行列の列は、掛ける行列の列となるふたつの店を示しています。つまり、行列の掛け算は、掛けられる行列の行と掛ける行列の列からなる新たな行列をつくるのです。

表Math03-002■行列の積は損益データ
損益 A店 B店
売上 20000円 18000円
原価 8000円 6000円

ちなみに、ふたつの店の粗利益(売上総利益)は、ともに12,000円です。実際のハンバーガー店もハンバーガーは目玉商品で利幅は薄く、実はポテトで儲けるそうです。

[*筆者用参考] ここだけの話4「17【ハンバーガーのウラ】」、秒刊SUNDAY「マクドナルドの原価一覧表」。

それでは、一般のm×n行列A = [aij]とn×l行列B = [bij]との積ABをC = [cij]として、その成分cijを求めましょう。具体的な成分の計算を、徐々に一般化します。まず、Cの第1行1列目の成分c11は、つぎのAの第1行目とBの第1列目の内積です(Maniac! Math02-004「n次元ベクトルの内積」参照)。

c11 = a11b11 + a12b21 + … + a1nbn1

これを少し一般化して、Cの第1列目の各成分ci1として考えると、Aの各行i(1〜m)とBの第1列目の内積になります。

ci1 = ai1b11 + ai2b21 + … + ainbn1

そして、Cの第j列目の各成分cijは、Aの各行iとBの第j列目の内積ですので、つぎの式が導かれます。これが行列AとBの積AB = Cの第i行j列目の成分cijです。

cij = ai1b1j + ai2b2j + … + ainbnj

単位行列
単位行列」とは、左上から右下の対角成分が1で、他の成分はすべて0の正方行列をいいます。記号E(elementary)やI(identity)で表されることが多く、次数を明らかにしたいときはその数を添字にします。たとえば、つぎの正方行列は、左が2次単位行列E2で右が3次単位行列E3です。

E2 =
1   0
0   1
, E3 =
1   0   0
0   1   0
0   0   1

行列に単位行列を左から掛けても右から掛けても、もとの行列の成分は変わりません(もちろん、左の行列の列数と右の行列の行数は等しくなければ乗算できません)。つまり、任意の正方行列Aについて、つぎの式が成立ちます。

AE = A
EA = A

実数aに対する1と似た性質をもっているということです。

a×1 = 1×a = a

逆行列
正方行列Aに対して、その「逆行列」というものを考え、A-1で表します。逆行列は、つぎの式を満たします。

AA-1 = A-1A = E

これは、実数aで考えれば、その逆数1/a = a-1に当たります。

a×a-1 = a-1×a = a/a = 1

正方行列Aと列ベクトルXの積AX = X'が得られたとき、逆に列ベクトルX'からXを求めるのが逆行列A-1になります(Tips Math03-005「逆行列の乗算はいわば割り算」参照)。

X = A-1X'

Tips Math03-005■逆行列の乗算はいわば割り算
実数aに対して、a-1を掛けることは1/aの乗算であり、aによる割り算と同じ計算になります。正方行列Aの逆行列A-1による乗算も、いわば行列Aによる割り算に当たります。たとえば、以下の正方行列Aの乗算の式があるとします。

AX = X'

正方行列Aの逆行列A-1があるとして、式の両辺にA-1を左から掛けます。

A-1AX = A-1X'

すると、本文に述べた逆行列の定義と単位行列の性質から、この式の左辺はつぎのように変形できます。

(A-1A)X = EX = X

したがって、本文に示した式が成立ちます。

X = A-1X'

これは2次正方行列で考えるなら、前述Tips Math03-002「2元連立1次方程式の解」を求める計算にほかなりません。2次正方行列Aおよび2次元列ベクトルXとX'をつぎのように定めます。

A = a   b , X = x , X' = x'
c   d y y'

ここでAX = X'とすると、それはつぎの連立方程式を意味します。

ax + by = x'
cx + dy = y'

すると、前述Tips Math03-002「2元連立1次方程式の解」のとおり、xyはつぎの式で求められます。ただし、ad - bc≠0とします。

x = (x'd - y'b)/(ad - bc), y = (ay' - cx')/(ad - bc)
これらの式を改めて、列ベクトルXとX'および行列を使って表します。

X = 1
_______
(ad - bc)
dx' - by' = 1
_______
(ad - bc)
d   -b x' = 1
_______
(ad - bc)
d   -b X'
-cx' + ay' -c   a y' -c   a

したがって、2次正方行列Aの逆行列A-1は、つぎのとおりです。

A-1 = 1
_______
(ad - bc)
d   -b
-c   a

正方行列には「行列式」というスカラー値が定められます。正方行列Aの行列式は、|A|またはdet(A)で表します。そして、上記の2次正方行列Aの行列式|A|は、つぎの式で求められます。

上記2次正方行列Aの逆行列A-1は、Aの行列式|A|を使ってつぎのように表すこともできます。また、逆行列が存在するためには、|A|≠0でなければなりません(Tips Math03-006「得られた逆行列が定義を満たすことの確認」参照)。

A-1 = 1
___
|A|
d   -b
-c   a

Tips Math03-006■得られた逆行列が定義を満たすことの確認
本文では、2次正方行列Aの逆行列A-1により成立つべき式X = A-1X'から、A-1を求めました。厳密にはさらに、得られた逆行列A-1が、定義AA-1 = A-1A = Eを満たす必要があります。もっとも、実際にふたつの正方行列AとA-1の積を計算すれば、すぐに確かめられるでしょう。


行列の積と単位行列・逆行列の定義や性質
行列の積や単位行列と逆行列について、それらの定義や計算の性質をまとめましょう。その前に、一般のm×n行列を扱うときは、多くの成分を足し合わせることがあります。そこで、場合によって、総和の記号Σ(シグマ)を使います(Word Math03-001「Σ(Σ) − 総和の記号」参照)。たとえば、1からひとつずつ整数を増やして100までの合計は、Σを用いてつぎのように表せます。

100  
Σ k = 1 + 2 + … + 100
k = 1  

Σの下のk = 1がkの初項の値です。つまり、1から始めて、kを1ずつ増やしながら加え、Σの上に記した100までの和をとるという意味です。

Word Math03-001■Σ(Σ) − 総和の記号
整数の変数kに対して式(関数)f(k)が与えられたとき、kの値をmからnまでひとつずつ増やして加えた総和は、Σを用いてつぎのように表されます。

n  
Σ f(k) = f(m) + f(m + 1) + … + f(n)
k = m  

f(k) = kの場合つまり整数の総和については、1からnまでの合計がつぎの式で導かれます。したがって、本文で例に引いた1から100までの総和は5050になります。

n   n(n + 1)
_______
2
Σ k =
k = 1  

Tips Math03-007■Σはforステートメントで合計を求めるのと同じ
Σを使った総和は、初めは馴染みにくいかもしれません。けれども、ActionScriptのforステートメントで変数を加算する処理と、基本的に同じ考え方です。たとえば、つぎのように変数k = 1からnまで整数を合計するというのは、スクリプトMath03-001の計算に当たります。

n  
Σ k
k = 1  
スクリプトMath03-001■k = 1からnまで整数を加算する
    // フレームアクション
  1. var n:uint = 100;
  2. var summation:uint = 0;
  3. // k = 1からnまで1ずつ値を増やす
  4. for (var k:uint = 1; k <= n; k++) {
  5.   summation += k;   // kを加算
  6. }
  7. trace(summation);   // 出力: 5050

行列の積や単位行列と逆行列について、それらの定義および計算の性質をシンタックスMath03-002にまとめました。できるだけ行列数をかぎらない一般的なかたちで示してあります。しかし、単位行列や逆行列のように正方行列を前提とするものもあります。また、逆行列は次数が増えると複雑になるので、2次正方行列の結果のみを説明しました。

シンタックスMath03-002■行列の積と単位行列・逆行列の定義および性質
行列の積

m×n行列A = [aij]とn×l行列B = [bij]との積ABをC = [cij]とする。

AB = [aij][bij] = C = [cij]

このとき、行列Cの第i行j列目の成分cijは、Aの第i行目とBの第j列目の内積であり、つぎの式で示される(Maniac! Math02-004「n次元ベクトルの内積」参照)。

  n  
cij = Σ aikbkj
  k = 1  

したがって、m×n行列Aとn×l行列Bとの積ABは、つぎのようなm×l行列になる。

  n  
AB = [aij][bij] = [ Σ aikbkj]
  k = 1  

行列の積については、つぎの演算法則が成立つ。

(AB)C = A(BC)
A(B + C) = AB + AC
(A + B)C = AC + BC
p(AB) = (pA)B = A(pB)

なお、正方行列同士の乗算は、掛ける順序を入替えることができるものの、一般には交換法則が成立たない。

単位行列

単位行列は左上から右下の対角成分が1で、他の成分はすべて0の正方行列である。記号EまたはIで表し、次数を示すときは数を添字とする。n次単位行列をEn = [eij]とすると、その成分eijはつぎのようになる。

eij = 1   (i = j)
0   (i≠j)

任意の行列Aについて、単位行列Eはつぎの式を満たす。

AE = A
EA = A
逆行列

正方行列Aの逆行列はA-1で表し、つぎの式を満たす。ただし、正方行列について、つねに逆行列が存在するとはかぎらない。

AA-1 = A-1A = E

正方行列には行列式というスカラー値が定められており、正方行列のAの行列式は|A|またはdet(A)で表す。逆行列A-1が存在するためには、|A|≠0でなければならない。逆行列をもつことを「正則」あるいは「可逆」という(Word Math03-002「正則と可逆および特異」参照)。

ここでは、つぎの2次正方行列Aについて、行列式|A|と逆行列A-1を示す。

A = a   b
c   d

2次正方行列Aの行列式|A|は、つぎの式で表される。

2次正方行列Aについて、行列式|A|≠0のとき、逆行列A-1はつぎのように導かれる。

A-1 = 1
___
|A|
d   -b
-c   a

Word Math03-002■正則と可逆および特異
正方行列Aに逆行列A-1が存在するとき、Aは「正則」あるいは「可逆」だといいます。また、Aを「正則行列」と呼びます。Aが逆行列をもたない場合には、「特異」あるいは「不可逆」といいます。そして、その行列を「特異行列」と称することがあります。

[*筆者用参考]「行列・固有値問題の解法とその応用」、「Matrix#singular?は特異行列であることを判定しているか?


Maniac! Math03-001■[ヘルプ]の[Matrix3D]クラスにおける「反転」という用語
Flash CS4 Professionalの[ヘルプ]で[Matrix3D]クラスの説明を見ると、英語原文の"invert"を「反転」と訳し、「反転マトリックス」といった表記があります。"invert"とは逆行列を求めることです。したがって、用語は次表Math02-003のように読替えた方がよいでしょう。

表Math02-003■[ヘルプ]の[Matrix3D]クラスにおける「反転」の語の読替え
[ヘルプ]の訳語 読替えの用語 使われているおもな項目
反転可能 可逆 determinant、rawData、invert()
反転されたマトリックス
反転マトリックス
マトリックスの反転
逆行列 determinant、invert()
反転できないマトリックス 不可逆行列 rawData
マトリックスを反転 逆行列を作成 invert()
マトリックスが正常に反転された 逆行列が作成できた invert()

Math03-04 伸縮と回転の座標変換を行う行列
ここからは、行列一般ではなく、座標変換のお話しです。そこで、おもに2次元平面を基本に考えることとし、必要に応じて3次元空間についても触れます。

行列による位置ベクトルの変換
つぎのような2次正方行列Aおよびふたつの2次元列ベクトルXとX'を採上げます。

A = a   b , X = x , X' = x'
c   d y y'

これらの行列についてつぎの式が成立つとします。そして、ふたつの列べクトルXとX'は、2次元平面の位置ベクトルを表すものと捉えます。

AX = X'

すると、位置ベクトルXの表す座標(x, y)が、2次平方行列Aにより位置ベクトルX'の座標(x', y')に変換されたと見ることができます。

a   b x = x'
c   d y y'

そのように捉えれば、2次正方行列Aの逆行列A-1が存在するとき、A-1は行列Aによって変換された位置ベクトルX'をもとの位置ベクトルXに戻す変換になります。

A-1X' = X

また、単位行列Eによる変換は、掛合わせた列べクトルXの成分を変えません。つまり、座標はそのままということです。

EX = X

伸縮の変換
行列を用いた座標の変換で基本となるのは、伸縮と回転です。まずは、伸縮から考えます。列べクトルXをスカラーk倍するには、対角成分がkで他の成分は0の正方行列を掛合わせます。

k   0 x = kx = k x
0   k y ky y

列べクトルをスカラー倍すると、原点からの位置ベクトルの座標値がその比率にしたがって伸縮します。たとえば、矩形の4角の位置ベクトルを2倍すれば、その各座標値が2倍になり、矩形の1辺もそれに合わせて2倍に拡大します(面積は1辺の2乗で4倍になります)。

下図Math03-003は、正方形の4角の座標をそれぞれ(20, 70)、(70, 70)、(70, 20)、(20, 20)として、位置ベクトルを2倍にしました。拡大された正方形の座標値は、それぞれ(40, 140)、(140, 140)、(140, 40)、(40, 40)になります。各座標の原点からの距離とともに、1辺の長さも50(= 70 - 20)から100(= 140 - 40)と2倍になります。

図Math03-003■原点を中心に位置ベクトルがスカラー倍になる
正方形の4角の位置ベクトルを2倍にすると、原点からの距離とともに、1辺の長さも2倍に伸びる。

Tips Math03-008■スカラー倍は単位行列とスカラーの積を乗じる
単位行列Eは任意の行列Aに対して、A = EAの式を満たします(シンタックスMath03-002)。したがって、列ベクトルのスカラー倍は、つぎのようにスカラー倍した単位行列を乗じると考えることもできます。

k x = k 1   0 x = k   0 x
y 0   1 y 0   k y

乗じる2次正方行列の対角成分ふたつを異なった値にすると、x軸方向とy軸方向とで位置ベクトルを伸縮する比率が変わります。

kx   0 x = kxx
0   ky y kyy

たとえば、前掲図Math03-003と同じ正方形の4角の位置ベクトル(20, 70)、(70, 70)、(70, 20)、(20, 20)に第1行1列目成分が2で第2行2列目成分1.5の2次正方行列を左から乗じると、それぞれの位置ベクトルは下図Math03-004のようにx軸方向が2倍でy軸方向は1.5倍に伸びます。スカラー倍とは異なり、変換された位置ベクトルはもとのベクトルとは方向が変わります。

2   0 x
0   1.5 y
図Math03-004■位置ベクトルのxy座標に異なった比率を乗じる
x軸方向とy軸方向とは、異なった比率で伸縮する。

つぎに、3次元空間における位置ベクトルの伸縮を考えてみましょう。位置ベクトルが3次元になりますので、乗じるのは3次正方行列とします。そして、位置ベクトルのz座標と掛合わされる対角成分に、伸縮の比率を設定します。

kx   0   0 x = kxx
0   ky   0 y kyy
0   0   kz z kzz

位置ベクトルを2次元平面と3次元空間とでそれぞれ伸縮する正方行列を、つぎのシンタックスMath03-003にまとめました。

シンタックスMath03-003■伸縮の行列
位置ベクトルの伸縮

2次元平面で位置ベクトル(x, y)のxy座標を伸縮するには、つぎのような2次正方行列を乗じる。

kx   0 x = kxx
0   ky y kyy

3次元空間における位置ベクトル(x, y, z)を伸縮する3次正方行列は、同じように対角成分にその比率を設定する。

kx   0   0 x = kxx
0   ky   0 y kyy
0   0   kz z kzz

回転の変換
まず、2次元平面における回転です。Math01「三角関数」でご説明したように、任意の座標(x, y)を原点で角度θ回転した座標(x', y')は、つぎの式で表されます(シンタックスMath01-012)。

x' = x cosθ - y sinθ
y' = x sinθ + y cosθ

この式を2次正方行列と2次元の列ベクトルで示すと、つぎのようになります。この回転を表す正方行列は、「回転行列」と呼ばれます。

cosθ   -sinθ x = x'
sinθ   cosθ y y'

つぎに、3次元空間における回転は、予め何らかのかたちで中心軸を定めます。本章では、基本となるxyzの各軸による回転を考えましょう(Tips Math03-009「任意の軸による回転」参照)。

Tips Math03-009■任意の軸による回転
数学的には、任意の軸をベクトルで指定して回転することもできます。ただ、少しばかり込入ったベクトルと行列の計算が必要になります。そのため、本書では扱いません。

もっとも、ActionScriptとしては、前述Column 04「3次元座標空間における回転について」の「軸角度による回転」でご紹介したとおり、Matrix3D.prependRotation()およびMatrix3D.appendRotation()メソッドの第2引数に任意の軸をVector3Dインスタンスにより指定することができます。

上記の2次元平面における回転は、3次元空間で見れば、z軸を中心に回していることになります。つまり、z座標は変えることなく、xy平面で位置ベクトルを回転します。z軸による3次元空間の回転行列は、以下のとおりです。2次元平面における回転行列に、第3行目と第3列目が加わっています。これらは、z座標の値が変わらず、またその値がxy座標値に影響を与えないように定められています。

cosθ   -sinθ   0 x = x cosθ - y sinθ
sinθ   cosθ   0 y x sinθ + y cosθ
0   0   1 z z

列べクトルの成分を変えない正方行列とは、単位行列のことでした。つまり、上記のz軸による3次元空間の回転行列は、3次単位行列に2次元平面の回転行列を組込んだものと捉えることもできます。

cosθ   -sinθ
組込む
1   0   0
sinθ   cosθ 0   1   0
            0   0   1
                         

そう考えると、他の軸による回転行列も簡単に求められます。2次元平面の回転行列を、1行下かつ1列右にずらして、3次単位行列に組込めば、x座標値は変えずに(y, z)座標を角度θ回す、つぎのようなx軸による3次元空間の回転行列になります。

1   0   0 x = x
0   cosθ   -sinθ y y cosθ - z sinθ
0   sinθ   cosθ z y sinθ + z cosθ

上記のx軸による回転行列から、さらに1行1列ずつ2次元平面の回転行列の成分を3次単位行列のうえでずらせば、残るy軸の回転行列が得られます。もっとも、下の行と右の行が3次単位行列の外にはみ出てしまいます。これらは、つぎのように第1行目と第1列目にいわばスクロールさせます。

1   0   0
左上に
スクロール
cosθ   0   sinθ
0   1   0 0   1   0
0   0   cosθ -sinθ -sinθ   0   cosθ
sinθ cosθ

このようにして得られた3次正方行列が、y軸で(z, x)座標を角度θ回す3次元空間の回転行列となります。

cosθ   0   sinθ x = z sinθ + x cosθ
0   1   0 y y
-sinθ   0   cosθ z z cosθ - x sinθ

2次元平面の原点を中心とした回転行列と3次元空間におけるxyzの各座標軸で回す回転行列を、つぎのシンタックスMath03-004にまとめました。

シンタックスMath03-004■回転行列
位置ベクトルの回転

2次元平面で位置ベクトル(x, y)のxy座標を原点で角度θ回すには、つぎのような2次正方行列を乗じる。

cosθ   -sinθ x = x cosθ - y sinθ
sinθ   cosθ y x sinθ + y cosθ

3次元空間における位置ベクトル(x, y, z)は、中心軸を定めて回転する。xyzの各座標軸で座標を回すには、3次元の列べクトルにそれぞれつぎのような3次正方行列を乗じる。

【z軸による回転】
cosθ   -sinθ   0 x = x cosθ - y sinθ
sinθ   cosθ   0 y x sinθ + y cosθ
0   0   1 z z
【x軸による回転】
1   0   0 x = x
0   cosθ   -sinθ y y cosθ - z sinθ
0   sinθ   cosθ z y sinθ + z cosθ
【y軸による回転】
cosθ   0   sinθ x = z sinθ + x cosθ
0   1   0 y y
-sinθ   0   cosθ z z cosθ - x sinθ

Math03-05 線形変換とアフィン変換
前節Math03-04「伸縮と回転の座標変換を行う行列」でご紹介した伸縮と回転の座標変換は、一般に「線形変換」または「一次変換」と呼ばれる性質をもちます。この節では、線形変換の意義と性質をご説明し、さらに機能が加わった「アフィン変換」について解説します。


線形変換(一次変換)
前述の伸縮や回転などの変換は、組合わせられます。たとえば、伸縮と回転の正方行列を、それぞれSとRとします。すると、列べクトルXを伸縮Sして回転Rした変換後の列ベクトルX'は、つぎのように行列の積を使って表せます。

RSX = X'

行列の乗算には、交換法則が成立ちませんでした(シンタックスMath03-002)。したがって、列べクトルXを回転Rしてから伸縮Sした以下の列べクトルX"は、上記の列ベクトルX'とは必ずしも同じになりません。

SRX = X"

なお、掛合わせる列ベクトルに近い正方行列の変換から順に行われます。つまり、列べクトルXについて、これを伸縮Sしてから回転RしたのがベクトルX'です。逆に、回転Rしてから伸縮Sすると、ベクトルX"になります。もっとも、乗算の順序を変えなければ、計算は前からやっても、後からやっても積は同じです(シンタックスMath03-002)。

(RS)X = R(SX) = X'

よって、ふたつの正方行列RとSの積の正方行列をA = RSとし、列べクトルXを伸縮Sした変換後のベクトルがP = SXだとすれば、上記の式はつぎのように書替えることもできます。つまり、ふたつの正方行列の積Aを予め求めて列べクトルXと乗じても、隣の正方行列Sの変換を加えた後の列べクトルPにつぎの正方行列Rを掛合わせても、変換の結果X'は変わらないということです。

RSX = AX = RP = X'

座標変換を組合わせると、Flashの[自由変形ツール]のように位置ベクトルの座標を変えることができます(図Math03-005)。このような座標変換を「線形変換」または「一次変換」といいます。ただし、線形変換では、原点は動かせません。[自由変形ツール]でいえば、変形点が基準点に固定されているような状態です。

図Math03-005■[自由変形ツール]で座標を動かす
線形変換は、[自由変形ツール]で変形点が固定された状態。

線形変換の幾何学的な性質としては、3つ挙げられます。第1に、上述のとおり原点は動きません。つまり、座標変換は原点を中心に行われます。第2に、直線は変換した後も直線です。第3に、平行な直線をともに変換すると、変換後もやはり平行が保たれます。

    【線形変換の性質】
  1. 原点は動かない。
  2. 直線は直線のまま。
  3. 平行な2直線は平行のまま。

[*筆者用参考]「行列 : 数学」、『プログラミングのための線形代数』p.26。

線形変換は、数学では抽象的に関数または写像として、以下のシンタックスMath03-005のように定められます。数学の「関数」とは、ひとつの値に対して、ただひとつの値を定める決まりのことです(Word Math03-003「関数」参照)。値xにyを対応させる関数fは、つぎのように表されます。

y = f(x)

線形変換では値はベクトルですので、ActionScriptのつぎのような関数f()をイメージすればよいでしょう。この関数f()の戻り値が、yに当たります。

function f(x:Vector3D):Vector3D

関数をさらに抽象化して定義したのが「写像」です(Word Math03-004「写像」参照)。つまり、関数は写像のひとつです。

シンタックスMath03-005■線形変換(一次変換)
線形変換

線形変換fは、ベクトルをベクトルに対応させる。任意のふたつのベクトルをXおよびYとし、任意のスカラー(実数)をkとするとき、つぎのふたつの性質を満たす。

  1. f(X + Y) = f(X) + f(Y)
  2. kf(X) = f(kX)

[*筆者用参考]『高校数学+α』p.242、『実例で学ぶゲーム3D数学』p.117。


Word Math03-003■関数
関数」とは、ひとつの変数xが与えられたとき、対応するただひとつの変数yを定める決まりのことです。関数をfとすると、つぎの式で表されます。

y = f(x)

なお、xが「独立変数」、yは「従属変数」と呼ばれます。

[*筆者用参考] Wikipedia「関数 (数学)


Word Math03-004■写像
写像」とは、ふたつの集合について、ひとつの集合の要素(「」といいます)xが与えられたとき、もうひとつの集合から対応するただひとつの要素yを定める決まりのことです(ふたつの集合は同じであっても構いません)。写像をfとすると、つぎのように表されます。

f:x → y

写像の典型は関数ですので、関数と同じように書表わすこともあります。

y = f(x)

[*筆者用参考]「集合と写像」、Wikipedia「写像」、Wikipedia「線形写像」。

これまで述べた行列による座標変換は、変換するための正方行列をA、変換される列べクトルはXで示すと、つぎのような関数(写像)fとして表すことができます。

f(X) = AX

すると、シンタックスMath03-002に述べた「行列の積」の演算法則により、線形変換のふたつの性質を満たすことが確かめられます。任意のふたつのベクトルをXおよびYとし、任意のスカラーをkとします。

  1. f(X + Y) = A(X + Y) = AX + AY = f(X) + f(Y)
  2. kf(X) = kAX = A(kX) = f(kX)

したがって、この座標変換は線形変換です。

Maniac! Math03-002■線形変換では原点は動かせない
線形変換では、原点のベクトルOはつねにOに変換されます。つまり、原点は動かせません。

f(O) = O

線形変換の定義(シンタックスMath03-005)にしたがって確かめましょう。仮に、原点のベクトルOが原点OでないベクトルPに変換できたとします。

f(O) = P (ただし、P≠O)

すると、つぎの等式が導かれます。

kf(O) = kP

つぎに、線形変換(シンタックスMath03-005)の性質から、つぎの等式が成立たなければなりません。

kf(O) = f(kO)

ところで、ゼロベクトル(行列)O(シンタックスMath03-001)は、任意のスカラーkについてkO = Oになります(成分すべてが0なので)。これはつぎの等式を意味します。

f(kO) = f(O)

ところが前述の仮定では、この式の右辺はf(O) = Pとしたのに、左辺はf(kO) = kPとなり、P≠Oであるかぎり両辺が等しくなりません。この矛盾を解くには、P = Oとするしかないのです。


アフィン変換
線形変換に平行移動を加えたのが「アフィン変換」です。つまり、線形変換とは異なり、原点が動かせるようになります。2次元平面で平行移動を加えるためには、つぎのようにその移動するベクトルのxy座標(tx, ty)を変換の行列の第3列目に加え、列べクトルには第3行目の成分に定数1を置きます。なお、成分のbとcの位置は、Matrixクラスの行列(シンタックス03-003)と合わせました。

a c tx
b d ty
x
y
1
=
ax + cy + tx
bx + dy + ty

これで、2次正方行列で2次元列ベクトルを変換した座標(ax + by, bx + dy)に、移動分のxy座標(tx, ty)が加わりました。けれども、2×3行列では、複数の変換を乗算で合成することができません。

そこで、変換の行列に第3行目を加えて、3次正方行列にします。加えた成分が変換に余分な影響を与えないように、3次単位行列の第3行目を組込んでシンタックスMath03-006のように定めます。これで、複数の正方行列を乗じて変換が合成できます。また、変換した後の列ベクトルの第3行(第1列)目成分は、つねに1となります。3次元空間のアフィン変換も、同じように定められます。

シンタックスMath03-006■アフィン変換
アフィン変換

アフィン変換は、線形変換に平行移動を組合わせたものである。平行移動を0にすれば線形変換なので、線形変換はアフィン変換に含まれる。

2次元平面のアフィン変換は、3次正方行列と3次元列べクトルを用いて、つぎの式で表される。

a   c   tx x
b   d   ty y
0   0   1 1

同じように、3次元空間のアフィン変換は、4次正方行列と4次元列ベクトルにより、つぎの式で示される。

a11   a12   a13   tx x
a21   a22   a23   ty y
a31   a32   a33   tz z
0   0   0   1 1

[*筆者用参考] デジタル用語辞典「アフィン変換」、「アフィン変換」、Q-pedia「アフィン変換」。

アフィン変換であれば、任意の点を中心に座標を変換できます。その任意の中心点を原点Oに平行移動する変換が正方行列T、加えたい変換は正方行列Aだとすれば、列べクトルXに対してつぎのような乗算を行えばよいからです。

T-1ATX

この変換は、列ベクトルXを行列Tにより中心点が原点Oに重なるよう平行移動した後、中心点と一致した原点で行列Aの変換を行ったうえ、Tの逆行列T-1で中心点をもとの位置に戻すことになります。なお、アフィン変換でも、線形変換と同じつぎのふたつの幾何学的な性質は保たれます。

    【アフィン変換の性質】
  1. 直線は直線のまま。
  2. 平行な2直線は平行のまま。

転置行列
参考書やサイトで行列による座標変換を調べていると、行列とベクトルとの乗算の順序が逆になっていることがあります。ただし、そのとき位置ベクトルは行ベクトルで表されます。したがって、正方行列と掛合わせることができ、その積は行ベクトルになります。

x y
a b
c d
=
ax + cy bx + dy

それだけでなく、列べクトルと乗じた正方行列と比べて、行と列の成分が入替わっていることにご注意ください(上の式と下の式の正方行列は、成分のbとcが入替わっています)。考えてみると、列ベクトルの行と列の成分を入替えれば、行ベクトルになります。

a c
b d
x
y
=
ax + cy
bx + dy

行列Aの行と列の成分を入替えた行列は「転置行列」と呼び、ATで表します。すると、上記ふたつの式の行列には、つぎのような関係が成立っています。

x
y
T =
x y
,  
a c
b d
T =
a b
c d

正方行列と列べクトルとの積AX = X'とすると、両辺を転置すれば(AX)T = X'Tです。そして、シンタックスMath03-007に示すとおり、(AX)T = XTATとなります。したがって、つぎの等式が成立つのです。

XTAT = X'T

つまり、行ベクトルに正方行列を乗じた座標変換も、正方行列と列ベクトルの積と同じ内容の変換を表します。ただし、そうした解説を読むときには、行と列の成分が入替わっていることに注意しなければなりません。

シンタックスMath03-007■転置行列
転置行列

任意の行列A = [aij]の行と列の成分を入替えた行列は「転置行列」と呼び、ATで表す。その成分は、つぎの式で示される。

AT = [aji]

転置行列については、つぎの演算法則が成立つ。

(AT)T = A
(AB)T = BTAT

[Prev/Next]


作成者: 野中文雄
作成日: 2010年3月29日


Copyright © 2001-2010 Fumio Nonaka.  All rights reserved.