高速インバース3×3に関する最初の質問について考えてみます。検討する
A=⎡⎣⎢abcdefghi⎤⎦⎥
行列は小さく、非常に一般的であるため(要素の既知の構造、ゼロ、相対スケールを備えていない)、次のような任意のスケール()のアルゴリズムを提供することは不可能だと思いますAのエントリに関する事前の情報がない限り、9つの要素のうちそれぞれに2つの融合フロップが必要であり、すべての製品は一意であるため、18の融合フロップよりも高速です。
ここに、1/det(A)AA − 1 det (A )= adj (A )= [ e i − f h d i − f g g e − d h b i − c h a i − c g a h − b g c e − b f a f − c d a ea,…,i
あ− 1det (A )= adj (A )= ⎡⎣⎢e i − fhb i − c hc e − b fdi − fga i − c gF− c dge − dha h − b ga e − b d⎤⎦⎥
adj (A ) アジュゲート(補因子の転置)を示します。これは本質的に「任意スケール」の逆行列です(逆行列が存在する場合)。
ただし、一部の計算は計算に再利用できます。最初の列に展開すると(さらに5つの選択肢があります):
注意してください(* )は評価中にすでに計算されてい。したがって、行列式の逆数は、4つの追加の融合フロップで計算できます(逆数が1フロップと見なされる場合)。det (A )
det (A )= a (e i − fh )+ b (fg− di )+ c (dh − ge )= a (e i − fh )∗− b (di − fg)∗− c (ge − dh )∗
adj (A )1 / det (A )
これで、各9要素は、すでに取得した行列式の逆数によってスケーリングされ、さらに9つの融合フロップが追加されます。adj (A )
そう、
- 18個の融合フロップでを計算しadj (A )
- 計算融合3には、すでに計算のエントリを使用してプdet (A )adj (A )
- を見つけます(1フロップと仮定)。1det (A )
- すでに計算された各要素を、別の9つの融合フロップでによってスケーリングし。adj (A )1det (A )
その結果、18 + 3 + 1 + 9 = 31のフューズドフロップになります。行列式の計算方法については説明していませんが、フロップをさらに1つ節約できると思います。または、ステップ3でのチェックを実行するために使用できます。ここで、は縮退(不可逆)ケースの許容誤差であり、結果として32のフューズフロップになります(1フロップと仮定)。ϵ| det(A) | >ϵεif
残りの計算はすべて一意であるため、一般的な行列の逆行列を計算する高速な方法はないと思います。スピードの観点から、ケーリー・ハミルトンいけないの助けを使用して、一般的のように、それはの計算が必要になりますためにA 2 3 × 33 × 3あ23 × 3他のいくつかの演算の他に行列。
注意:
- この答えは数値の安定性を扱いません
- ベクトル化とメモリアクセスパターンの最適化の可能性についても説明されていません