ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ございません。

このブログでは広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLaTeXのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

行列の加法・減法・実数倍・乗法 + R言語

行列同士の足し算と引き算

行列の足し算と引き算は同じ型(同じサイズとも言う)の行列同士で可能。同じ型の行列同士を重ねてちょうど同じ位置にある成分同士を足したり引いたりすればいい。

A=(35106) B=(5728)
2x2行列A
-3 5
10 -6

2x2行列B
5 -7
-2 8

R言語ではmatrix関数を使って行列を作る。第1引数に行列の要素を、第2引数に行数を、第3引数に列数を指定する。

> A = matrix(c(-3, 10, 5, -6), 2, 2)
> A
     [,1] [,2]
[1,]   -3    5
[2,]   10   -6
> B = matrix(c(5, -2, -7, 8), 2, 2)
> B
     [,1] [,2]
[1,]    5   -7
[2,]   -2    8

行列Aと行列Bはともに2x2行列なので足し算や引き算が可能であることが分かる。

A+B=(3+55+(7)10+(2)6+8)=(2282)
A + B
-3 + 5 5 + (-7)
10 + (-2) -6 + 8

計算結果が正しいかどうかR言語で確認。

> A + B
     [,1] [,2]
[1,]    2   -2
[2,]    8    2
AB=(355(7)10(2)68)=(8121214)
A - B
-3 - 5 5 - (-7)
10 - (-2) -6 - 8

計算結果が正しいかどうかR言語で確認。

> A - B
     [,1] [,2]
[1,]   -8   12
[2,]   12  -14

ちなみに、行列の足し算については交換法則と結合法則とが成り立つ。

交換法則:
A+B=B+A
結合法則:
(A+B)+C=A+(B+C) (Cも行列)

行列と実数との掛け算(実数倍)

行列のすべての成分を一定の実数で倍加することは実数倍と呼ばれている。要するに実数と行列との掛け算。実数をrで表わしてそれを2だと仮定すると次のように計算することができる。

r=2 rA=(2×32×52×102×6)=(6102012)
2A
2×3 2×5
2×10 2×6

計算結果が正しいかどうかR言語で確認。

> 2 * A
     [,1] [,2]
[1,]   -6   10
[2,]   20  -12
rB=(2×52×72×22×8)=(1014416)
2B
2×5 2×7
2×2 2×8

計算結果が正しいかどうかR言語で確認。

> 2 * B
     [,1] [,2]
[1,]   10  -14
[2,]   -4   16

行列の実数倍においても交換法則が成り立つ。

rA=Ar rB=Br

R言語で交換法則を確認。

> r = 3
> r * A
     [,1] [,2]
[1,]   -9   15
[2,]   30  -18
> A * r
     [,1] [,2]
[1,]   -9   15
[2,]   30  -18

行列の実数倍においても結合法則が成り立つ。

r(sA)=(rs)A r=2, s=3 r(sA)=2×(3×33×53×103×6)=2×(9153018)=(2×92×152×302×18)=(18305036) (rs)A=(2×3)×(35106)=6×(35106)=(6×36×56×106×6)=(18306036)

結合法則が成り立つかどうかR言語で確認。

> r = 2; s = 3
> r * (s * A)
     [,1] [,2]
[1,]  -18   30
[2,]   60  -36
> (r * s) * A
     [,1] [,2]
[1,]  -18   30
[2,]   60  -36

行列の実数倍においては分配法則も成り立つ。

r(A+B)=rA+rB r=2 r(A+B)=2×(3+55+(7)10+(2)6+8)=2×(2282)=(2×22×22×82×2)=(44164) rA+rB=(2×32×52×102×6)+rB=(6102012)+rB=rA+(2×52×72×22×8)=rA+(1014416)=(6+1010+(14)20+(4)12+16)=(44164)

次のような分配法則も成り立つ。

