このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
ハードウェア効率に優れた 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 の行が送られるまでの遅延を設定して、上流のブロックの処理時間をエミュレートできます。rowDelay
が 0
に設定されているときは、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 = 8.2641e-07
mlint の警告は非表示にします。
%#ok<*NOPTS>