正方行列とは?対角成分・対称/直交/三角行列を図解でわかりやすく解説

行列のなかには、「正方形」の形をしたものだけが持てる特別な性質があります。

行列式逆行列固有値トレース——これらはすべて、行数と列数が等しい「正方行列」にしか定義できません。逆に言えば、正方行列を理解することは、線形代数の核心部分を理解することとほぼ同義です。機械学習の共分散行列、物理の回転行列、制御工学の状態方程式——どれも正方行列の性質に支えられています。

本記事では、正方行列の定義から始めて、対角成分・トレース・行列式・逆行列・固有値という「正方行列だけが持てる量」を順番に整理します。さらに、対称行列・直交行列・三角行列・対角行列という重要な特殊クラスを具体例とPythonコードで徹底解説します。

機械学習や統計学、大学の教養課程などで線形代数を勉強していると、さまざまな用語が飛び交います。特に正方行列は行列の基本的な形の1つで、多くの性質を有しています。

正方行列の定義

まず最初に、正方行列の定義を示します。

正方行列の定義

行の数 $m$と列の数$n$が等しい時、その行列のことを、n次(m次)の正方行列という。

まさに定義はこれだけです。

正方行列の正方は、正方形から来ており、行成分と列成分の個数が等しければ全て正方行列になります。上記の定義よりも、下記のような正方形のイメージで覚えておくと良いと思います。

正方行列の定義(行数=列数)

左と右は行と列の数が違うので正方行列ではありません。真ん中の $3 \times 3$ だけが正方行列です。「行が何本あるか」と「列が何本あるか」を数えて一致していれば正方行列、それだけの判定です。

なぜこの形だけを特別扱いするのかというと、行列式・逆行列・固有値・トレースといった重要な量が、いずれも $n \times n$ でしか定義できないからです。たとえば固有値は $A\bm{x} = \lambda \bm{x}$ を満たす $\lambda$ ですが、左辺と右辺の次元が揃うには入力と出力の次元が同じ、つまり正方でなければなりません。

正方行列は、逆行列をもつかどうかで、正則行列か特異行列に分類されます。

一方、正則行列や特異行列は必ず正方行列になります。

正方行列の中の特殊クラス

一番外側が正方行列全体で、その内側に正則行列(逆行列を持つもの)があります。さらにその中に直交行列や、対角成分に $0$ を含まない対角行列が入ります。右側の対称行列は正則行列と部分的に重なりますが、完全には含まれません。対称でも $\det = 0$ になる行列は存在するからです。

この図のとおり、単位行列 $I$ は「対角行列であり、直交行列であり、対称行列であり、正則行列でもある」という、すべての性質を兼ね備えた特別な行列です。各クラスの詳細は本記事で順に見ていきます。

正方行列の性質

正方行列はたくさんの性質や、正方行列だけに定義できる値が多く定義されています。一度に覚える必要はありませんが、どれも機械学習等で必要なので覚えておくようにしましょう。

対角成分

正方行列においては、対角成分(diagonal component)が定義できます。

対角成分とは、行$n$と列$m$において、$n=m$が成り立つ要素を集めた値になります。例えば、下記のような正方行列$A$が定義されているとき、

$$ A = \begin{pmatrix} 3 & 2 & 1 & 5 \\ 5 & 2 & 5 & 6 \\ 1 & 2 & 3 & 3 \\ 1 & 6 & 4 & 2 \end{pmatrix} $$

対角成分は $[3,\ 2,\ 3,\ 2]$ となります。対角成分は非常に簡単で、正方行列における斜めの成分だと理解すれば十分です。

対角成分・上三角部分・下三角部分

オレンジで塗ったマスが対角成分($i = j$)です。$n$ 次の正方行列なら必ず $n$ 個あります。青が対角より右上の上三角部分($i < j$)、緑が左下の下三角部分($i > j$)です。

この3領域という見方は、以降に出てくる話をすべて貫きます。対称行列は「青と緑が対角線を折り目にして一致する」行列、三角行列は「青か緑のどちらかが全部 $0$」の行列、対角行列は「青も緑も全部 $0$」の行列、というように整理できます。

ちなみに、対角成分は英語でdiagonal componentと呼ぶので、正方行列$A$の対角成分をdiag(A)と表現することがあるので気をつけてください。

対角行列とnp.diag()操作

正方行列のうち、対角成分以外の要素がすべて0である行列を対角行列と言います。対角行列の具体例としては、次のような行列が挙げられます。

