転置行列と対称行列

転置行列と対称行列

 

転置行列

 $m\times n$ の行列
 
\[A=\begin{bmatrix}a_{11}&a_{12} &\cdots &a_{1n}\\a_{21}&a_{22} &\cdots &a_{2n}\\\vdots & \vdots &\ddots &\vdots\\a_{m1}&a_{m2} &\cdots &a_{mn}\end{bmatrix}\]
について、$a_{ij}$ と $a_{ji}$ の位置を入れ替えた行列、すなわち主対角線 (左上から右下に伸びる対角線) で成分を折り返した行列
 
\[\begin{bmatrix}a_{11}&a_{21} &\cdots &a_{m1}\\a_{12}&a_{22} &\cdots &a_{m2}\\\vdots & \vdots &\ddots &\vdots\\a_{1n}&a_{2n} &\cdots &a_{mn}\end{bmatrix}\]
を $A$ の 転置行列 (transpose) と定義し、$^tA$ または $A^T$ のように表します。また、行列 $A$ の転置行列を得ることを「$A$ を転置する」と言います。
 
Python 転置行列 (transpose)

転置行列の性質

 行列 $A$ の転置は線形操作です。
 すなわち、任意の行列 $A,\ B$ とスカラー$k$ について
 
\[\begin{align*}&(A+B)^T=A^T+B^T\tag{1}\\[6pt]&(kA)^T=k(A^T)\tag{2}\end{align*}\]
が成り立ちます。$A$ の転置行列を再び転置すると $A$ を得ます。
 
\[(A^T)^T=A\tag{3}\]
 行列積 $(AB)$ の転置は
 
\[(AB)^T=B^TA^T\tag{4}\]
で与えられます。$A$ の行列式 $\mathrm{det}A$ について、
 
\[\mathrm{det}A=\mathrm{det}(A^T)\tag{5}\]
が成り立ちます。逆行列の転置は転置行列の逆行列です:
 
\[(A^{-1})^T=(A^T)^{-1}\tag{6}\]
 $A$ が $m\times n$ の行列であるとき、$AA^T$ は $m\times m$, $A^TA$ は $n\times n$ の正方対称行列となります (対称行列については記事の後半を参照してください)。たとえば、$A$ が $2\times 3$ の矩形行列
 
\[A=\begin{bmatrix}a&b&c\\d&e&f\end{bmatrix}\tag{7}\]
であるとき、$AA^T$ は $2\times 2$ の正方対称行列です。

\[AA^T=\begin{bmatrix}a&b&c\\d&e&f\end{bmatrix}\begin{bmatrix}a&d\\b&e\\c&f\end{bmatrix}=\begin{bmatrix}a^2+b^2+c^2&ad+be+cf\\ad+be+cf&d^2+c^2+f^2\end{bmatrix}\tag{8}\]
 $A^TA$ は $3\times 3$ 正方対称行列です。
 
\[A^TA=\begin{bmatrix}a^2+d^2&ab+de&ac+df\\ab+de&b^2+e^2&bc+ef\\ac+df&bc+ef&c^2+f^2\end{bmatrix}\tag{9}\]

ndarray.T

 NumPy で配列 (ndarray) を生成すると、自動的に転置配列もデータ属性として付与されます。転置配列は ndarray.T で参照します。

# ndarray_transpose

# In[1]

import numpy as np

# 乱数を初期化
np.random.seed(11)

# 要素を無作為に生成して4×4行列を定義
# [[1 2 8 2]
#  [8 3 9 1]
#  [1 5 3 2]
#  [6 6 8 5]]
a = np.random.randint(1, 10, (4, 4))

# aの転置行列を表示
print(a.T)

# [[1 8 1 6]
#  [2 3 5 6]
#  [8 9 3 8]
#  [2 1 2 5]]

numpy.transpose()

 numpy.transpose() に行列 a を渡すと a の転置行列を返します。

# numpy_transpose

# In[1]

import numpy as np

# 乱数を初期化
np.random.seed(12)

# 要素を無作為に生成して3×5行列を定義
# [[7 2 3 4 4]
#  [1 7 2 5 6]
#  [3 7 1 6 9]]
a = np.random.randint(1, 10, (3, 5))

# aの転置行列
at = np.transpose(a)

print(at)

# [[7 1 3]
#  [2 7 7]
#  [3 2 1]
#  [4 5 6]
#  [4 6 9]]

対称行列

 転置によって自身を変えない正方行列、すなわち
 
\[A^T=A\tag{10}\]
を満たす行列 $A$ を 対称行列 (symmetric matrix) といいます。対称行列は主対角線に関して折り返すと重なるような行列です。たとえば、$3$ 次対称行列は
 
\[\begin{bmatrix}d_1&a&b\\a&d_2&c\\b&c&d_3\end{bmatrix}\]
のように表せます。一般に対称行列の成分は $a_{ij}=a_{ji}$ という関係を満たしています。
 
 対称行列の逆行列を転置すると
 
\[(A^{-1})^T=(A^T)^{-1}=A^{-1}\tag{11}\]
となるので、対称行列の逆行列もまた対称行列です。NumPy で $4$ 次正方行列の逆行列を計算して確認してみましょう。

# numpy_symmetric_matrix

# In[1]

import numpy as np
np.set_printoptions(precision=3)

# 4次正方行列
a = np.array([[1, 3, 7, 2],
              [3, 0, 5, 8],
              [7, 5, 1, 4],
              [2, 8, 4, 4]])

# aの逆行列
ai = np.linalg.inv(a)

print(ai)
# [[ 0.09  -0.042  0.192 -0.154]
#  [-0.042 -0.058 -0.012  0.148]
#  [ 0.192 -0.012 -0.002 -0.07 ]
#  [-0.154  0.148 -0.07   0.102]]

 任意の行列 $X$ について、
 
\[(X^TX)^T=X^T(X^T)^T=X^TX\tag{12}\]
が成り立つので、$X^TX$ および $XX^T$ は対称行列となります。$X$ は正方行列でなくても構いません。たとえば
 
\[X=\begin{bmatrix}
a&b&c\\d&e&f\end{bmatrix}\tag{13}\]
とした場合、$XX^T$ と $X^TX$ は異なるサイズの行列ですが、どちらも対称行列となります。
 
\[XX^T=\begin{bmatrix}a^2+b^2+c^2&ad+be+cf\\ad+be+cf&a^2+b^2+c^2\end{bmatrix}\tag{14}\]
\[X^TX=\begin{bmatrix}a^2+d^2&ab+de&ac+df\\ab+de&b^2+e^2&bc+ef\\ac+df&bc+ef&c^2+f^2\end{bmatrix}\tag{15}\]