主要内容

实现硬件高效的真实突发QR分解

这个例子展示了如何使用Real Burst QR分解块实现硬件高效的QR分解。

经济规模QR分解

Real Burst QR Decomposition块首先求解最小二乘矩阵方程AX = B,将A in-place变换为R, B in-place变换为C = Q'B,然后求解变换后的系统RX = C,其中QR为A的正交三角分解。

为了计算独立的QR分解,本例将B设置为单位矩阵,以便Real Burst QR分解块的输出是上三角R和C = Q'。

定义矩阵维度

指定矩阵A和B的行数,矩阵A的列数和矩阵B的列数。本例将B设为与矩阵A的行数相同大小的单位矩阵。

M = 10;矩阵A和B中的行数%N = 3;矩阵A中的列数P = m;%矩阵B中的列数

生成矩阵A和B

使用helper函数realUniformRandomArray生成一个随机矩阵a,使得a的元素在-1到+1之间,且a是满秩的。矩阵B是单位矩阵。

rng (“默认”) A = fixed.example.realUniformRandomArray(-1,1,m,n);B =眼睛(m);

选择定点数据类型

使用helper函数qrFixedpointTypes为矩阵A和矩阵B选择定点数据类型,保证在A in-place转换为R和B in-place转换为C = Q'B时不发生溢出。

max_abs_A = 1;max(A(:))的上限max_abs_B = 1;max(B(:))的上限precisionBits = 24;%精度位数T = fixed.qrFixedpointTypes(m,max_abs_A,max_abs_B,precisionBits);A = cast(A,“喜欢”, T.A);B = cast(B,“喜欢”、肺结核);

打开模型

模型=“RealBurstQRModel”;open_system(模型);

该模型中的Data Handler子系统以实矩阵A和B作为输入。它使用AMBA AXI握手协议将A行和B行发送到QR块。的validIn信号表示数据可用。的准备好了信号表示该块可以接受该数据。数据的传输只发生在两个validIn而且准备好了信号很高。您可以在Data Handler中设置a行和B行的输入之间的延迟,以模拟上游块的处理时间。validIn保持高rowDelay设置为0,因为这表示数据处理程序始终有可用数据。

在模型工作区中设置变量

使用helper函数setModelWorkspace将上面定义的变量添加到模型工作区。这些变量对应于Real Burst QR分解块的块参数。

numSamples = 1;样本矩阵的个数rowDelay = 1;在A行和B行进料之间的时钟周期延迟%fixed.example.setModelWorkspace(模型,“一个”一个,“B”B“米”米,“n”n“p”、磷、...“numSamples”numSamples,“rowDelay”, rowDelay);

模拟模型

Out = sim(型号);

从输出数据构造解决方案

Real Burst QR分解块每次输出一行数据。当输出结果行时,块设置validOut为true。矩阵R和C的行以相反的顺序输出,以适应反向替换,因此必须重新构造数据以解释结果。要从输出数据重构矩阵R和C,请使用helper函数qrModelOutputToArray

[C,R] = fixed.example.qrModelOutputToArray(out.C,out.R,m,n,p,numSamples);

提取经济规模的Q

块计算C = Q'B。在这个例子中,B是单位矩阵,所以Q = C'是QR分解的经济规模正交因子。

Q = c ';

验证Q是正交的,R是上三角的

Q是正交的,所以Q'Q是舍入内的单位矩阵。

I = q '* q
I = 1.0000 -0.0000 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 1.0000 DataTypeMode:定点:二进制点缩放signness: Signed WordLength: 62 FractionLength: 48

R是一个上三角矩阵。

R
R = 2.2180 0.8559 -0.5607 0 2.0578 -0.4017 0 0 1.7117 DataTypeMode:定点:二进制点缩放signdness: Signed WordLength: 29 FractionLength: 24
isequal (R, triu (R))
Ans =逻辑1

验证输出的准确性

为了评估真实爆发QR分解块的准确性,计算相对误差。

相对误差= norm(double(Q*R - A))/norm(double(A))
Relative_error = 1.5886e-06

抑制mlint警告。

% #好< * NOPTS >