$$ A = \begin{pmatrix} 5 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 2 \\ \end{pmatrix} $$

対角行列は計算が非常に簡単で、$n$ 次対角行列の積・べき乗・行列式はすべて対角成分だけを使って計算できます。

NumPyでは np.diag() 関数が「対角成分の抽出」と「対角行列の生成」を両方担います。これが検索クエリ「diag 線形代数」に対する直接の答えです。

import numpy as np

A = np.array([[5, 0, 0],
              [0, 3, 0],
              [0, 0, 2]])

# 行列 → 対角成分ベクトルを取り出す
d = np.diag(A)
print("対角成分:", d)         # [5 3 2]

# ベクトル → 対角行列を生成する
D = np.diag([5, 3, 2])
print("対角行列:\n", D)

np.diag() は引数が2次元配列なら対角成分を1次元ベクトルとして返し、1次元ベクトルを与えるとそれを対角に持つ正方行列を返します。この双方向の使い方が「diag 線形代数」で最も重要な知識です。

np.diag は行列とベクトルを双方向に変換する

同じ np.diag という関数が、引数の形によってまったく違う動作をします。左向きに読めば「行列から対角を抜き出す」、右向きに読めば「ベクトルを対角に並べて行列を作る」です。

この性質から、np.diag(np.diag(A)) と2回続けて適用すると、$A$ の対角成分だけを残して他をすべて $0$ にした対角行列が得られます。共分散行列から分散だけを取り出して相関を無視する、といった前処理で実際によく使う書き方です。対角行列の行列式はすぐ後のセクションで詳しく扱います。

トレース(対角和)

正方行列 $A$ のトレース(trace)とは、対角成分の総和です。

$$ \operatorname{tr}(A) = \sum_{i=1}^{n} a_{ii} = a_{11} + a_{22} + \cdots + a_{nn} $$

先ほどの $4$ 次の行列 $A$ で言えば、対角成分が $3,\ 2,\ 3,\ 2$ なので $\operatorname{tr}(A) = 3 + 2 + 3 + 2 = 10$ です。

トレースは一見地味に見えますが、次の性質が機械学習や統計で頻繁に使われます。

  • 循環性: $\operatorname{tr}(ABC) = \operatorname{tr}(CAB) = \operatorname{tr}(BCA)$(掛ける順序を循環させても値は変わらない)
  • 固有値との関係: $\operatorname{tr}(A) = \lambda_1 + \lambda_2 + \cdots + \lambda_n$(固有値の和に等しい)
  • ガウス過程・共分散行列の対角和として、モデルの「不確かさの総量」を表すのに使われる

NumPyでは np.trace(A) または A.trace() で計算できます。

A = np.array([[3, 2, 1],
              [5, 2, 5],
              [1, 2, 3]])

print("トレース:", np.trace(A))   # 3+2+3 = 8

トレースは正方行列にしか定義できません。非正方行列には「$i=j$ の成分」が存在しないからです。次に、正方行列の最重要スカラー量である行列式を見ていきましょう。

行列式

行の数と列の数が等しい正方行列に限り、行列式(determinant)が定義できます。行列式は英語でdeterminantと表現するので、行列 $A$ の行列式を $\det(A)$ または $|A|$ と書きます。

行列式の直感的な意味は「行列が表す線形変換によって、空間の体積が何倍になるか」です。2次元なら面積の倍率、3次元なら体積の倍率を表します。

$$ \det(A) = \begin{vmatrix} a & b \\ c & d \end{vmatrix} = ad – bc \quad \text{(2次の場合)} $$

この「体積の倍率」という意味を、実際に図で確かめておきましょう。

行列式は面積の拡大率

左が変換前の単位正方形(面積 $1$)、右が $A = \begin{pmatrix} 2 & 1 \\ 0.5 & 1.5 \end{pmatrix}$ で変換した後の平行四辺形です。変換後の面積は $2.5$ になっており、これは $\det A = 2 \times 1.5 – 1 \times 0.5 = 2.5$ と一致します。

面積が $\det A$ 倍になる、というのが行列式の正体です。この見方をすると、$\det A = 0$ の意味も直感的に分かります。面積が $0$ 倍、つまり平行四辺形が完全に潰れて線分になってしまうということです。潰れてしまえば元の形の情報は失われるので、元に戻す変換(逆行列)は作れません。

なお $\det A$ が負になることもあります。これは変換によって「裏返る」(向きが反転する)ことを意味し、絶対値 $|\det A|$ が面積の倍率になります。

