行列計算

行列計算

執筆済 科学計算線形代数

数値線形代数。科学計算の中核。

BLAS と LAPACK#

内容
BLAS Level 1 ベクトル同士(内積、スケール)
BLAS Level 2 行列 × ベクトル
BLAS Level 3 行列 × 行列
LAPACK 分解、固有値、連立方程式

Level 3 が最も効率が良い。

演算回数メモリアクセス=O(n3)O(n2)=O(n)

データ 1 個あたりの計算量が多いほど、 メモリ帯域の制約から逃れられる。 そのためアルゴリズムを行列積の形に持ち込むのが定石。

実装が性能を決める#

同じ O(n3) でも、 素朴な三重ループと OpenBLAS では100 倍以上違う。

技法 効果
ブロック化(タイリング) キャッシュに収まる単位で処理
SIMD 複数要素を同時演算
マルチスレッド コアを使い切る
プリフェッチ メモリ待ちを隠す

自分で行列積を書かない。 既存の実装を使う。

分解#

分解 用途
LU 連立一次方程式
QR 最小二乗、直交化
コレスキー 正定値対称。LU の半分のコスト
固有値分解 固有値
SVD 低ランク近似、擬似逆行列、主成分分析

逆行列を作らない#

python
x = np.linalg.inv(A) @ b     # 遅く、精度も悪い
x = np.linalg.solve(A, b)    # こちら

逆行列を明示的に求めるのは 計算量が多く、誤差も増える。 連立方程式として解くのが常に正しい。

条件数#

κ(A)=AA1

条件数が大きい(悪条件)と、 入力のわずかな誤差が解を大きく狂わせる。

δxxκ(A)δbb

κ1016 なら 倍精度の有効数字が全部失われる。 解が出たことと、その解が正しいことは別。

参考文献#

ノート一覧を閉じる