Inverse#
バージョン名: Inverse-14
カテゴリー: 行列
簡単な説明: Inverse 操作は、1 つまたは一連の正方可逆行列の逆行列または随伴行列 (共役転置) を計算します。
詳細な説明: Inverse 操作は、正方行列の逆行列を計算します。
N 次元の正方行列
ここで、\(I は n 次元単位行列です。
逆行列は、入力行列が逆行列である (逆行列定理のいずれかのプロパティーを満たす) 場合にのみ存在します。その場合、逆が存在し一意になります。ただし、行列が可逆でない場合、操作により例外が発生するか、未定義の結果となる可能性があります。並列処理と異なるデータタイプの実装により、異なるデバイス上の同じ入力データに対して、若干異なる結果が返される場合があります。
この操作により、随伴行列の逆行列を計算できます。
非複素数の正方行列
ここで、
adjoint == true の場合、アルゴリズムの出力は (A^{T})^{-1} で表すことができます。
アルゴリズムの定式化:
この操作では、部分ピボットを使用した LU 分解を使用して逆行列 (または随伴行列) を計算します。
注
LU 分解は、行列
注
注
LU 分解を使用すると、単純な線形方程式を 2 つのさらに単純な線形方程式に置き換えることができます。
アルゴリズムの疑似コード:
元の行列
から始めます。 のデータタイプが f32 でない場合、丸め誤差の蓄積を避けるため f32 に変換します。初期行列を行列
にコピーします。行列 を単位行列 (すべての対角要素が 1 に設定されたゼロ行列) に初期化します。adjoint == true の場合、U を直接コピーではなく、初期行列の転置に設定します。
部分ピボットを使用して LU 分解を実行します。
入力行列の各列に対してこの手順を繰り返します。
c を現在処理中の列のインデックスとします。
指定された列内で最高値を持つ行のインデックスを検索し、pivot とします。
の場合、 の pivot と c 行を入れ替えます。 についても繰り返します。標準的なガウス消去法を実行します。
逆関数を得るには、前述のように
の各列を解きます。線形方程式
を y について解く (前方置換)線形方程式
を x について解く (後方置換)x を出力逆行列
の対応する列に設定します
計算された行列を返します。f32 から元の要素タイプに戻します。
属性:
随伴
説明: 操作の戻り値を変更します。true の場合、この操作は逆行列を求める代わりに、入力行列の随伴行列 (共役転置) を返します。
値の範囲: true、false
true
- 随伴行列を出力します。false
- 逆行列を出力します。
タイプ: bool
デフォルト値 : false
必須: いいえ
入力:
1: input - 入力正方行列を表す形状 [B1、B2、…、Bn、ROW、COL] およびタイプ T のテンソル。最も内側の 2 つの次元は正方行列を形成し、同じサイズでなければなりません。B1、B2、…、Bn は、任意の量のバッチ次元を表します (単一の行列入力の場合は 0 にすることができます)。必須。
出力:
1: output - 入力と同じタイプ T および入力と同じ形状 [B1、B2、…、Bn、ROW、COL] を持つテンソル。入力行列の逆行列 (または共役行列) を表します。
タイプ
T: サポートされている浮動小数点タイプ。f32 以外のタイプは、この操作を実行する前に f32 に変換され、その後、丸め誤差の蓄積を避けるために元の入力タイプに戻されます。
例 1: 2D 入力行列。
<layer ... name="Inverse" type="Inverse">
<data/>
<input>
<port id="0" precision="FP32">
<dim>3</dim> <!-- 3 行の正方行列 -->
<dim>3</dim> <!-- 3 列の正方行列 -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>3</dim> <!-- 3 行の正方行列 -->
<dim>3</dim> <!-- 3 列の正方行列 -->
</port>
</output>
</layer>
例 2: 1 つのバッチ次元と adjoint=true を持つ 3D 入力テンソル。
<layer ... name="Inverse" type="Inverse">
<data adjoint="true"/>
<input>
<port id="0" precision="FP32">
<dim>2</dim> <!-- バッチサイズ 2 -->
<dim>4</dim> <!-- 4 行の正方行列 -->
<dim>4</dim> <!-- 4 列の正方行列 -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>2</dim> <!-- バッチサイズ 2 -->
<dim>4</dim> <!-- 4 行の正方行列 -->
<dim>4</dim> <!-- 4 列の正方行列 -->
</port>
</output>
</layer>
例 3: 3 つのバッチ次元を持つ 5D 入力テンソル。
<layer ... name="Inverse" type="Inverse">
<data/>
<input>
<port id="0" precision="FP32">
<dim>5</dim> <!-- バッチサイズ 5 -->
<dim>4</dim> <!-- バッチサイズ 4 -->
<dim>3</dim> <!-- バッチサイズ 3 -->
<dim>2</dim> <!-- 2 行の正方行列 -->
<dim>2</dim> <!-- 2 列の正方行列 -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>5</dim> <!-- バッチサイズ 5 -->
<dim>4</dim> <!-- バッチサイズ 4 -->
<dim>3</dim> <!-- バッチサイズ 3 -->
<dim>2</dim> <!-- 2 行の正方行列 -->
<dim>2</dim> <!-- 2 列の正方行列 -->
</port>
</output>
</layer>