行列式の値がゼロかどうかは、後述する「正則行列かどうか」の判定と直結しています。

逆行列

正方行列においては、逆行列を定義できる場合があります。

先ほども説明しましたが、正方行列のうち、逆行列を有するものを正則行列、逆行列を有さないものを特異行列と言います。

逆行列は元に戻す行列

$A = \begin{pmatrix} 2 & 1 \\ 1 & 1 \end{pmatrix}$ に $A^{-1} = \begin{pmatrix} 1 & -1 \\ -1 & 2 \end{pmatrix}$ を掛けると、単位行列 $I$ になります。実際に計算すると、$(1,1)$ 成分は $2 \times 1 + 1 \times (-1) = 1$、$(1,2)$ 成分は $2 \times (-1) + 1 \times 2 = 0$ となり、確かに単位行列が現れます。

この $A$ は $\det A = 2 \times 1 – 1 \times 1 = 1 \neq 0$ なので正則です。$2 \times 2$ の逆行列は

$$ A^{-1} = \frac{1}{\det A}\begin{pmatrix} d & -b \\ -c & a \end{pmatrix} $$

という公式で書けますが、分母に $\det A$ が入っていることに注目してください。$\det A = 0$ だと $0$ で割ることになり、逆行列が定義できません。「行列式がゼロなら逆行列が存在しない」という事実が、この式に直接現れています。

正方行列の具体例

単位行列

単位行列は正方行列になります。次は2次元の単位行列ですが、これも行成分と列成分が等しいので、正方行列になります。

$$ E = \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ \end{pmatrix} $$

単位行列はすべての要素が対角成分だけ1でそれ以外が0の対角行列でもあります。任意の正方行列 $A$ に対して $AE = EA = A$ が成り立ち、行列の「掛け算の1」として機能します。

ここまで「正方行列に特有の量(対角成分・トレース・行列式・逆行列)」の入口を確認しました。次のセクションからは、正方行列のなかでも特に重要な4つのクラス——対称行列・直交行列・三角行列・正則行列——を順番に詳しく解説します。それぞれが機械学習や物理でどう使われるかも合わせて示します。

対称行列(Symmetric Matrix)

定義と直感

行列を転置しても元と同じ形になる——これが対称行列の本質です。

正方行列 $A$ が次の条件を満たすとき、$A$ を対称行列と呼びます。

$$ A = A^\top $$

すなわち $a_{ij} = a_{ji}$ がすべての $i, j$ で成り立つ行列です。要素が左上から右下へ伸びる対角線を「鏡」として、その鏡像が完全に一致します。

具体例を示します。

$$ A = \begin{pmatrix} 4 & 2 & -1 \\ 2 & 5 & 3 \\ -1 & 3 & 6 \end{pmatrix} $$

$(1,2)$ 成分と $(2,1)$ 成分はともに $2$、$(1,3)$ 成分と $(3,1)$ 成分はともに $-1$、$(2,3)$ 成分と $(3,2)$ 成分はともに $3$ です。対角線を境に上三角と下三角が鏡映関係になっているのがわかります。

対称行列と固有値が実数になること

左の図では、対角線(破線)を折り目にすると青の数字と緑の数字がぴったり重なります。これが「$A^\top = A$」の見た目です。

右の図は、$60 \times 60$ の行列をランダムに作って固有値を複素平面にプロットしたものです。赤い点が一般の正方行列の固有値で、実部と虚部を持ってばらけています。一方、青い点は対称化した行列の固有値で、すべて横軸(実軸)上に一直線に並んでいます。実際に虚部の最大値を測ると $0.0$、つまり厳密にゼロでした。

「対称行列の固有値は必ず実数」というのは机上の定理ではなく、このように数値の上でもきれいに成り立ちます。共分散行列やヘッセ行列が対称であることの恩恵は大きく、固有値が実数だからこそ「分散が大きい方向」や「損失が最も急に曲がる方向」といった物理的な解釈ができるわけです。

対称行列が出てくる場面

現実のデータや数式では、対称行列が非常に頻繁に登場します。代表的な例を挙げます。

  • 共分散行列: $n$ 変量データの共分散行列 $\Sigma$ は必ず対称行列です。$\sigma_{ij}$ と $\sigma_{ji}$ は同じ二変数の共分散なので当然等しくなります。
  • グラム行列: $G = X^\top X$ の形で現れる行列(カーネル法で重要)は自動的に対称行列になります。$G_{ij} = \bm{x}_i \cdot \bm{x}_j$ と $G_{ji} = \bm{x}_j \cdot \bm{x}_i$ が等しいからです。
  • ヘッセ行列: スカラー関数 $f$ の二次偏微分からなるヘッセ行列 $H_{ij} = \partial^2 f / \partial x_i \partial x_j$ は、偏微分の順序交換可能性(シュワルツの定理)から対称行列になります。

