主要内容

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

这个例子展示了如何使用复杂突发QR分解块实现一个硬件高效的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的列数

生成矩阵A和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);

提取经济规模Q

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

Q = C ';

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

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 >