本稿は、線形代数を独学でやり直し勉強した時のメモです。せっかくなのでアウトプットしようと思って書き始めました。詳しくは第1回の説明をご参照ください。
今回と次回くらいで、行列の基本についての説明を書こうと思います。まずは、行列の計算についての基本を押さえ、その後、行列の意味についての説明をしたいと思います。行列の掛け算は添え字がたくさん出てきて見る気を失せる方もいらっしゃるかもしれませんが、是非「4.5 行列演算(掛け算)のまとめ」だけでも理解し、使えるようになっていただければ、今後の行列演算がかなり楽になると思います。
#1. 行列の定義
まずは、なにはともあれ、行列の定義です。ご存知のかたも多いと思いますが、サイズ$m \times n$の行列は$m\times n$個の数字や変数を以下のように並べたものとして定義されます。
A =
\left(
\begin{matrix}
a_{11} & a_{12} & \cdots & a_{1n} \\\
a_{21} & a_{22} & \cdots & a_{2n} \\\
\vdots & & \ddots &\\\
a_{m1} & a_{m2} & \cdots & a_{mn}
\end{matrix}
\right)
上記行列は、$A=(a_{ij})$と書くこともあります。
ここで、超基本的な注意点を2点ほど。
1. 添え字が出てきて難しそうに思ってしまうかたもいらっしゃるかもしれません(私も、添え字を見ると、読む気をなくすほうです)。ただ、まず、お伝えしたいのは、**添え字は難しいものではないのです。ただ、面倒なだけなのです。**よく考えると、単に、変数に番号が振ってあるだけですよね。なにも難しい基本知識が必要なわけではないのです。ただ、小さい字が並んでいるので面倒なだけなのです。ですので、心得として、添え字を見てもひるまずに、果敢に攻めて行かなければダメなのです。
2. 添え字の順番も最初はなかなか混同すると思います。$a_{ij}$は$i$行目の$j$列です。**これは、データベースやテキストファイルと同じ構造と覚えておけば覚えやすいです。**これらのデータを見るとき、まずは、何行目のデータかを考え、その後、その行のどのカラムのデータかを考えますよね。それと同じです。ですので、行を表す添え字が先に来ているのです。
- 行列の例(2x2の場合):
あげるまでもないかもしれませんが、一応、$2 \times 2$の行列の例をあげておきます。($2 \times 2$だったら高校でも出てきましたね。)
A =
\left(
\begin{matrix}
1 & 2\\\
3 & 4
\end{matrix}
\right)
この例の場合、$a_{21}=3$、$a_{12}=2$です。
#2. 行列の足し算・引き算
次に、行列の演算を定義します。まずは、足し算・引き算・定数倍です。こちらは簡単です。行列の足し算、引き算は、ベクトルのときと同様、個々の要素同士の足し算・引き算となります。当然、行・列のサイズが同じもの同士のみで定義されます。
\left(
\begin{matrix}
a_{11} & \cdots & a_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} & \cdots & a_{mn}
\end{matrix}
\right) \pm
\left(
\begin{matrix}
b_{11} & \cdots & b_{1n} \\\
\vdots & \ddots & \vdots \\\
b_{m1} & \cdots & b_{mn}
\end{matrix}
\right)
=
\left(
\begin{matrix}
a_{11} \pm b_{11} & \cdots & a_{1n} \pm b_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} \pm b_{m1} & \cdots & a_{mn} \pm b_{mn}
\end{matrix}
\right)
#3. 行列の定数倍
こちらも、ベクトルの場合と同様、個々の要素の定数倍となります。
c
\left(
\begin{matrix}
a_{11} & \cdots & a_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} & \cdots & a_{mn}
\end{matrix}
\right) =
\left(
\begin{matrix}
c a_{11} & \cdots & c a_{1n} \\\
\vdots & \ddots & \vdots \\\
c a_{m1} & \cdots & c a_{mn}
\end{matrix}
\right)
#4. 行列とベクトル、行列と行列の掛け算
次に、行列とベクトルや、行列同士の掛け算について説明します。まずは、順を追って理解するための手順について説明し、その後、各手順の詳細について説明します。また、最後に、ぜひ覚えておくべき行列の積の性質についてまとめます。以下、細々とした記載が並ぶので、とにかく結果だけ押さえておきたいという方は、最後のまとめだけでもよく覚えておくと、行列の計算は格段に楽になると思います。
##4.1 行列の掛け算を理解するための手順
行列の掛け算は添え字がたくさんでてきてややこしいですが、以下の手順で順を追って理解すると分かりやすいし、理解も定着すると思います。
- ベクトル同士の掛け算(積)を理解 →内積
- 行列とベクトルの掛け算(積)を理解 →内積(上記1)を並べたもの
- 行列と行列の掛け算(積)を理解 →行列とベクトルの掛け算(上記2)を並べたもの
次に、これらの手順の詳細について確認していきたいと思います。
##4.2 ベクトル同士の積 →ベクトルの内積
前回も書きましたとおり、ベクトルは掛け算が定義されず、掛け算に相当するものとして内積が定義されます。内積自体はそこそこ奥が深いものですので、詳しい説明は後日にしたいと思いますが、ここでは、行列の計算の理解のため、内積の計算方法の説明だけ先にしたいと思います。(また、蛇足ですが、ベクトルには「外積」というものもありますが、こちらは本稿では触れません。)
$n$次元ベクトル
\mathbf{a}=
\left(
\begin{matrix}
a_1 \\\
a_2 \\\
\vdots \\\
a_n
\end{matrix}
\right)
\mathbf{b}=
\left(
\begin{matrix}
b_1 \\\
b_2 \\\
\vdots \\\
b_n
\end{matrix}
\right)
の内積は、以下の通り定義されます。
\begin{align}
\mathbf{a}^t \cdot \mathbf{b} & =
\left(
\begin{matrix}
a_1 & a_2 & \cdots & a_n
\end{matrix}
\right) \cdot
\left(
\begin{matrix}
b_1 \\\
b_2 \\\
\vdots \\\
b_n
\end{matrix}
\right) \\\
& = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n
\end{align}
- 2次元ベクトルの内積の定義・計算方法は高校でも出てきたので、この計算方法はイメージが湧くものだと思います。
- 注意点として、大学以降の数学では、内積はサイズの等しい横ベクトルと縦ベクトルの間で、「横ベクトル $\cdot$ 縦ベクトル」として定義されるということです(順番も重要です。必ず横ベクトルが左にきます!)。計算としては中の成分同士の掛け算の総和なので、順番なんかどっちでも同じではないかと思うかもしれませんが、以下のような計算は定義されませんのでご注意ください。(このような定義をしてしまうと、この後に出てくる行列の計算が定義できなくなってしまうため、内積は横ベクトルと縦ベクトルについて定義されています。ベクトルや行列の計算では、縦・横のサイズを気にすることは非常に重要です。)
- また、内積は次元のない普通の数(スカラーと言います)であることにも注意です。ベクトルや行列の計算では、結果の縦・横のサイズを気にすることも非常に重要です!
\left(
\begin{matrix}
a_1 \\\
a_2 \\\
\vdots \\\
a_n
\end{matrix}
\right)
\cdot
\left(
\begin{matrix}
b_1 \\\
b_2 \\\
\vdots \\\
b_n
\end{matrix}
\right)
→ 定義されません!!
- 内積の例: $\mathbf{a}^t=(1,2,3,4)$と$\mathbf{b}^t=(5, 6, 7, 8)$の内積$\mathbf{a}^t \cdot \mathbf{b}$は、
\begin{align}
\mathbf{a}^t \cdot \mathbf{b} & =
\left(
\begin{matrix}
1 & 2 & 3 & 4
\end{matrix}
\right) \cdot
\left(
\begin{matrix}
5 \\\
6 \\\
7 \\\
8
\end{matrix}
\right) \\\
&= 1 \times 5 + 2 \times 6 + 3 \times 7 + 4 \times 8 \\
&= 70
\end{align}
となります。
##4.3 行列とベクトルの積 →内積を並べたもの
次に、行列とベクトルと積を定義します。まず、最初にお伝えしたいのが、行列やベクトルの掛け算は、かける順番によって結果が変わってきます。(つまり、$AB$と$BA$は(たまたま結果が一致する特別な場合を除き)違う結果になると言うことです)。
###4.3.1 行列と縦ベクトルの積(行列が左にくる場合)
まずは、行列が左、ベクトルが右の場合の掛け算を考えます。このとき、右側のベクトルは必ず縦ベクトルになります。(なぜなら、定義より、行列とベクトルの掛け算(行列を左からかける)ときは、行列の横のサイズとベクトルの縦のサイズが一致している必要があるためです。)
以下の行列$A$とベクトル$\mathbf{x}$を考えます。
A=
\left(
\begin{matrix}
a_{11} & \cdots & a_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} & \cdots & a_{mn}
\end{matrix}
\right)
\mathbf{x} =
\left(
\begin{matrix}
x_1 \\\
\vdots \\\
x_n
\end{matrix}
\right)
このとき、$A$と$\mathbf{x}$の積$A \mathbf{x}$は次のように定義されます。(ん〜、添え字が出てきてうんざりですね。)
A \mathbf{x} =
\left(
\begin{matrix}
\sum_{j=1}^n a_{1j} x_j \\\
\vdots \\\
\sum_{j=1}^n a_{mj} x_j
\end{matrix}
\right)
ここで、上記解読するため、冷静になって、以下のように$\mathbf{a}_i^t$という$m$個の横ベクトルを定義して$A$を
A =
\left(
\begin{matrix}
a_{11} & \cdots & a_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} & \cdots & a_{mn}
\end{matrix}
\right) =
\left(
\begin{matrix}
\mathbf{a}_1^t \\\
\vdots \\\
\mathbf{a}_m^t
\end{matrix}
\right)
\mathbf{a}_1^t =
\left(
\begin{matrix}
a_{11} & a_{12} & \cdots & a_{1n}
\end{matrix}
\right) \\\
\mathbf{a}_2^t =
\left(
\begin{matrix}
a_{21} & a_{22} & \cdots & a_{2n}
\end{matrix}
\right) \\\
\vdots\\\
\mathbf{a}_m^t =
\left(
\begin{matrix}
a_{m1} & a_{m2} & \cdots & a_{mn}
\end{matrix}
\right) \\\
のように横に1行ずつ分割し、各行について見てみると、
\begin{align}
\mathbf{a}_i^t \cdot \mathbf{x} &=
\left(
\begin{matrix}
a_{i1} & a_{i2} & \cdots & a_{in}
\end{matrix}
\right)
\left(
\begin{matrix}
x_1 \\\
x_2 \\\
\vdots \\\
x_n
\end{matrix}
\right) \\\
&= \sum_{j=1}^n a_{ij}x_j
\end{align}
なので、実は、$A \mathbf{x}$は、
A \mathbf{x} =
\left(
\begin{matrix}
\mathbf{a}_1^t \\\
\vdots \\\
\mathbf{a}_m^t
\end{matrix}
\right)
\mathbf{x} =
\left(
\begin{matrix}
\mathbf{a}_1^t \cdot \mathbf{x} \\\
\vdots \\\
\mathbf{a}_m^t \cdot \mathbf{x}
\end{matrix}
\right)
となっていることが分かります。つまり、行列とベクトルの積は、行列の各行に対応した横ベクトル(上記の$\mathbf{a}_i^t$)と、掛けられるベクトル$x$の内積を縦に並べたものになります。(超重要です!!)
ここで、くどいかも知れませんが念のため注意ですが、$\mathbf{a}_i^t$は、行列を横に分割した時の各行に対応したベクトルですので、**$n$次元の横ベクトルです。**このため、上記式左辺の結果の各成分$\mathbf{a}_i^t \cdot \mathbf{x}$は、$n$次元のベクトル同士の内積となり、結果はスカラーとなります。このため、これらを縦に並べた左辺の結果は、$m$次元のベクトルになっています。
###4.3.2 横ベクトルと行列の積(行列が右にくる場合)
次に、ベクトルが左、行列が右の場合の積を考えます。(この場合、左側のベクトルは必ず横ベクトルになります。理由は先ほどと同様です。)
$m$次元の$\mathbf{x}^t = (x_1, x_2, \cdots, x_m)$と、サイズ$m \times n$の行列$A=(a_{ij})$の積を考えます。(2回目なのでちょっと省略して書いてみました)。このとき、ベクトル$\mathbf{x}^t$と行列$A$の積は以下のように、ベクトル$\mathbf{x}^t$とAを各列に分割した縦ベクトル$\mathbf{a}_j$の内積を横に並べたものとして表されます。
\begin{align}
\mathbf{x}^t A &=
\mathbf{x}^t
\left(
\begin{matrix}
\mathbf{a}_1 & \cdots & \mathbf{a}_n
\end{matrix}
\right) \\\
&=
\left(
\begin{matrix}
\mathbf{x}^t \cdot \mathbf{a}_1 &
\cdots &
\mathbf{x}^t \cdot \mathbf{a}_n
\end{matrix}
\right)
\end{align}
- 先ほどと同様、$\mathbf{a}_j$は行列を縦に分割したときの各列に対応したベクトルですので、m次元の縦ベクトルです。
- ですので、結果の各成分$\mathbf{x}^t \cdot \mathbf{a}_j$は、$m$次元のベクトル同士の内積で、スカラとなっています。このため、結果は、n次元の横ベクトルになっています。
##4.4 行列と行列の積 →行列とベクトルの積を並べたもの
###4.4.1 成分毎の表記
次に行列と行列の積です。まず、行列と行列の積を成分毎に普通に定義すると以下の通りとなります。ここでは、$l \times m$の行列$A=(a_{ij})$と$m \times n$の行列$B=(b_{ij})$の積$C=(c_{ij})$を考えます。このとき、掛け算をするときの左側の行列の列数(横サイズ)と右側の行列の行数(縦サイズ)が一致しているときに、行列の積が以下のように定義されます。
c_{ij} = \sum_{k=1}^{m} a_{ik} b_{kj}
###4.4.2 行列と縦ベクトルの積を並べたものとして表す
これまで同様、上記定義は添え字がいっぱいでてきて、一読して解読するのが面倒ですし、覚えるのも大変ですが、実は、行列と行列の掛け算は、以下のように、行列と縦ベクトルの積を横に並べたものとして表すことができます。
次のような、$l \times m$の行列$A$と$m \times n$の行列$B$の積を考えます。
\begin{align}
A & =(a_{ij}) \\\
B & =(b_{ij}) \\\
& =(\mathbf{b}_1 \cdots \mathbf{b}_n)
\end{align}
ここで、$\mathbf{b_j}$は、$B$の各列を分割して表した縦ベクトルです。(このため、$\mathbf{b_j}$はサイズ$m$の縦ベクトルです)。このとき、$A$と$B$の積$C$は、以下のように、$A$と$\mathbf{b}_j$の積を横に並べたものとして表すことができます。
C=(A\mathbf{b}_1 \cdots A\mathbf{b}_n)
つまり、行列と行列の積を計算するときは、以下手順で計算することができます(こちらも超重要です!!)
- 積の右側の行列を縦ベクトルに分割
- 左側の行列と上記1の縦ベクトルの積を計算 →結果は縦ベクトルになる
- 上記2で計算した結果(縦ベクトル)を横に並べる
次に、実際に上記方法で計算した結果$A\mathbf{b_j}$が、もともとの成分毎に表記した定義と一致しているか確かめてみます。先ほどご説明した行列と縦ベクトルの積の定義より、
A=
\left(
\begin{matrix}
a_{11} & \cdots & a_{1m} \\\
\vdots & \ddots & \vdots \\\
a_{l1} & \cdots & a_{lm}
\end{matrix}
\right)
と
\mathbf{b}_j =
\left(
\begin{matrix}
b_{1j} \\\
\vdots \\\
b_{mj}
\end{matrix}
\right)
(j = 1 \cdots n)
の積は、以下のとおりとなります。
A \mathbf{b}_j =
\left(
\begin{matrix}
\sum_{k=1}^m a_{1k} b_{kj} \\\
\vdots \\\
\sum_{k=1}^n a_{lk} b_{kj}
\end{matrix}
\right)
上式より、$A\mathbf{b_j}$の$i$行目の成分が$\sum_{k=1}^m a_{ik} b_{kj}$となっているので、成分毎の定義と比較すると、一致していることが確認できました。
###4.4.3 横ベクトルを並べたものと行列の積として表す
また、前節同様、行列同士の積は、以下のように、横ベクトルと行列の積を縦に並べたものとして表すこともできます。
次のような、$l \times m$の行列$A$と$m \times n$の行列$B$の積を考えます。
\begin{align}
A & =(a_{ij}) \\\
& =
\left(
\begin{matrix}
\mathbf{a}_1 \\
\vdots \\
\mathbf{a}_l
\end{matrix}
\right)
\end{align}
B =(b_{ij})
ここで、$\mathbf{a_i}$は、$A$の各行を分割して表した横ベクトルです。(このため、$\mathbf{a_i}$はサイズ$m$の横ベクトルです)。このとき、$A$と$B$の積$C$は、以下のように、$\mathbf{a}_i$と$B$の積を縦の並べたものとして表すことができます。
C =
\left(
\begin{matrix}
\mathbf{a}_1 B \\
\vdots \\
\mathbf{a}_l B
\end{matrix}
\right)
前節と同様に、具体的に計算してみると成分毎の定義と一致することが確認できますが、ここでは省略します。
###4.4.4 行列同士の積の別の見方 〜区切り方を変えてみるとどうなるか?〜
これまでの説明で分かるように、**行列と行列の積は、積の左側の行列は行に分割、右側の行列は列に分割することで行列とベクトルの積の形になり、計算の見通しが良くなることがわかりました。**では、逆に、左側の行列を列に分割するとどうなるでしょうか?
まずは、以下の行列とベクトルの積について再度考えてみます。
A=
\left(
\begin{matrix}
a_{11} & \cdots & a_{1n} \\\
\vdots & \ddots & \vdots \\\
a_{m1} & \cdots & a_{mn}
\end{matrix}
\right)
\mathbf{x} =
\left(
\begin{matrix}
x_1 \\\
\vdots \\\
x_n
\end{matrix}
\right)
このとき、先ほどご説明した行列とベクトルの定義より、$C=A\mathbf{x}$は以下のようになります。
\begin{align}
C &=
\left(
\begin{matrix}
\sum_{j=1}^{n}a_{1j}x_j \\
\vdots \\
\sum_{j=1}^{n}a_{mj}x_j
\end{matrix}
\right) \\
&=
\left(
\begin{matrix}
a_{11}x_1 + \cdots + a_{1n}x_n \\
\vdots \\
a_{m1}x_1 + \cdots + a_{mn}x_n
\end{matrix}
\right) \\
&=
x_1 \left(
\begin{matrix}
a_{11} \\
\vdots \\
a_{m1}
\end{matrix}
\right) + \cdots
x_n \left(
\begin{matrix}
a_{1n} \\
\vdots \\
a_{mn}
\end{matrix}
\right) \\
&=
x_1 \mathbf{a}_1 + \cdots + x_n \mathbf{a}_n
\end{align}
つまり、行列とベクトルの積は、区切り方を先ほどの逆にする(左側の行列の方を縦に区切り、右側のベクトルのほうを横に区切る)と、結果は個々の成分(ベクトルの定数倍)の足し算になるのです!
行列同士の積の場合も同様で、次の$l \times m$行列$A$と$m \times n$行列$B$
A=
\left(
\mathbf{a}_1 \cdots \mathbf{a}_m
\right)
B =
\left(
\begin{matrix}
\mathbf{b}_1^t \\
\vdots \\
\mathbf{b}_m^t
\end{matrix}
\right)
の積は次のように表すことができます。
AB = \mathbf{a}_1 \mathbf{b}_1^t
+ \cdots
+ \mathbf{a}_n \mathbf{b}_n^t
ここで、上記最後の式で、縦ベクトルと横ベクトルの関係がこれまで(内積の計算)と逆であることにご注意ください。つまり、$\mathbf{a}_i \mathbf{b}_i^t$は、内積ではなく、サイズ$l \times 1$の行列とサイズ$1 \times n$の行列の掛け算となっています。このため、結果も定数ではなく、$l \times n$($A$の縦サイズ $\times$ $B$の横サイズ)となっています。
##4.5 行列演算(掛け算)のまとめ
いろいろと書いてきましたが、まとめとして、以下のパターンを理解し、すぐに使えるようになっていれば、行列・ベクトルの演算はかなり楽に行えるようになると思います。これらは、とにかく、基本的な計算パターンとして暗記するのがいいと思います。
###4.5.1 基本的な考え方
まず、基本的な考え方は以下の通りです。これだけはしっかりと暗記し、頭がこんがらがりそうになったら、思い出すようにする必要があると私は思っています。
- これまで見てきたように、基本的に、左側の行列を横に分解、右側の行列を縦に分解すると、行列の積は行列とベクトルの積を並べたものとして表すことができる。
- 逆に、左側の行列を縦に分解、右側の行列を横に分解すると、行列の積は、個々の積の和として表すことができる。
###4.5.2 基本的な計算パターンのまとめ
次に、具体的に覚えるべき(私が思っている)計算パターンは以下の通りです。
- 左側の行列を横に分解
\left(
\begin{matrix}
\mathbf{a}_1^t \\
\vdots \\
\mathbf{a}_m^t
\end{matrix}
\right)
B =
\left(
\begin{matrix}
\mathbf{a}_1^t B\\
\vdots \\
\mathbf{a}_m^t B
\end{matrix}
\right)
- 右側の行列を縦に分解
A \left(
\begin{matrix}
\mathbf{b}_1 & \cdots & \mathbf{b}_n
\end{matrix}
\right)
=
\left(
\begin{matrix}
A \mathbf{b}_1 & \cdots & A \mathbf{b}_n
\end{matrix}
\right)
- 左の行列を横に分解、右側の行列を縦に分解(上記1と2の組み合わせ)
\begin{align}
\left(
\begin{matrix}
\mathbf{a}_1^t \\
\vdots \\
\mathbf{a}_m^t
\end{matrix}
\right)
\left(
\begin{matrix}
\mathbf{b}_1 & \cdots & \mathbf{b}_n
\end{matrix}
\right)
&=
\left(
\begin{matrix}
\left(
\begin{matrix}
\mathbf{a}_1^t \\
\vdots \\
\mathbf{a}_m^t
\end{matrix}
\right) \mathbf{b}_1
& \cdots &
\left(
\begin{matrix}
\mathbf{a}_1^t \\
\vdots \\
\mathbf{a}_m^t
\end{matrix}
\right) \mathbf{b}_n
\end{matrix}
\right) \\
&=
\left(
\begin{matrix}
\mathbf{a}_1^t \mathbf{b}_1 & \cdots & \mathbf{a}_1^t \mathbf{b}_n \\
\vdots & \ddots & \vdots \\
\mathbf{a}_m^t \mathbf{b}_1 & \cdots & \mathbf{a}_m^t \mathbf{b}_n
\end{matrix}
\right)
\end{align}
注意: $\mathbf{a}_i^t \mathbf{b}_j$はスカラー。
- 左側の行列を縦に分解、右側のベクトルを横に分解
\left(
\begin{matrix}
\mathbf{a}_1 & \cdots & \mathbf{a}_n
\end{matrix}
\right)
\left(
\begin{matrix}
c_1 \\
\vdots \\
c_n
\end{matrix}
\right)
= c_1 \mathbf{a}_1 + \cdots + c_n \mathbf{a}_n
- 左側の行列を縦に分解、右側の行列を横に分解
\left(
\begin{matrix}
\mathbf{a}_1 & \cdots & \mathbf{a}_n
\end{matrix}
\right)
\left(
\begin{matrix}
\mathbf{b}_1^t \\
\vdots \\
\mathbf{b}_n^t
\end{matrix}
\right)
= \mathbf{a}_1 \mathbf{b}_1^t+ \cdots + \mathbf{a}_n \mathbf{b}_n^t
#5. まとめ
行列の計算をわかりやくまとめたいと思ったのですが、すみませんが、結局添え字が多くなってしまいました。「4.5の行列演算(掛け算)のまとめ」のところだけでも、添え字に我慢して頑張って理解してもらえると、今後の行列演算はかなり楽に進められるようになると思います。ご意見やご不明な点等ありましたらお気軽にコメントしてもらえましたらと思います。
今回はひたすら計算方法について書いたので、次回は行列の掛け算の意味について書きたいと思います。