対称行列の固有値は常に実数

対称行列には、固有値に関する強力な定理があります。

定理(スペクトル定理): 実対称行列 $A$ の固有値はすべて実数であり、異なる固有値に対応する固有ベクトルは互いに直交する。さらに $A$ は直交行列 $Q$ によって対角化できる:

$$ A = Q \Lambda Q^\top $$

ここで $\Lambda = \operatorname{diag}(\lambda_1, \lambda_2, \ldots, \lambda_n)$ は固有値を対角に並べた対角行列、$Q$ の各列が対応する固有ベクトル(正規直交系)です。

これは非常に強力な結果です。一般の正方行列では固有値が複素数になる可能性がありますが、対称行列なら必ず実固有値が得られる点が、機械学習での共分散行列の扱いを安全にしています。

import numpy as np

# 対称行列を定義
A = np.array([[4., 2., -1.],
              [2., 5.,  3.],
              [-1., 3.,  6.]])

# 対称性の確認
print("A == A^T:", np.allclose(A, A.T))  # True

# 固有値・固有ベクトルを計算(numpy.linalg.eigh は対称行列専用)
eigenvalues, eigenvectors = np.linalg.eigh(A)
print("固有値:", eigenvalues)
print("固有ベクトル(列が各ベクトル):\n", eigenvectors)

# Q * Lambda * Q^T で元の行列を復元できるか確認
Q = eigenvectors
Lambda = np.diag(eigenvalues)
A_reconstructed = Q @ Lambda @ Q.T
print("復元誤差:", np.max(np.abs(A - A_reconstructed)))

np.linalg.eigh() は実対称行列(エルミート行列)専用の固有値分解関数で、np.linalg.eig() より数値的に安定しており、固有値を昇順で返します。出力から3点が読み取れます。第一に、固有値がすべて実数として返ってくることが確認できます(対称行列であれば複素数が混じることはありません)。第二に、$Q \Lambda Q^\top$ で元の行列 $A$ が非常に小さな誤差(機械精度程度)で復元され、スペクトル定理が数値的にも成立していることが分かります。第三に、np.linalg.eigh() は固有値を昇順に並べて返すため、最小・最大固有値をすぐに参照できます。

対称行列の固有値が実数であることを確認できました。次に、この固有ベクトルが直交するという性質をさらに発展させた「直交行列」を見ていきます。

直交行列(Orthogonal Matrix)

定義と直感

直交行列は「回転」や「反転」といった等長変換(距離・角度を変えない変換)を行列で表現したものです。

正方行列 $Q$ が次の条件を満たすとき、$Q$ を直交行列と呼びます。

$$ Q^\top Q = Q Q^\top = I $$

これは「$Q$ の転置が $Q$ の逆行列に等しい」ことを意味します。すなわち $Q^{-1} = Q^\top$ です。

列ベクトルで見ると意味が明確になります。$Q$ の列を $\bm{q}_1, \bm{q}_2, \ldots, \bm{q}_n$ とすると、$Q^\top Q = I$ は次を意味します。

$$ \bm{q}_i \cdot \bm{q}_j = \begin{cases} 1 & (i = j) \\ 0 & (i \neq j) \end{cases} $$

つまり各列は長さ1の単位ベクトルであり、かつ互いに直交しています。このような列ベクトルの組を正規直交系と言います。

直交行列の具体例:2次元回転行列

2次元の角度 $\theta$ の回転変換を表す行列は典型的な直交行列です。

$$ R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} $$

$R(\theta)^\top R(\theta) = I$ が成り立つことを確かめてみます。

$$ R(\theta)^\top = \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} $$

$$ R(\theta)^\top R(\theta) = \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} = \begin{pmatrix} \cos^2\theta + \sin^2\theta & 0 \\ 0 & \sin^2\theta + \cos^2\theta \end{pmatrix} = I $$

$\cos^2\theta + \sin^2\theta = 1$ というピタゴラスの定理を使って $I$ になることが確認できました。

直交行列は長さを変えない

左は $200$ 個の点を $35^\circ$ 回転させたものです。青い点群と橙の点群を見比べると、位置は動いていますが、点線で描いた同心円のどこに乗っているかは変わっていません。つまり原点からの距離が保たれています。

