ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ハードウェア効率に優れた Complex Burst QR Decomposition の実装

この例では、Simulink® でハードウェア効率に優れた MATLAB® コードを使用して、複素数行列の QR 分解を計算する方法を実証します。このモデルでは、QR 分解アルゴリズムの手順全体で演算リソースを共有します。したがって、全体的なスループットをある程度犠牲にしますが、使用するオン チップ リソースは完全にパイプライン化された方法よりも少なくなります。

QR 分解を使用して行列方程式を解く

行列方程式を解く際に、逆行列を計算する必要は (あるとしても) ほとんどありません。[1][3]Complex Burst QR Decomposition ブロックは、次の方程式を解くハードウェア効率に優れた方法を提供します。

ここで、 は m 行 n 列の複素行列、 は n 行 p 列の複素行列、 は m 行 p 列の複素行列です。この方程式は、一連の直交変換を通じて

のフォームに変換できます。ここで、 は m 行 n 列の複素数の上三角行列です。 は、 であるような、m 行 m 列の複素数の直交行列です。Complex Burst QR Decomposition は、 のゼロ以外の行と、それに対応する の行のみを保持します。

ギブンス回転を使用して完全に実行することができるため、QR 分解は固定小数点のアーキテクチャに非常に適しています。これらの固定小数点実装は CORDIC アルゴリズムの観点から効率性に優れています。固定小数点の QR 分解に関するアルゴリズムの詳細については、CORDIC を使用した QR 分解の実行を参照してください。この例で使用される Simulink モデルは次のとおりです。

fxpdemo_complex_burst_QR_model

このモデルは、固定小数点、double、single、およびスケーリングされた double データ型で動作します。

Complex Burst QR Decomposition の入力パラメーター

Complex Burst QR Decomposition ブロックは 4 つの入力パラメーターを取ります。このブロックのマスクを次に示します。

MATLAB ワークスペースの変数に入力データを割り当てなければなりません。このアルゴリズムをカスタマイズするには、以降の節で使用される手順に従ってデータを変更します。

行列の次元の定義

モデルのアーキテクチャは、QR 分解を実行するのに要するデータを格納するために必要な最小メモリを割り当てます。そのため、入力行列のサイズがコンパイル時に既知でなければなりません。ここで、m は複素行列 AB の行数で、nA の列数、pB の列数です。

さらに、ブロックでは不定数の行列の分解を順番に処理できるため、サンプル数が指定されます。モデルは、すべてのサンプルが使用されると終了します。

m = 4;
n = 4;
p = 4;
num_samples = 100;

入力データ型の定義

入力データを生成する前に、次に示すように行列データのデータ型を指定することが重要です。この例では、16 ビットの語長と非整数のデータ型をもつ符号付きの固定小数点データ型を使用します。4 行 4 列の複素行列の場合、出力型には入力データの整数部分でのデータ増加に対応するために追加の 3 ビットが必要です。詳細については、Use Hardware-Efficient Algorithm to Solve Systems of Complex-Valued Linear Equations を参照してください。

word_length = 16;
qr_growth_bits = 3;
fraction_length = word_length - 1;
nt = numerictype(1,word_length + qr_growth_bits,fraction_length)
nt =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 19
        FractionLength: 15

CORDIC の反復回数の定義

ギブンス回転の CORDIC 近似は、反復ごとに精度のビット数が追加される反復アルゴリズムです。符号付きの固定小数点データ型の場合、実行される反復数が語長より 1 少ないときに最高の精度を実現します。

NumberOfCORDICIterations = nt.WordLength - 1
NumberOfCORDICIterations =

    18

ランダム データの初期化

この例のデータ ハンドラーは、複素行列 AB を入力として取ります。この例では、AB は、-1 から 1 までの一様分布から得た乱数行列の要素として定義されます。AB はそれぞれ 3 次元配列として定義されます。ここで、各サンプル行列は最初の 2 つの次元に格納されます。

A = fi(complex(2*rand(m,n,num_samples) - 1, 2*rand(m,n,num_samples) - 1),nt);
B = fi(complex(2*rand(m,p,num_samples) - 1, 2*rand(m,p,num_samples) - 1),nt);

Complex Burst QR Decomposition へのデータの転送

ready 端子によってデータ ハンドラー サブシステムがトリガーされます。ready が High の場合、ブロックは validIn をアサートし、AB の次の行を aInbIn に送信します。データ転送プロトコルにより、ready が High の場合はいつでもデータを送信することができ、すべてのデータが確実に処理されます。ready が High でないときにデータが送信された場合、そのデータは処理されません。

出力の処理

Complex Burst QR Decomposition は一度に 1 行ずつデータを出力します。ブロックが結果行を出力するたびに、validOut をアサートします。rOut の行を出力し、cOut の行を出力します。後退代入時に使用される自然順であるため、行は逆の順序で出力されます。この例では、それらは (m * num_samples)n 列の行列として保存され、行は受信された順に並べられます。

シミュレーション

sim fxpdemo_complex_burst_QR_model

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

データは逆の順序で出力されるため、結果を解釈するにはデータを再構成しなければなりません。次のコードはデータを正しい順序に配置します。

C = cell(1,num_samples);
R = cell(1,num_samples);
for ii = 1:num_samples
    C{ii} = flipud(C_Out((ii-1)*m + 1:ii*m,:));
    R{ii} = flipud(R_Out((ii-1)*m + 1:ii*m,:));
end

結果の精度の評価

バースト QR 分解の精度を評価するには、'Complex QR Burst Decomposition' ブロックを使用する行列方程式の解と、MATLAB® に組み込みまれた double 用のバックソルブを使用して取得された解の間の差の大きさを調べます。各サンプルの絶対誤差と条件数をプロットします。このデータは、解の精度が想定どおりに条件数を追跡していることを示しています。[2]

xAct = cell(1,num_samples);
xExp = cell(1,num_samples);
xErr = zeros(1,num_samples);
condNumber = zeros(1,num_samples);
for ii = 1:num_samples
    xAct{ii} = double(R{ii})\double(C{ii});
    xExp{ii} = double(A(:,:,ii))\double(B(:,:,ii));
    xErr(ii) = norm(xAct{ii} - xExp{ii});
    condNumber(ii) = cond(double(A(:,:,ii)));
end
figure(1)
clf
h1 = subplot(2,1,1);
hold on;
h1.YScale = 'log';
plot(xErr)
grid on
title('Error of ''Complex Burst QR Decomposition''');
ylabel('norm(R\\C - A\\B)');
h2 = subplot(2,1,2);
hold on;
h2.YScale = 'log';
plot(condNumber);
grid on
title('Condition Number of Samples');
ylabel('cond(A)');
xlabel('Test Point');
linkaxes([h1,h2],'x');

モデルを閉じる

close_system fxpdemo_complex_burst_QR_model

参考文献

[1] George E. Forsythe, M.A. Malcom and Cleve B. Moler.Computer Methods for Mathematical Computations.Englewood Cliffs, N.J.:Prentice-Hall, 1977.

[2] Cleve B. Moler.Cleve's Corner:What is the Condition Number of a Matrix?, The MathWorks, Inc. 2017.

[3] Cleve B. Moler.Numerical Computing with MATLAB.SIAM, 2004. isbn:978-0-898716-60-3.

%#ok<*NASGU,*NOPTS>