随伴行列とエルミート行列をわかりやすく解説

実数の世界では対称行列が重要な役割を果たしますが、複素数を成分に持つ行列を扱う場合、対称行列に代わって登場するのがエルミート行列です。そして、エルミート行列の定義には随伴行列(共役転置)の概念が必要です。

これらの概念は、量子力学、信号処理、機械学習のカーネル法など、複素数が関わる多くの分野で基礎となります。

本記事の内容

  • 随伴行列(共役転置)の定義
  • エルミート行列の定義と性質
  • 固有値が実数であることの証明
  • Pythonでの実装と検証

随伴行列とは

複素共役と転置の復習

複素数 $z = a + bi$($a, b \in \mathbb{R}$, $i$ は虚数単位)の複素共役は、

$$ \bar{z} = a – bi $$

です。行列 $\bm{A}$ の各成分の複素共役を取った行列を $\bar{\bm{A}}$ と書きます。

随伴行列の定義

行列 $\bm{A}$ の随伴行列(adjoint matrix)$\bm{A}^\dagger$ は、複素共役を取ってから転置する操作で定義されます。

$$ \bm{A}^\dagger = \bar{\bm{A}}^\top $$

すなわち、$(\bm{A}^\dagger)_{ij} = \overline{a_{ji}}$ です。

記法として $\bm{A}^*$ や $\bm{A}^H$ と書くこともあります。

具体例

$$ \bm{A} = \begin{pmatrix} 1 + i & 2 \\ 3i & 4 – 2i \end{pmatrix} $$

のとき、

$$ \bm{A}^\dagger = \begin{pmatrix} 1 – i & -3i \\ 2 & 4 + 2i \end{pmatrix} $$

随伴行列の性質

  1. $(\bm{A}^\dagger)^\dagger = \bm{A}$
  2. $(\bm{A} + \bm{B})^\dagger = \bm{A}^\dagger + \bm{B}^\dagger$
  3. $(c\bm{A})^\dagger = \bar{c} \bm{A}^\dagger$($c$ は複素数)
  4. $(\bm{A}\bm{B})^\dagger = \bm{B}^\dagger \bm{A}^\dagger$

性質4は転置の公式 $(\bm{A}\bm{B})^\top = \bm{B}^\top \bm{A}^\top$ の複素版です。

エルミート行列とは

定義

正方行列 $\bm{A}$ がエルミート行列(Hermitian matrix)であるとは、

$$ \bm{A}^\dagger = \bm{A} $$

すなわち $\overline{a_{ji}} = a_{ij}$ が全ての $i, j$ で成り立つことをいいます。

成分で書くと、対角成分は $\overline{a_{ii}} = a_{ii}$ なので実数でなければなりません。非対角成分は $a_{ij}$ と $a_{ji}$ が互いに複素共役の関係にあります。

具体例

$$ \bm{H} = \begin{pmatrix} 3 & 2 + i \\ 2 – i & 5 \end{pmatrix} $$

確認すると、$\bm{H}^\dagger = \begin{pmatrix} 3 & 2 + i \\ 2 – i & 5 \end{pmatrix} = \bm{H}$ なのでエルミート行列です。

実対称行列との関係

行列の成分が全て実数の場合、複素共役は何もしないので $\bm{A}^\dagger = \bm{A}^\top$ となります。したがって、エルミート行列の実数版が対称行列です。

$$ \text{対称行列} \subset \text{エルミート行列} $$

エルミート行列の性質

固有値が実数であることの証明

エルミート行列の最も重要な性質は、全ての固有値が実数であることです。これを証明します。

$\bm{A}$ をエルミート行列とし、$\bm{A}\bm{v} = \lambda \bm{v}$($\bm{v} \neq \bm{0}$)とします。

両辺の左から $\bm{v}^\dagger$ を掛けると、

$$ \bm{v}^\dagger \bm{A} \bm{v} = \lambda \bm{v}^\dagger \bm{v} $$

一方、両辺の随伴を取ると($\bm{A}^\dagger = \bm{A}$ を使って)、

$$ (\bm{A}\bm{v})^\dagger = \bm{v}^\dagger \bm{A}^\dagger = \bm{v}^\dagger \bm{A} $$

$$ (\lambda \bm{v})^\dagger = \bar{\lambda} \bm{v}^\dagger $$

したがって、

$$ \bm{v}^\dagger \bm{A} \bm{v} = \bar{\lambda} \bm{v}^\dagger \bm{v} $$

