ハードウェア効率に優れた Real Burst Matrix Solve Using Q-less QR Decomposition の実装
この例では、Real Burst Matrix Solve Using Q-less QR Decomposition ブロックを使用して、実数値の行列方程式 A'AX=B に対するハードウェア効率に優れた解を実装する方法を示します。
行列の次元の定義
行列 A の行数、行列 A の列数と行列 B の行数、および行列 B の列数を指定します。
m = 100; % Number of rows in A n = 10; % Number of columns in A and rows in B p = 1; % Number of columns in B
行列の生成
この例では、補助関数 realRandomQlessQRMatrices
を使用して、問題 A'AX=B の乱数行列 A と B を生成します。生成される行列について、A と B の要素は -1 ~ +1、A のランクはフル ランクとします。
rng('default')
[A,B] = fixed.example.realRandomQlessQRMatrices(m,n,p);
固定小数点データ型の選択
補助関数 realQlessQRMatrixSolveFixedpointTypes
を使用して、入力行列 A と B、および出力 X に対して、計算時のオーバーフローの可能性が低くなる固定小数点データ型を選択します。
max_abs_A = 1; % Upper bound on max(abs(A(:)) max_abs_B = 1; % Upper bound on max(abs(B(:)) precisionBits = 24; % Number of bits of precision T = fixed.realQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,precisionBits); A = cast(A,'like',T.A); B = cast(B,'like',T.B); OutputType = fixed.extractNumericType(T.X);
モデルを開く
model = 'RealBurstQlessQRMatrixSolveModel';
open_system(model);
このモデルの Data Handler サブシステムは、実数行列 A と B を入力として取ります。A と B の行を AMBA AXI ハンドシェイク プロトコルを使用して QR ブロックに送ります。validIn
信号はデータが使用可能であることを示します。ready
信号はブロックでデータを受け入れ可能であることを示します。validIn
信号と ready
信号の両方が High の場合にのみデータの転送が行われます。Data Handler に A の行が送られてから B の行が送られるまでの遅延を設定して、上流のブロックの処理時間をエミュレートできます。rowDelay
が 0 に設定されているときは、Data Handler に使用可能なデータが常にあることを示すため、validIn
は High のままになります。
モデル ワークスペースの変数の設定
補助関数 setModelWorkspace
を使用して、上記で定義された変数をモデル ワークスペースに追加します。これらの変数は、Real Burst Matrix Solve Using Q-less QR Decomposition ブロックのブロック パラメーターに対応します。
numSamples = 1; % Number of samples rowDelay = 1; % Delay of clock cycles between feeding in rows of A and B fixed.example.setModelWorkspace(model,'A',A,'B',B,'m',m,'n',n,'p',p,... 'regularizationParameter',0,... 'numSamples',numSamples,'rowDelay',rowDelay,'OutputType',OutputType);
モデルのシミュレーション
out = sim(model);
出力データからの解の構成
Real Burst Matrix Solve Using Q-less QR Decomposition ブロックは一度に 1 行ずつデータを出力します。結果の行が出力されると、ブロックは validOut
を true に設定します。X の行は計算された順に最後の行から出力されるため、結果を解釈するにはデータを再構成しなければなりません。出力データから行列 X を再構成するには、補助関数 matrixSolveModelOutputToArray
を使用します。
X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p);
出力の精度の検証
Real Burst Matrix Solve Using Q-less QR Decomposition ブロックの精度を評価するには、相対誤差を計算します。
relative_error = norm(double(A'*A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 6.4973e-04