計算量¶
行列式を使う場合¶
A−1=∣A∣1A~ から計算する場合、おそらくO(n5)かかる(行列式の計算にO(n3) + 余因子行列にO(n5))
行列式の計算量
(1) 愚直に計算した場合 → O(n×n!)
∣A∣=σ∈Sn∑sgn(σ)a1σ(1)a2σ(2)⋯anσ(n) という行列式の定義から、置換の集合Snの要素数がn!個あり、各項でn回anσ(n)を掛けるのでO(n×n!)
(2) 効率化した場合 → O(n3)
「行列Aのi行から、j行の定数倍を引いても、行列式の値は変わらない。」という性質を使って上三角行列に変形してから行列式を計算する。三角行列への変換はO(n3)、上三角行列の行列式は対角成分の積なのでO(n)なので、全体でO(n3)になる
(参考:Tech Tips: 行列式の計算)
余因子行列の計算量
(i,j)余因子は「『i行目とj列目を除いた行列』の行列式に(−1)i+jをかけたもの」なので、n−1次行列の行列式を求める計算になり、O((n−1)3)
余因子行列は「(i,j)余因子をi,j成分に持つ行列を転置したもの」なので、(i,j)余因子をn×n個計算する必要がある→O((n−1)3×n2)か?
掃き出し法による計算¶
O(n3)かかるとされる
教科書的な方法でありながら、行列分解による方法と計算量が大差ない(=結構効率的)
LU分解してから解く¶
A=LUに分解し、Ly=b、Ux=yを順に解く(直接解法)
LU分解におよそn3/3回の計算が発生し、A−1の計算におよそ2n3/3回の計算が発生する(伊理・藤野 1985)
3n3+32n3=33n3=n3 よってO(n3)
行列が対称正定値行列のときのみ使える方法¶
正規方程式のXTXのような行列のみ使える。統計や機械学習では身近
コレスキー分解¶
LU分解の代わりにコレスキー分解A=LLTを用いることで計算量をLUの約半分にできる(分解についてO(n3/6))
共役勾配法¶
連立一次方程式
のxを求めることは、二次形式
f(x)=21xTAx−bTx の最小化と一致するので、f(x)の最小値を探索する方法で解を求める方法を 共役勾配(conjugate gradient: CG)法 という
連立1次方程式:共役勾配法 - PukiWiki for PBCG Lab
Aが対称正定値行列の場合、共役勾配法が利用可能(行列計算における高速アルゴリズム)
ただし、共役勾配法などの反復解法全般の特徴として以下がある
参考文献¶
伊理正夫 & 藤野和建 (1985) 『数値計算の常識』