右は、変換前後のノルムを散布図にしたものです。全点が完全に $y = x$ の直線上に乗っており、最大のずれは $4.4 \times 10^{-16}$、浮動小数点の丸め誤差の水準です。

長さが保たれるということは、$\|Q\bm{x}\|^2 = (Q\bm{x})^\top (Q\bm{x}) = \bm{x}^\top Q^\top Q \bm{x} = \bm{x}^\top \bm{x} = \|\bm{x}\|^2$ という計算がそのまま図に現れているということです。$Q^\top Q = I$ という定義から、ノルム保存が一行で出てきます。角度(内積)も同じ理屈で保たれるので、直交行列は「形を変えずに向きだけ変える」変換だと理解できます。

直交行列の重要性質:ノルム保存

直交行列 $Q$ による変換はベクトルの長さ(ノルム)を変えません。

$$ \| Q\bm{x} \|^2 = (Q\bm{x})^\top (Q\bm{x}) = \bm{x}^\top Q^\top Q \bm{x} = \bm{x}^\top I \bm{x} = \|\bm{x}\|^2 $$

これが「直交行列は回転と反転しか表せない」という直感の数学的な裏付けです。また直交行列の行列式は必ず $\det(Q) = +1$(回転)または $\det(Q) = -1$(回転+反転)のどちらかになります。

import numpy as np

theta = np.pi / 4  # 45度回転

Q = np.array([[np.cos(theta), -np.sin(theta)],
              [np.sin(theta),  np.cos(theta)]])

print("Q^T Q:\n", Q.T @ Q)
print("det(Q):", np.linalg.det(Q))

# ノルム保存の確認
x = np.array([3.0, 4.0])
Qx = Q @ x
print("元のノルム:", np.linalg.norm(x))      # 5.0
print("変換後のノルム:", np.linalg.norm(Qx)) # 5.0

$Q^\top Q$ が単位行列にほぼ一致し(機械精度誤差以内)、$\det(Q) = +1.0$ と、これが純粋な回転行列であることが数値的に確認できます。また変換前後でノルムが $5.0$ のまま変わらず、直交行列がベクトルの長さを保存することが実際に示されています。

直交行列が「等長変換」であることを見てきました。次は、対角成分だけが非ゼロの三角形状をした行列——計算効率の観点から非常に重要な三角行列を扱います。

三角行列(Triangular Matrix)

上三角行列と下三角行列の定義

三角行列は、行列の半分(対角線より上または下)がすべてゼロである正方行列です。

上三角行列(upper triangular matrix)は対角線より下の成分がすべてゼロ:

$$ U = \begin{pmatrix} u_{11} & u_{12} & u_{13} \\ 0 & u_{22} & u_{23} \\ 0 & 0 & u_{33} \end{pmatrix} $$

下三角行列(lower triangular matrix)は対角線より上の成分がすべてゼロ:

$$ L = \begin{pmatrix} l_{11} & 0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{pmatrix} $$

三角行列と行列式

上三角行列は青の領域(対角より右上)にだけ値があり、下三角行列は緑の領域(対角より左下)にだけ値があります。どちらもオレンジの対角成分は自由です。

右のパネルが三角行列の一番おいしい性質です。行列式が対角成分の積だけで求まります。図の例では $2 \times 5 \times 7 = 70$ で、実際に np.linalg.det で計算しても $70$(浮動小数点なので $69.99999999999996$)になります。

一般の $n$ 次行列式は定義どおりに展開すると $n!$ 個の項の和になり、$n = 20$ なら約 $2.4 \times 10^{18}$ 項という手に負えない数になります。ところが三角行列なら掛け算 $n$ 回で終わります。行列を三角形に分解してしまえば行列式も逆行列も一気に安くなる——これが LU 分解が数値計算の基本道具になっている理由です。

三角行列は「定義だけ知っていても仕方ない」型の行列ではなく、連立方程式の数値解法(LU分解)や統計のコレスキー分解で直接使う実用的な道具です。

三角行列の行列式 = 対角成分の積

三角行列の最も重要な性質は、行列式が対角成分だけで決まることです。

$$ \det(U) = u_{11} \cdot u_{22} \cdots u_{nn} = \prod_{i=1}^{n} u_{ii} $$

下三角行列 $L$ も同様です。行列式の定義(展開)を追うと、ゼロの部分が次々と消えて最終的に対角成分の積だけが残ります。この性質は計算量を劇的に減らします。