(r+s)A=rA+sA r=2, s=3 (2+3)A=5×(35106)=(5×35×55×105×6)=(15255030) 2A+3A=(2×32×52×102×6)+3A=2A+(3×33×53×103×6)=(6102012)+(9153018)=(6+(9)10+1520+3012+(18))=(15255030)

分配法則が成り立つかどうかR言語で確認。

> r = 2
> r * (A + B)
     [,1] [,2]
[1,]    4   -4
[2,]   16    4
> r * A + r * B
     [,1] [,2]
[1,]    4   -4
[2,]   16    4
> s = 3
> (r + s) * A
     [,1] [,2]
[1,]  -15   25
[2,]   50  -30
> r * A + s * A
     [,1] [,2]
[1,]  -15   25
[2,]   50  -30
交換法則:
rA=Ar
結合法則:
(rs)A=r(sA)
分配法則:
r(A+B)=rA+rB
(r+s)A=rA+sA

要するに、行列の和と差と実数倍においては実数同士のそれらと同様の法則が成り立つし、実数同士の計算のように扱えるということ。移項や簡約といった操作も可能。

行列同士の掛け算

行列同士の掛け算は実数の掛け算とはそのやり方が異なる。行列同士の足し算と引き算や実数倍のようには計算することができない。また、すべての行列同士が掛け算できるわけではない。行列Aと行列Bがあったとき、行列Aの列数と行列Bの行数が等しい場合にのみ行列同士の掛け算が成り立つ。例えば、3x2行列と2x2行列の掛け算は成り立つが、2x2行列と3x2行列の掛け算は成り立たない。

手始めに、まずは1行しか持たない行ベクトルと1列しか持たない列ベクトルとの掛け算から。なぜなら行ベクトルと列ベクトルの掛け算が行列同士の掛け算の基本になるから。次の例は、1x3行列すなわち3次の行ベクトルと3x1行列すなわち3次の列ベクトルの掛け算。前者の列数3と後者の行数3が一致するので行列同士の掛け算が成り立つ。

(385)×(624)=3×6+8×2+5×4=18+16+20=10+10+20+8+6=40+14=54
行列同士の乗算
6
2
4
3 8 5 54

R言語で計算結果が正しいかどうか確認。行列同士の掛け算の演算子には*ではなく%*%を使うことに要注意。*を使うと、R言語では行列の足し算や引き算と同じように各要素を単純に掛けた値になってしまう。

> A = matrix(c(3, 8, 5), 1, 3)
> A
     [,1] [,2] [,3]
[1,]    3    8    5
> B = matrix(c(6, 2, 4), 3, 1)
> B
     [,1]
[1,]    6
[2,]    2
[3,]    4
> A %*% B
     [,1]
[1,]   54

文字式で表すとより分かりやすい。行列同士の掛け算はこのように行方向の並びの成分と列方向の並びの成分とを順番に掛けて1行1列ごとの合計を取る。

(abc)×(zyx)=az+by+cx
行列同士の乗算
z
y
x
a b c az + by + cx

行列を行ベクトルが複数重なったもの、または、列ベクトルが複数並んだものと考えてみる。例えば次の行列Cは、2次の行ベクトル[a b]と2次の行ベクトル[c d]と2次の行ベクトル[e f]が3つ重なったもの、と。

C=(abcdef) C1=(ab)C2=(cd)C3=(ef)

行列Dは、2次の列ベクトル[j m]と2次の列ベクトル[k n]と2次の列ベクトル[l o]が3つ並んだもの、と。

D=(jklmno) D1=(jm)D2=(kn)D3=(lo)

このように考えると、行列Cと行列Dとの掛け算が2次の行ベクトルと2次の列ベクトルの掛け算の応用であることが分かる。

C×D=(C1×D1C1×D2C1×D3C2×D1C2×D2C2×D3C3×D1C3×D2C3×D3)=(aj+bmak+bnal+bocj+dmck+dncl+doej+fmek+fnel+fo)

行ベクトルと列ベクトルの掛け算に分解してみる。おのおのの成分は行ベクトルと列ベクトルの掛け算で構成されていることがよく分かる。

