Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ハードウェア効率に優れた Complex Partial-Systolic Q-less QR Decomposition の実装

この例では、Complex Partial-Systolic Q-less QR Decomposition ブロックを使用して、ハードウェア効率に優れた Q-less QR 分解を実装する方法を示します。

サイズを抑えた Q-less QR 分解

Complex Partial-Systolic Q-less QR Decomposition ブロックは、行列方程式 A'AX = B を解く最初のステップとして A をインプレースで上三角 R に変換してから、変換したシステム R'RX = B を解きます。ここで、R'R = A'A です。

行列の次元の定義

行列 A の行数と列数を指定します。

m = 5;  % Number of rows in matrix A
n = 3;  % Number of columns in matrix A

行列 A の生成

補助関数 complexUniformRandomArray を使用して、乱数行列 A を生成します。A の要素の実数部と虚数部は -1 ~ +1、A のランクはフル ランクとします。

rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);

固定小数点データ型の選択

補助関数 qlessqrFixedpointTypes を使用して、行列 A に対して、A から R へのインプレースの変換でオーバーフローが発生しないことを保証する固定小数点データ型を選択します。

A の要素の実数部と虚数部は -1 ~ 1 であるため、任意の要素が取りうる最大絶対値は sqrt(2) です。

max_abs_A = sqrt(2);  % Upper bound on max(abs(A(:))
precisionBits = 24;   % Number of bits of precision
T = fixed.qlessqrFixedpointTypes(m,max_abs_A,precisionBits);
A = cast(A,'like',T.A);

モデルを開く

model = 'ComplexPartialSystolicQlessQRModel';
open_system(model);

AMBA AXI ハンドシェーキング プロセス

このモデルの Data Handler サブシステムは、実数行列 A を入力として取ります。A の行を AMBA AXI ハンドシェイク プロトコルを使用して QR Decomposition ブロックに送ります。validIn 信号はデータが使用可能であることを示します。ready 信号はブロックでデータを受け入れ可能であることを示します。validIn 信号と ready 信号の両方が High の場合にのみデータの転送が行われます。Data Handler に A の行が送られるまでの遅延を設定して、上流のブロックの処理時間をエミュレートできます。rowDelay0 に設定されているときは、Data Handler に使用可能なデータが常にあることを示すため、Data Handler の validOut 信号は High のままになります。

モデル ワークスペースの変数の設定

補助関数 setModelWorkspace を使用して、上記で定義された変数をモデル ワークスペースに追加します。これらの変数は、Complex Partial-Systolic Q-less QR Decomposition ブロックのブロック パラメーターに対応します。

numSamples = 1; % Number of sample matrices
rowDelay = 1; % Delay of clock cycles between feeding in rows of A
fixed.example.setModelWorkspace(model,'A',A,'m',m,'n',n,...
    'numSamples',numSamples,'rowDelay',rowDelay);

モデルのシミュレーション

out = sim(model);

出力データからの解の構成

Complex Partial-Systolic QR Decomposition ブロックは、各タイム ステップで行列 R を出力します。有効な結果の行列が出力されると、ブロックは validOut を true に設定します。

R = out.R;

R は上三角行列です。

R
R = 

   2.1863 + 0.0000i   0.6427 - 1.0882i  -0.5771 - 0.3089i
   0.0000 + 0.0000i   1.8126 + 0.0000i   0.2095 + 0.0599i
   0.0000 + 0.0000i   0.0000 + 0.0000i   1.7760 + 0.0000i

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 29
        FractionLength: 24
isequal(R,triu(R))
ans =

  logical

   1

出力の精度の検証

Complex Partial-Systolic Q-less QR Decomposition ブロックの精度を評価するには、相対誤差を計算します。

relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error =

   9.2898e-07

mlint の警告は非表示にします。

%#ok<*NOPTS>