主要内容

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

此示例演示如何使用实突发QR分解块实现硬件高效的QR分解。

经济规模QR分解

实突发QR分解块执行求解最小二乘矩阵方程AX=B的第一步,该方程将A就地转换为R,B就地转换为C=Q'B,然后求解转换后的系统RX=C,其中QR是A的正交三角分解。

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

定义矩阵维度

指定矩阵A和B中的行数、矩阵A中的列数和矩阵B中的列数。此示例将B设置为与A中的行数相同大小的单位矩阵。

m=10;%矩阵A和B的行数n=3;%矩阵A中的列数p=m;%矩阵B中的列数

生成矩阵A和B

使用helper函数RealUniformRandomaray酒店生成一个随机矩阵a,使a的元素介于-1和+1之间,a为满秩。矩阵B是单位矩阵。

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

选择定点数据类型

使用helper函数QRFixedPointType为矩阵A和B选择定点数据类型,以保证在A就地转换为R、B就地转换为C = Q'B时不会发生溢出。

最大绝对值=1;%max(abs(A(:)上的上界)max_abs_B = 1;%max(abs(B(:)上的上界)精度位=24;%精确位数T = fixed.qrFixedpointTypes (m, max_abs_A, max_abs_B precisionBits);一个=投(,“喜欢”, T.A);B =投(B,“喜欢”,T.B.);

打开模型

模型=“RealBurstQRModel”; 开放式系统(模型);

该模型中的数据处理子系统采用实矩阵A和B作为输入准备好了端口触发数据处理程序。在发送truevalidIn信号,之前可能有一些延迟准备好了设置为false。当数据处理程序检测到准备好了信号,块设置validIn设置为true,并发送A和B的下一行。此协议允许在准备好了检测到信号,确保所有数据均已处理。

在模型工作区中设置变量

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

numSamples = 1;%样本矩阵个数fixed.example.setModelWorkspace(模型,“A”A.“B”B“米”M“n”N“p”P...“numSamples”,numSamples);

模拟模型

out=sim(型号);

从输出数据构造解决方案

实突发QR分解块一次输出一行数据。当输出结果行时,该块设置瓦利多特为true。矩阵R和C的行以相反的顺序输出,以适应反向替换,因此必须重构数据来解释结果。要从输出数据重建矩阵R和C,请使用helper函数qrModelOutputToArray.

[C,R]=固定的.example.qrmodelOutputOArray(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
DataTypeMode:定点:二进制点缩放Signedness: Signed WordLength: 60 FractionLength: 48

R是上三角矩阵。

R
R=2.2180 0.8559-0.5607 0 2.0578-0.4017 0 1.7117数据类型模式:定点:二进制点缩放符号性:符号字长:28分位数长度:24
isequal(R,triu(R))
逻辑1

验证输出的准确性

为了评估实际突发QR分解块的精度,计算相对误差。

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

抑制mlint警告。

%#好的<*NOPTS>