Main Content

ストリーミング逆行列 System object の HDL コード生成

この例では、HDL Coder™ でサイズの構成が可能なストリーミング モードの逆行列演算を実装する方法を示します。

行列の逆行列とは

行列 X は、XY = YX = I となる同じサイズの行列 Y が存在する場合に可逆となります (I は単位行列)。この行列 Y を X の逆行列と呼びます。逆行列のない行列は特異行列です。正方行列は、行列式が正確にゼロの場合のみ特異行列となります。

逆行列の計算手順は次のとおりです。

  1. 余因子行列の計算

  2. 余因子行列の転置

  3. 入力行列の行列式の逆数と転置した余因子行列の乗算

:

             A = [4 12 -16;12 37 -43;-16 -43 98];
Cofactors of 'A' will be calculated from matrix of minors
        cof(A) = [1777 488 76;488 136 20;76 20 4];
Transpose of cofactor matrix will be
     (cof(A))' = [1777 488 76;488 136 20;76 20 4];
Multiply reciprocal of determinant of 'A' with transpose of cofactor matrix
          Ainv = (1/det(A)) * (cof(A))'
               = [49.3611 -13.5556 2.1111;-13.5556 3.7778 -0.5556;2.1111 -0.5556 0.1111];

逆行列: ガウス ジョルダン消去法

ガウス ジョルダン消去法を使用して行列 A の逆行列を求めるには、A を単位行列 (I) に変形する基本行演算を求め、同じ演算を単位行列 (I) に対して実行して Ainv を取得しなければなりません。

ガウス ジョルダン消去法を使用した逆行列の計算: 最初に行列 A を記述し、その横に [A | I] として単位行列を記述します。

目的は、行変換を適用して A を単位行列にし、右側の行列 I も行変換に加えて最終的に Ainv を得ることです。

Ainv の計算手順は次のとおりです。

  1. 行を入れ替える

  2. 対角要素を 1 にする

  3. 非対角要素を 0 にする

:

                    (A)       (I)
                  1  2  3 | 1  0  0
      [A | I] =   2  5  3 | 0  1  0
                  1  0  8 | 0  0  1
Find the element with maximum value in the first column and swap the current
row with maximum element row
          swap R1 and R2 rows as R2 contains the largest values.
                  2  5  3 | 0  1  0
              =   1  2  3 | 1  0  0
                  1  0  8 | 0  0  1
Make the diagonal element in the first column as '1'
          R1 --> R1/2
                  1 2.5 1.5 | 0 0.5 0
              =   1   2   3 | 1   0 0
                  1   0   8 | 0   0 1
Make the non-diagonal elements in the first column as '0'
          R2 --> R2 - R1
          R3 --> R3 - R1
                  1  2.5 1.5 | 0  0.5 0
              =   0 -0.5 1.5 | 1 -0.5 0
                  0 -2.5 6.5 | 0 -0.5 1
Now column 1 has diagonal elements '1' and other elements as
'0'. This procedure is repeated for remaining columns and matrix A
will be reduced to identity matrix, Identity matrix will be reduced to Ainv.
                  1  0  0 | -40  16   9
              =   0  1  0 |  13  -5  -3
                  0  0  1 |   5  -2  -1
                    (I)        (Ainv)

逆行列: コレスキー分解

コレスキー分解を使用した逆行列では、対称正定値行列のみがサポートされます。正定値とは、行列のすべての固有値が正となることを意味します。

次の対称正定値行列 A について考えます。

           A   = L * L',             L  is the lower triangular matrix
                                     L' is the transpose of L
       inv(A)  = inv(L * L')
               = inv(L') * inv(L)
               = (inv(L))' * inv(L)
       Ainv    = Linv' * Linv,       Linv is the inverse of lower triangular matrix
                                     Ainv is the inverse of input matrix

Ainv の計算手順は次のとおりです。

  1. 下三角行列の計算 (L)

  2. 下三角行列の逆行列の計算 (Linv)

  3. Linv と転置した Linv の乗算

:

             A = [4 12 -16;12 37 -43;-16 -43 98];
Lower triangular matrix(L) will be computed using cholesky decomposition
             L = [2 0 0;6 1 0;-8 5 3];
Linv will be computed using forward substitution method
          Linv = [0.5 0 0;-3 1 0;6.3333 -1.6667 0.3333];
Multiply transpose of Linv with Linv
          Ainv = Linv' * Linv
               = [49.3611 -13.5556 2.1111;-13.5556 3.7778 -0.5556;2.1111 -0.5556 0.1111];

ガウス ジョルダン消去法を使用する利点

  • ガウス ジョルダン消去法はすべての正方行列をサポートします。

  • ガウス ジョルダン消去法は singledouble の両方のデータ型をサポートします。

コレスキーの実装の制限

  • 逆行列を計算する行列は対称正定値でなければなりません。

  • 行列の入力データ型は single でなければならず、ブロックを Native Floating Point モードで使用しなければなりません。

  • 入力行列のサイズは 64 行 64 列まででなければなりません。

Matrix Inverse のサブシステムのインターフェイス:

Matrix Inverse の端子の説明:

Matrix Inverse の実装

このモデル例には、InputSubsystemMatrixInverse、および OutputSubsystem の 3 つのサブシステムがあります。上流の InputSubsystem は、ready 信号がイネーブルの場合に行列入力を処理モジュールに直列化するモジュールです。下流の OutputSubsystem は、outEnable 信号がイネーブルの場合に処理モジュールから行列出力にデータを逆シリアル化するモジュールです。MatrixInverse は、逆行列演算を実装する処理モジュールです。

open_system('hdlcoder_streaming_mat_inv_max_lat_cholesky');
open_system('hdlcoder_streaming_mat_inv_max_lat_gauss_jordan');

逆行列のタイミング図:

完全なシステムのタイミング図:

処理段階のタイミング図 (コレスキー分解):

処理段階のタイミング図 (ガウス ジョルダン消去法):

Modelsim の結果の波形 (コレスキー分解)

Modelsim の結果の波形 (ガウス ジョルダン消去法)

Matrix Inverse ブロックのパラメーター:

MatrixSize      : Enter size of input matrix as a positive integer.
LatencyStrategy : Select latency strategy from drop down menu
                   ({'ZERO, 'MIN', 'MAX'}) which should be same as HDL coder
                   latency strategy. User can see processing latency
                   based on the latency strategy.
AlgorithmType   : Select algorithm type from drop down menu({'CholeskyDecomposition',
                   'GaussJordanElimination'})

Matrix Inverse ブロックの使用方法

  1. MATLAB System ブロックのブロック パラメーターを設定します。

  2. 行列のサイズに基づいて入力行列を選択します。

  3. MatrixInverse サブシステムの HDL コードを生成します。

生成コードと生成モデル

MatrixInverse サブシステムのコード生成の実行後、次のようなコードが生成されます。

生成されるモデルには MatrixInverse MATLAB System ブロックが含まれます。modelsim シミュレーションで、コード生成の出力が MATLAB System ブロックの出力と比較されます。

合成の統計

コレスキー分解

ガウス ジョルダン消去法

関連リンク