転置行列
$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$ を転置する」と言います。
転置行列の性質
行列 $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}\]
下記は誤植と思われますので、ご確認ください。
転置行列の定義の最右下の要素で、a_nm → a_mn
(1)式で、A+B^T → (A+B)^T
(10)式で、A^T=T → A^T=A
(10)式の下の行で、主対線 → 主対角線
ありがとうございます。
本当に助かります。
ご指摘いただいた箇所はすべて訂正しておきました。
また何か見つけたらよろしくお願いします m(_ _)m