import numpy as np

U = np.array([[3., 2., 1.],
              [0., 5., 4.],
              [0., 0., 2.]])

L = np.array([[1., 0., 0.],
              [3., 2., 0.],
              [5., 4., 6.]])

# 行列式の計算
print("det(U):", np.linalg.det(U))
print("対角積(U):", np.prod(np.diag(U)))  # 3*5*2 = 30

print("det(L):", np.linalg.det(L))
print("対角積(L):", np.prod(np.diag(L)))  # 1*2*6 = 12

np.linalg.det(U)np.prod(np.diag(U)) が同じ値(30.0)になることが確認できます。三角行列ではフル展開に頼らなくても対角成分の積だけで行列式が求まるという事実が、数値的にも成立していることが分かります。下三角行列 $L$ でも同様に det(L) == 1×2×6 = 12 となります。

LU分解との関係

実用上、任意の正方行列 $A$ は(ほとんどの場合)下三角行列 $L$ と上三角行列 $U$ の積として書けます:

$$ A = LU $$

これをLU分解と呼びます。連立方程式 $A\bm{x} = \bm{b}$ を解くとき、$LU\bm{x} = \bm{b}$ と分けることで前進代入・後退代入という効率的な数値計算が可能になります。NumPyの np.linalg.solve() はこの仕組みを内部で使っています。

三角行列がいかに「計算を簡単にするか」を理解できました。ここから先は、正方行列の中で最も「使い勝手がよい」——「逆行列を持つ」という条件を満たした行列クラスである正則行列を詳しく見ます。

正則行列とは何か(Invertible / Non-singular Matrix)

「正則行列とは」という問いへの直接の答え

「正則行列とは」という問いに一言で答えると:

逆行列が存在する正方行列のこと。

正方行列 $A$ が正則行列(invertible matrix, non-singular matrix)であるとは、ある行列 $A^{-1}$ が存在して

$$ A A^{-1} = A^{-1} A = I $$

が成り立つことを言います。この $A^{-1}$ を $A$ の逆行列と呼びます。逆に逆行列が存在しない正方行列を特異行列(singular matrix)または非正則行列と呼びます。

この違いは、行列式のところで見た「面積」で捉えるといちばん腑に落ちます。

正則行列と特異行列の違い

左は $\det = 1$ の正則行列で、単位正方形(薄い青)が平行四辺形に変形されますが、面積は残っています。形が変わっただけなので、逆の変換をすれば元に戻せます。

右は $\det = 0$ の特異行列です。$\begin{pmatrix} 1 & 2 \\ 2 & 4 \end{pmatrix}$ は2行目が1行目のちょうど $2$ 倍なので、変換後の平行四辺形は完全に潰れて1本の線分になります。面積は $0$ です。

いったん線分に潰れてしまうと、元の正方形のどの点から来たのかを区別できません。異なる複数の点が同じ点に写ってしまうからです。情報が失われている以上、元に戻す変換は原理的に作れません。これが「$\det = 0$ なら逆行列が存在しない」ことの意味です。

正則行列であるための同値条件

行列 $A$ が正則行列であることと、次の条件はすべて同値(どれか一つが成り立てば全部成り立つ)です。

条件 意味
$A^{-1}$ が存在する 定義そのもの
$\det(A) \neq 0$ 行列式がゼロでない
$A$ の全列が線形独立 列ベクトルが一次独立
$\operatorname{rank}(A) = n$ 行列の階数がフルランク
$A\bm{x} = \bm{0}$ の解が $\bm{x} = \bm{0}$ のみ 零空間が自明
$A$ の固有値にゼロが含まれない $\lambda_i \neq 0$ for all $i$

この同値条件の一覧は「どの視点からも正則性を確認できる」ことを示しており、問題に応じて最も計算しやすい条件を選ぶのが実用的です。

Pythonで正則性を確認する

import numpy as np

# 正則行列の例
A = np.array([[2., 1.],
              [1., 3.]])

# 特異行列の例(行が線形従属)
B = np.array([[1., 2.],
              [2., 4.]])

print("=== 正則行列 A ===")
print("det(A):", np.linalg.det(A))
print("rank(A):", np.linalg.matrix_rank(A))
A_inv = np.linalg.inv(A)
print("逆行列:\n", A_inv)
print("A @ A_inv:\n", np.round(A @ A_inv, 10))

print("\n=== 特異行列 B ===")
print("det(B):", np.linalg.det(B))
print("rank(B):", np.linalg.matrix_rank(B))
# B_inv = np.linalg.inv(B)  # ← これは LinAlgError を出す

