行列のトレース

行列のトレース

行列のトレース (対角和)

トレースの定義

 $n\times n$ の正方行列
 
\[A=\begin{bmatrix}a_{11}&a_{12} &\cdots &a_{1n}\\
a_{21}&a_{22} &\cdots &a_{2n}\\
\vdots & \vdots &\ddots &\vdots\\
a_{n1}&a_{n2} &\cdots &a_{nn}\end{bmatrix}\]
について、主対角成分 (左上から右下に伸びる対角線上の成分) の総和
 
\[a_{11}+a_{22}+\ \cdots\ +a_{nn}\tag{1}\]
を行列 $A$ の トレース (対角和) とよび、$\mathrm{tr}A$ で表します。稀にドイツ語の Spur の訳である 跡 (せき) という言葉が使われることもあります。たとえば、$4\times 4$ の正方行列
 
\[A=\begin{bmatrix}
5 & 7 & 1& 0\\
9 & 2 & 8& 1\\
3 & 6 & 5& 5\\
4 & 0 & 7& 6\\
\end{bmatrix}\]
のトレースを計算すると $\mathrm{tr}A=5+2+5+6=18$ となります。

トレースの性質

 行列 $A$ のトレースは線形写像です。
 すなわち、任意の行列 $A,\ B$ とスカラー$k$ について
 
\[\begin{align*}&\mathrm{tr}(A+B)=\mathrm{tr}A+\mathrm{tr}B\tag{2}\\[6pt]
&\mathrm{tr}(kA)=k\mathrm{tr}A\tag{3}\end{align*}\]
が成り立ちます。

 一般に行列積について $AB=BA$ は保障されませんが、トレースの値は保存されます:
 
\[\mathrm{tr}(AB)=\mathrm{tr}(BA)\tag{4}\]
 実際、$2\times 2$ の正方行列
 
\[A=\begin{bmatrix}a & b\\c & d\end{bmatrix}
,\quad B=\begin{bmatrix}e & f\\g & h\end{bmatrix}\]
について行列積は
 
\[\begin{align*}AB=\begin{bmatrix}ae+bg & af+bh\\
ce+dg & cf+dh\end{bmatrix}\\[6pt]
BA=\begin{bmatrix}ae+cf & be+df\\ag+ch & bg+dh\end{bmatrix}\end{align*}\]
なので、トレースを計算すると
 
\[\begin{align*}&\mathrm{tr}(AB)=ae+bg+cf+dh\\[6pt]
&\mathrm{tr}(BA)=ae+cf+bg+dh\end{align*}\]
となって、確かに $\mathrm{tr}(AB)=\mathrm{tr}(BA)$ が成り立っています。

 行列 $A$ の 転置 についてもトレースは不変です。すなわち
 
\[\mathrm{tr}A^T=\mathrm{tr}A\]
が成り立ちます。
 

まずはこの一冊から 意味がわかる線形代数 (BERET SCIENCE)

新品価格
¥3,410から
(2019/10/24 15:48時点)

numpy.trace()

 numpy.trace() に行列 a を渡すと a のトレースを返します。
 行列積 $AB$ のトレースと $BA$ のトレースが一致することを確認してみます。

# SLA_028

import numpy as np

# 乱数ジェネレータを初期化
np.random.seed(15)

# 行列aを定義
# [[8 5 5]
#  [7 0 7]
#  [5 6 1]]
a = np.random.randint(0, 10, (3, 3))

# 行列bを定義
# [[7 0 4]
#  [9 7 5]
#  [3 6 8]]
b = np.random.randint(0, 10, (3, 3))

# 行列積abを計算
ab = np.dot(a, b)

# 行列積baを計算
ba = np.dot(b, a)

# abのトレース
tr_ab = np.trace(ab)

# baのトレース
tr_ba = np.trace(ba)

print("行列積ab\n{}\n".format(ab))
print("行列積ba\n{}\n".format(ba))
print("tr(ab) = {}".format(tr_ab))
print("tr(ba) = {}".format(tr_ba))
行列積ab
[[116  65  97]
 [ 70  42  84]
 [ 92  48  58]]

行列積ba
[[ 76  59  39]
 [146  75  99]
 [106  63  65]]

tr(ab) = 216
tr(ba) = 216