2つの結果を比較すると、

$$ \lambda \bm{v}^\dagger \bm{v} = \bar{\lambda} \bm{v}^\dagger \bm{v} $$

$\bm{v}^\dagger \bm{v} = \|\bm{v}\|^2 > 0$ なので、$\lambda = \bar{\lambda}$ つまり $\lambda$ は実数です。

異なる固有値に属する固有ベクトルは直交する

$\bm{A}\bm{v}_1 = \lambda_1 \bm{v}_1$, $\bm{A}\bm{v}_2 = \lambda_2 \bm{v}_2$($\lambda_1 \neq \lambda_2$)のとき、

$$ \bm{v}_2^\dagger \bm{A} \bm{v}_1 = \lambda_1 \bm{v}_2^\dagger \bm{v}_1 $$

一方、$\bm{A}^\dagger = \bm{A}$ より、

$$ \bm{v}_2^\dagger \bm{A} \bm{v}_1 = (\bm{A}\bm{v}_2)^\dagger \bm{v}_1 = \bar{\lambda}_2 \bm{v}_2^\dagger \bm{v}_1 = \lambda_2 \bm{v}_2^\dagger \bm{v}_1 $$

($\lambda_2$ は実数なので $\bar{\lambda}_2 = \lambda_2$)

したがって $(\lambda_1 – \lambda_2) \bm{v}_2^\dagger \bm{v}_1 = 0$ であり、$\lambda_1 \neq \lambda_2$ より $\bm{v}_2^\dagger \bm{v}_1 = 0$ です。

スペクトル定理

エルミート行列 $\bm{A}$ は、ユニタリ行列 $\bm{U}$ を用いて対角化できます。

$$ \bm{A} = \bm{U} \bm{\Lambda} \bm{U}^\dagger $$

ここで、$\bm{\Lambda}$ は実数の固有値を対角成分に持つ対角行列です。

Pythonでの実装

エルミート行列の性質をPythonで検証します。

import numpy as np
import matplotlib.pyplot as plt

# エルミート行列の構成
H = np.array([[3, 2+1j, 1-2j],
              [2-1j, 5, 3j],
              [1+2j, -3j, 4]])

print("行列 H:")
print(H)
print(f"\nH == H^dagger ? {np.allclose(H, H.conj().T)}")

# 固有値分解
eigenvalues, eigenvectors = np.linalg.eigh(H)
print(f"\n固有値: {eigenvalues}")
print(f"全ての固有値が実数か: {np.all(np.isreal(eigenvalues))}")

# 固有ベクトルの直交性の検証
U = eigenvectors
print(f"\nU^H @ U (単位行列になるはず):")
print(np.round(U.conj().T @ U, 10))

# スペクトル分解の検証: H = U Lambda U^H
Lambda = np.diag(eigenvalues)
H_reconstructed = U @ Lambda @ U.conj().T
print(f"\nH と U Lambda U^H の差のノルム: {np.linalg.norm(H - H_reconstructed):.2e}")

# 可視化: ランダムなエルミート行列の固有値分布
np.random.seed(42)
n = 100
eigenvalue_list = []

for _ in range(1000):
    # ランダムなエルミート行列の生成
    A = np.random.randn(n, n) + 1j * np.random.randn(n, n)
    H_random = (A + A.conj().T) / 2  # エルミート化
    evals = np.linalg.eigvalsh(H_random)
    eigenvalue_list.extend(evals)

fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(eigenvalue_list, bins=100, density=True, alpha=0.7, color='steelblue')
ax.set_xlabel('Eigenvalue')
ax.set_ylabel('Density')
ax.set_title(f'Eigenvalue Distribution of Random Hermitian Matrices ({n}x{n})')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

このコードでは、エルミート行列の固有値が実数であること、固有ベクトルが直交すること、スペクトル分解が成り立つことを数値的に検証しています。

まとめ

本記事では、随伴行列とエルミート行列について解説しました。

  • 随伴行列 $\bm{A}^\dagger$ は複素共役転置で定義され、転置の複素数版にあたる
  • エルミート行列は $\bm{A}^\dagger = \bm{A}$ を満たす行列であり、実対称行列の一般化である
  • エルミート行列の固有値は全て実数であり、異なる固有値の固有ベクトルは直交する
  • スペクトル定理により、エルミート行列はユニタリ行列で対角化できる

エルミート行列の理解は、ユニタリ行列や量子力学のオブザーバブルの概念を学ぶ上での前提となります。