出力から重要なことが3点読み取れます。まず $\det(A) = 5 \neq 0$ であり、rank(A) = 2(フルランク)なので $A$ は正則行列で、逆行列が数値的に得られます。$A \cdot A^{-1}$ が単位行列になることで逆行列の正しさを確認できます。次に特異行列 $B$ は行列式がゼロ($1 \times 4 – 2 \times 2 = 0$)で rank(B) = 1 となり、フルランクでないことがわかります。np.linalg.inv(B) を呼ぶと LinAlgError: Singular matrix が送出され、逆行列を求めることができません。

固有値・固有ベクトルと正方行列の関係

なぜ正方行列にしか固有値が定義できないのか

固有値(eigenvalue)と固有ベクトル(eigenvector)は、正方行列にしか定義できない概念です。その理由を直感的に説明します。

行列 $A$ の固有値 $\lambda$ と固有ベクトル $\bm{v}$ は次の方程式で定義されます。

$$ A\bm{v} = \lambda \bm{v}, \quad \bm{v} \neq \bm{0} $$

これは「行列 $A$ を掛けてもベクトルの方向が変わらず、長さだけが $\lambda$ 倍になる特別なベクトル $\bm{v}$」を表しています。

この式を変形すると:

$$ (A – \lambda I)\bm{v} = \bm{0} $$

$\bm{v} \neq \bm{0}$ という非自明解を持つためには、行列 $(A – \lambda I)$ が特異(正則でない)でなければなりません。つまり:

$$ \det(A – \lambda I) = 0 $$

この方程式を特性方程式(characteristic equation)と呼びます。$n$ 次正方行列 $A$ に対して、$\det(A – \lambda I)$ は $\lambda$ の $n$ 次多項式(特性多項式)になり、その $n$ 個の根が固有値 $\lambda_1, \lambda_2, \ldots, \lambda_n$ です(複素数を含め重複を数えれば常に $n$ 個)。

この定式化は「$A$ と $I$ が同じサイズである」——つまり $A$ が正方行列である——ことを前提にしています。

固有ベクトルが何を意味するのかを図で見ておきましょう。

固有ベクトルは向きが変わらない方向

灰色の細い矢印は、単位円上の点が $A = \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}$ によってどこへ動くかを示しています。ほとんどの点は元の位置から向きがずれた場所へ動きます。

ところが太い矢印で示した2方向だけは違います。変換しても向きがまったく変わらず、長さだけが変わります。この方向が固有ベクトルで、長さの倍率が固有値です。この例では $\lambda = 3$($45^\circ$ 方向)と $\lambda = 1$($135^\circ$ 方向)でした。

固有値と行列式・トレースの関係も確認できます。トレースは $2 + 2 = 4$ で固有値の和 $3 + 1 = 4$ に一致し、行列式は $2 \times 2 – 1 \times 1 = 3$ で固有値の積 $3 \times 1 = 3$ に一致します。「トレース=固有値の和」「行列式=固有値の積」という関係が、具体的な数字でも成り立っていることが分かります。

固有値分解(スペクトル分解)の概観

$n$ 次正方行列 $A$ が $n$ 個の線形独立な固有ベクトルを持つとき、$A$ は次のように分解できます。

$$ A = P \Lambda P^{-1} $$

ここで $\Lambda = \operatorname{diag}(\lambda_1, \ldots, \lambda_n)$、$P$ は固有ベクトルを列に並べた行列です。これを固有値分解または対角化と呼びます。

対称行列の場合は $P$ が直交行列 $Q$ になり(前述のスペクトル定理)、$A = Q \Lambda Q^\top$ という特に美しい形になります。

import numpy as np

A = np.array([[4., 2.],
              [1., 3.]])

eigenvalues, P = np.linalg.eig(A)
print("固有値:", eigenvalues)         # [5. 2.]
print("固有ベクトル(列):\n", P)

# 固有値分解から元の行列を復元
Lambda = np.diag(eigenvalues)
A_reconstructed = P @ Lambda @ np.linalg.inv(P)
print("復元誤差:", np.max(np.abs(A - A_reconstructed)))

# 固有値とトレース・行列式の関係を確認
print("固有値の和:", np.sum(eigenvalues))    # トレース = 4+3 = 7 に一致
print("trace(A):", np.trace(A))
print("固有値の積:", np.prod(eigenvalues))   # 行列式 = 4*3-2*1 = 10 に一致
print("det(A):", np.linalg.det(A))

