Inverse#

バージョン名: Inverse-14

カテゴリー: 行列

簡単な説明: Inverse 操作は、1 つまたは一連の正方可逆行列の逆行列または随伴行列 (共役転置) を計算します。

詳細な説明: Inverse 操作は、正方行列の逆行列を計算します。

N 次元の正方行列 A の逆行列 A1 は次のように定義されます:

AA1=A1A=I

ここで、\(I は n 次元単位行列です。

逆行列は、入力行列が逆行列である (逆行列定理のいずれかのプロパティーを満たす) 場合にのみ存在します。その場合、逆が存在し一意になります。ただし、行列が可逆でない場合、操作により例外が発生するか、未定義の結果となる可能性があります。並列処理と異なるデータタイプの実装により、異なるデバイス上の同じ入力データに対して、若干異なる結果が返される場合があります。

この操作により、随伴行列の逆行列を計算できます。

非複素数の正方行列 A の随伴行列 (共役転置) adj(A) は、次のように簡単に定義されます:

adj(A)=AT

ここで、ATA の転置行列です。

adjoint == true の場合、アルゴリズムの出力は (A^{T})^{-1} で表すことができます。

アルゴリズムの定式化:

この操作では、部分ピボットを使用した LU 分解を使用して逆行列 (または随伴行列) を計算します。

LU 分解は、行列 A を 2 つの行列LU に分解します。ここで、L はすべての対角要素が 1 である下三角行列で、U は上三角行列です。

A=LU
det(A)=det(L)det(U)=1det(U)=det(U)

Aの逆行列を計算するには、LU 分解で n 個の単純線形方程式のセットを解くだけで十分です。単純な線形方程式は Ax=b です。ここで、x と b はベクトルであり、x は方程式の解です。目標は、行列 A1 の i 番目の列となる x を計算することです。これを行うには、値が 1 である i 番目のスポットを除いて、b をゼロのベクトルとします (この場合、b は行列 I の i 番目の列になります)。x ベクトルが行列 A1 を作成し、b ベクトルが単位行列を作成することがわかります。

AA1=IA1=[x1&x2&...&xn],Axi=bi,bicoli(I)

LU 分解を使用すると、単純な線形方程式を 2 つのさらに単純な線形方程式に置き換えることができます。

Ax=bLUx=bLy=b,Ux=y

アルゴリズムの疑似コード:

  1. 元の行列 A から始めます。A のデータタイプが f32 でない場合、丸め誤差の蓄積を避けるため f32 に変換します。

  2. 初期行列を行列 U にコピーします。行列 L を単位行列 (すべての対角要素が 1 に設定されたゼロ行列) に初期化します。

    • adjoint == true の場合、U を直接コピーではなく、初期行列の転置に設定します。

  3. 部分ピボットを使用して LU 分解を実行します。

    • 入力行列の各列に対してこの手順を繰り返します。

    • c を現在処理中の列のインデックスとします。

    • 指定された列内で最高値を持つ行のインデックスを検索し、pivot とします。

    • pivotc の場合、Lpivotc 行を入れ替えます。U についても繰り返します。

    • 標準的なガウス消去法を実行します。

  4. 逆関数を得るには、前述のように A1 の各列を解きます。

    • 線形方程式 Ly=b を y について解く (前方置換)

    • 線形方程式 Ux=y を x について解く (後方置換)

    • x を出力逆行列 A1 の対応する列に設定します

  5. 計算された行列を返します。f32 から元の要素タイプに戻します。

属性:

  • 随伴

    • 説明: 操作の戻り値を変更します。true の場合、この操作は逆行列を求める代わりに、入力行列の随伴行列 (共役転置) を返します。

    • 値の範囲: truefalse

      • 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>