このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ハードウェア効率に優れた 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 の行が送られるまでの遅延を設定して、上流のブロックの処理時間をエミュレートできます。rowDelay
が 0
に設定されているときは、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>