此示例演示如何使用实突发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中的列数
使用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);
块计算C=Q'B。在本例中,B是单位矩阵,因此Q=C'是QR分解的经济规模正交因子。
Q=C';
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>