Main Content

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

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

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

Real Burst 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 の生成

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

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

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

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

max_abs_A = 1;      % 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 = 'RealBurstQlessQRModel';
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 を使用して、上記で定義された変数をモデル ワークスペースに追加します。これらの変数は、Real Burst 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,...
    'regularizationParameter',0,...
    'numSamples',numSamples,'rowDelay',rowDelay);

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

out = sim(model);

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

Real Burst Q-less QR Decomposition ブロックは一度に 1 行ずつデータを出力します。結果の行が出力されると、ブロックは validOut を true に設定します。行列 R の行は後退代入に合わせて逆の順序で出力されるため、結果を解釈するにはデータを再構成しなければなりません。出力データから行列 R を再構成するには、補助関数 qlessqrModelOutputToArray を使用します。

R = fixed.example.qlessqrModelOutputToArray(out.R,m,n,numSamples);

R は上三角行列です。

R
R = 

    1.5379    0.0432   -0.1395
         0    1.5978    0.4742
         0         0    1.5192

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

  logical

   1

出力の精度の検証

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

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

   9.4841e-07

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

%#ok<*NOPTS>