主要内容

利用无q QR分解实现硬件高效的实部分收缩矩阵求解

这个例子展示了如何使用无q QR分解块实现实值矩阵方程a 'AX=B的实部分收缩矩阵求解的硬件高效解。

前后代入

当上三角因子准备好时,用当前输入B计算正向和反向替换以产生输出X。

$$ X = R_k\setminus(R_k'\setminus B)$$

定义矩阵维度

指定矩阵A的行数,矩阵A的列数和B的行数,矩阵B的列数。

M = 30;A中的行数N = 10;A中的列数和B中的行数P = 1;B中列数的%numInputs = 3;A和B矩阵个数的%

生成矩阵

对于本例,使用helper函数realRandomQlessQRMatrices为问题A'AX=B生成随机矩阵A和B。生成的矩阵是这样的:A和B的元素在-1和+1之间,A是满秩的。

rng (“默认”) [A,B] = fixed.example.realRandomQlessQRMatrices(m,n,p);如果numInputs > 1i = 2:numInputs [Atemp,Btemp] = fixed.example.realRandomQlessQRMatrices(m,n,p);A = cat(3,A,Atemp);B = cat(3,B,Btemp);结束结束

选择定点数据类型

使用helper函数realQlessQRMatrixSolveFixedpointTypes对输入矩阵A和B选择定点数据类型,对输出矩阵X选择定点数据类型,使计算过程中溢出的概率低。

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

打开模型

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

AMBA AXI握手过程

该模型中的Data Handler子系统以实矩阵A和B作为输入。它使用AMBA AXI握手协议将A行和B的完整矩阵发送到QR分解块。的validIn信号表示数据可用。的准备好了信号表示该块可以接受该数据。数据的传输只发生在两个validIn而且准备好了信号很高。您可以在Data Handler中为A行的输入和B矩阵的输入设置延迟,以模拟上游块的处理时间。validInA而且validInB保持高aDelay而且bDelay设置为0因为这表明数据处理程序总是有可用的数据。当发送所有矩阵A和B时,数据处理程序循环回第一个矩阵A和B。

异步矩阵求解器

该块异步操作。首先对输入矩阵A进行无q QR分解,将得到的R矩阵放入缓冲区。然后,向前向后替换块使用输入的B矩阵和缓冲的R矩阵计算R'RX = B,因为R矩阵和B矩阵分别存储在缓冲区中,所以上游的无q QR分解块和下游的向前向后替换块可以独立运行。当第一个R和B矩阵可用时,向前向后替换块开始处理。然后它使用最新缓冲的R和B矩阵连续运行,而不管无q QR分解块的状态如何。例如,如果上游块停止提供A和B矩阵,则正向向后替换块继续使用最后一对R和B矩阵生成相同的输出。

数据处理程序迭代地将A和B矩阵发送到QR分解块。在发出最后一个A矩阵之后,数据处理程序重置其内部计数器并发出第一个A矩阵。B矩阵以类似的方式处理。

在模型工作区中设置变量

使用helper函数setModelWorkspace将上面定义的变量添加到模型工作区。这些变量对应于使用无q QR分解块的真实部分收缩矩阵求解的块参数。

numOutputs = 10;输出记录的百分比aDelay = 1;在A行之间进料的时钟周期延迟%bDelay = 1;在B矩阵中进料之间的时钟周期延迟%fixed.example.setModelWorkspace(模型,“一个”一个,“B”B“米”米,“n”n“p”、磷、...“regularizationParameter”0,...“aDelay”aDelay,“bDelay”bDelay,...“numOutputs”numOutputs,“OutputType”, OutputType);

模拟模型

Out = sim(型号);

从输出数据构造解决方案

使用无q QR分解块的实部分收缩矩阵求解在每个时间步输出矩阵X。当输出一个有效的结果矩阵时,块设置validOut为true。

X = out.X;

验证输出的准确性

为了评估使用无q QR分解块的实部分收缩矩阵求解的精度,计算相对误差。选择模拟的最后一个输出。

X = double(X(:,:,end));

通过找到产生X的输入A和B,使最后的输出X与输入同步。

A = double(A);B = double(B);relative_errors = 0 (size(A,3),size(B,3));k = 1:size(A,3)g = 1:尺寸(B, 3) relative_errors (k, g) =规范((:,:,k)”* (:,:,k) * X - B (:,:, g)) /规范(B (:,:, g));结束结束[AUsed, bus] = find(relative_errors==min(relative_errors,[],“所有”))% #好< NOPTS >relative_error =标准(双((:,:,因为)*(:,:,因为)* X - B(:,:,用)))/规范(双(B(:,:,用)))% #好< NOPTS >
AUsed = 3 bus = 2 relative_error = 8.1385e-05