出力からは2つの重要な数値的事実が確認できます。まず $P \Lambda P^{-1}$ で元の行列 $A$ が機械精度以内で復元され、固有値分解が正確に実行されていることが分かります。次に「固有値の和 $= \operatorname{tr}(A) = 7$」「固有値の積 $= \det(A) = 10$」という関係が数値的にも成立しており、トレースと行列式が固有値によって表される理由が直感的に掴めます。

正方行列でしか定義できない量の整理

ここまでに登場した「正方行列にしか定義できない量」を一覧で整理します。非正方行列ではこれらの概念は意味をなしません。

量・概念 記号・関数 正方行列である理由
対角成分 $a_{ii}$, np.diag(A) $i=j$ の要素は行数=列数でないと存在しない
トレース $\operatorname{tr}(A)$, np.trace(A) 対角成分の和なので正方行列のみ
行列式 $\det(A)$, np.linalg.det(A) 置換の積として定義される式が正方行列のみ
逆行列 $A^{-1}$, np.linalg.inv(A) $AA^{-1}=I$ が成立するには正方行列が必要
固有値・固有ベクトル $\lambda$, np.linalg.eig(A) 特性方程式 $\det(A-\lambda I)=0$ が正方行列のみ
対角化 $A = P\Lambda P^{-1}$ 正方行列のみ定義可
べき乗 $A^k$ np.linalg.matrix_power(A, k) 行列の掛け算の定義から正方行列のみ

この表は「正方行列とは」を問われたときの核心を示しています。正方行列はただ「正方形の行列」というだけでなく、線形代数の最重要概念がすべて定義できる場所なのです。

正方行列の特殊クラスの関係図

これまで見てきた特殊クラスをまとめると、以下のような包含関係があります。

正方行列(n×n)
├── 正則行列(det ≠ 0)
│   └── 直交行列(Q^T Q = I, det = ±1)
│       └── 回転行列(det = +1)
├── 特異行列(det = 0)
├── 対称行列(A = A^T)
│   └── 正定値行列(x^T A x > 0)← 共分散行列・ヘッセ行列
├── 三角行列
│   ├── 上三角行列
│   └── 下三角行列
└── 対角行列(三角行列の特別ケース)
    └── 単位行列

注目すべきは、これらのクラスが相互に重なる点です。例えば「単位行列」は対角行列であり、三角行列でもあり、直交行列でもあり、正則行列でもあります。「実対称正定値行列のコレスキー分解」では対称行列を下三角行列の積 $A = LL^\top$ に分解します。

まとめ:正方行列の全体像

本記事では、正方行列($n \times n$ 行列)について次の内容を解説しました。

  1. 定義: 行数と列数が等しい行列。これだけで多くの重要概念が使えるようになる
  2. 対角成分とdiag(): 主対角線上の成分。NumPyでは np.diag() が抽出と生成を両方担う
  3. トレース: 対角成分の和。固有値の和と等しく、機械学習の不確かさ計算に使われる
  4. 行列式: 線形変換の体積拡大率。ゼロかどうかが逆行列の存在を決める
  5. 対称行列: $A = A^\top$。固有値が実数、直交対角化が可能(スペクトル定理)
  6. 直交行列: $Q^\top Q = I$。回転・反転を表し、ノルムを保存する
  7. 三角行列: 半分がゼロ。行列式が対角積で求まり、LU分解の基礎
  8. 正則行列: 逆行列が存在する($\det(A) \neq 0$、フルランク、固有値にゼロなし)
  9. 固有値・固有ベクトル: 特性方程式 $\det(A – \lambda I) = 0$ で定まる。正方行列にしか定義できない
  10. 固有値分解: $A = P\Lambda P^{-1}$。対称行列では $A = Q\Lambda Q^\top$ の直交分解が保証される

正方行列は「行列の王道」です。行列式・逆行列・固有値という線形代数の核心概念がすべて正方行列という舞台の上にあります。次のステップとして、固有値分解を詳しく学ぶと、主成分分析(PCA)やスペクトルクラスタリングへの道が開けます。

画像なし
固有値分解の理論と応用を完全解説する
固有値分解(スペクトル分解)の導出から対角化の条件、PCAや連立微分方程式への応用まで体系的に解説します。
画像なし
行列式の定義と性質を体系的に解説
行列式の定義(置換の符号・余因子展開)、幾何学的意味(体積の拡大率)、ラプラス展開の導出をPythonコードで実証します。