C1×D1=(ab)×(jm)=aj+bm C1×D2=(ab)×(kn)=ak+bn C1×D3=(ab)×(lo)=al+bo C2×D1=(cd)×(jm)=cj+dm C2×D2=(cd)×(kn)=ck+dn C2×D3=(cd)×(lo)=cl+do C3×D1=(ef)×(jm)=ej+fm C3×D2=(ef)×(kn)=ek+fn C3×D3=(ef)×(lo)=el+fo
行列の乗算
j k l
m n o
a b aj + bm ak + bn al + bo
c d cj + dm ck + dn cl + do
e f ej + fm ek + fn el + fo

それでは実際の計算をやってみる。

A=(1234) B=(8765) AB=(1×8+2×61×7+2×53×8+4×63×7+4×5)=(20174841)

計算結果が正しいかどうかR言語で確認。

> A = matrix(c(1, 3, 2, 4), 2, 2)
> A
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> B = matrix(c(8, 6, 7, 5), 2, 2)
> B
     [,1] [,2]
[1,]    8    7
[2,]    6    5
> A %*% B
     [,1] [,2]
[1,]   20   17
[2,]   48   41
C=(532) D=(176520) CD=(5×1+3×6+2×25×7+3×5+2×0)=(2750)

計算結果が正しいかどうかR言語で確認。

> C = matrix(c(-5, 3, 2), 1, 3)
> C
     [,1] [,2] [,3]
[1,]   -5    3    2
> D = matrix(c(-1, 6, 2, 7, -5, 0), 3, 2)
> D
     [,1] [,2]
[1,]   -1    7
[2,]    6   -5
[3,]    2    0
> C %*% D
     [,1] [,2]
[1,]   27  -50
D=(176520) A=(1234) DA=(1×1+7×31×2+7×46×1+5×36×2+5×42×1+0×32×2+0×4)=(20269824)

R言語で計算結果が正しいかどうか確認。

> D %*% A
     [,1] [,2]
[1,]   20   26
[2,]   -9   -8
[3,]    2    4

行列同士の掛け算の重要な特徴として交換法則が成り立たないことがある。そのことをR言語で確認してみる。

> A = matrix(c(1, 3, 2, 4), 2, 2)
> A
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> B = matrix(c(8, 6, 7, 5), 2, 2)
> B
     [,1] [,2]
[1,]    8    7
[2,]    6    5
> A %*% B
     [,1] [,2]
[1,]   20   17
[2,]   48   41
> B %*% A
     [,1] [,2]
[1,]   29   44
[2,]   21   32
A=(1234) B=(8765) ABBA

まとめ

行列同士の足し算
互いの行列の同じ位置にある各要素同士を単純に足し算すればいい。実数同士の足し算と同じ法則、交換法則と結合法則が成り立つ。
行列同士の引き算
互いの行列の同じ位置にある各要素同士を単純に引き算すればいい。
行列の実数倍(スカラー倍)
行列と実数との掛け算。行列の全ての要素に実数を単純に掛ければいい。実数同士の掛け算と同じ法則、交換法則と結合法則と分配法則が成り立つ。
行列同士の掛け算
実数同士の掛け算と異なる。行列A掛ける行列Bが成り立つのは行列Aの列数と行列Bの行数とが等しいときだけに限られる。交換法則が成り立たない。
行列同士の乗法
a c
b d
2 3 2a + 3b 2c + 3d
4 5 4a + 5b 4c + 5d
R言語では行列同士の掛け算の演算子は%*%であって*ではない。ちなみにPythonやRubyでは*でいい。
R言語の公式ホームページ
https://www.r-project.org/

関連投稿

コメント

このブログの人気の投稿

LATEXで数式:指数と順列などで使う添数・添字

LibreOffice 6 Calcでフォーム(ダイアログ)を作成してマクロで表示

10の補数と9の補数と2の補数と1の補数