这个例子展示了如何使用复杂突发QR分解块实现一个硬件高效的QR分解。
复杂的破裂QR分解块执行的第一步解决最小二乘矩阵方程AX = B转换一个就地R和B就地C = Q ' B,然后解决了转换系统RX = C, QR的orthogonal-triangular分解。
为了计算独立的QR分解,本示例设置B为单位矩阵,因此Complex Burst QR分解块的输出是上三角R和C = Q'。
指定矩阵A和B的行数、矩阵A的列数和矩阵B的列数。本例将B设置为与矩阵A的行数相同大小的单位矩阵。
m = 10;%矩阵A和B的行数n = 3;%矩阵A的列数p = m;%矩阵B的列数
使用helper函数complexUniformRandomArray
生成一个随机矩阵a,使a的元素的实部和虚部在-1和+1之间,且a是满秩的。矩阵B是单位矩阵。
rng (“默认”) A = fixed.example.complexUniformRandomArray(-1,1,m,n);B =眼(m);
使用helper函数qrFixedpointTypes
为矩阵A和B选择定点数据类型,以保证在A就地转换为R、B就地转换为C = Q'B时不会发生溢出。
A元素的实部和虚部在-1和1之间,所以任何元素的最大可能绝对值是√2。
max_abs_A = sqrt (2);% max上限(abs(A(:)))max_abs_B = 1;% max的上限(abs(B(:)))precisionBits = 24;%精确位数T = fixed.qrFixedpointTypes (m, max_abs_A, max_abs_B precisionBits);一个=投(,“喜欢”, T.A);B =复杂(cast (B,“喜欢”、肺结核));
模型=“ComplexBurstQRModel”;open_system(模型);
该模型中的Data Handler子系统以复杂矩阵A和B作为输入。的准备好了
端口触发数据处理程序。发送true后validIn
信号,可能有一些延迟之前准备好了
设置为false。当数据处理程序检测到准备好了
信号,块设置validIn
为true时,发送A和b的下一行准备好了
检测信号,确保所有数据都得到处理。
使用helper函数setModelWorkspace
将上面定义的变量添加到模型工作区中。这些变量对应于复突发QR分解块的块参数。
numSamples = 1;%样本矩阵个数fixed.example.setModelWorkspace(模型,“一个”一个,“B”B“米”米,“n”n“p”、磷、...“numSamples”, numSamples);
= sim(模型);
复突发QR分解块每次输出一行数据。当输出结果行时,块设置validOut
为true。矩阵R和C的行以相反的顺序输出,以适应反向替换,因此必须重构数据来解释结果。要从输出数据重建矩阵R和C,请使用helper函数qrModelOutputToArray
.
[C R] = fixed.example.qrModelOutputToArray (out.C out.R, m, n, p, numSamples);
块计算C = Q'B。在这个例子中,B是单位矩阵,所以Q = C'是QR分解的经济规模正交因子。
Q = C ';
Q是正交的,所以Q'Q是舍入的单位矩阵。
我=问' * Q
DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 60 FractionLength: 48 . DataTypeMode: Fixed-point: binary point scaling
R是上三角矩阵。
R
R = 3.1655 + 0.00000 i 0.4870 + 1.80 i 0.1466 - 0.9092i 0.0000 + 0.00000 i 2.2184 + 0.00000 i -0.2159 - 0.0972i 0.0000 + 0.00000 i 0.0000 + 0.00000 i 0.0000 + 0.00000 i 2.2903 + 0.00000 i DataTypeMode:固定点:二进制点缩放符号:Signed: WordLength: 29 FractionLength: 24
isequal (R, triu (R))
逻辑1
评估复突发QR分解块的精度,计算相对误差。
relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error = 1.7960 e-06
抑制mlint警告。
% #好< * NOPTS >