主要内容

实现Hardware-Efficient QR分解使用CORDIC收缩期数组

这个例子展示了如何使用hardware-efficient计算矩阵的QR分解在仿真软件MATLAB®代码®。金宝app

解决方程组或计算最小二乘解矩阵方程AX = B使用QR分解,计算R和Q ' B, QR = a, RX =问' B。R是一个上三角矩阵和Q是一个正交矩阵。如果你只是想Q和R,然后设置B单位矩阵。

在这个例子中,R是计算从矩阵运用吉文斯转换使用CORDIC算法。从矩阵B C =问计算可能会运用相同的吉文斯转换。该算法只使用迭代变化和增加执行这些计算。

有关更多信息,在本例中,使用的算法使用CORDIC执行QR分解

概述

在这个例金宝app子中使用的仿真软件模型是:

fxpdemo_real_4x4_systolic_array_QR_model

进入自己的输入矩阵,A和B,打开相应的块参数使子系统模块。模型仿真后,返回输出矩阵,计算Q ' b和C = R的工作区。您可以指定CORDIC的迭代的数量的块参数转置(Q) * B R 4 x4真正CORDIC心动阵列子系统。如果输入是固定的点,那么CORDIC的迭代的数量必须小于这个词的长度。计算的准确性为每个迭代改进一点,单词长度的输入。

该模型将与定点、双和单一数据类型。

算法执行如何分解,面具下的转置(Q) * B R 4 x4真正CORDIC心动阵列子系统。矩阵的注释表明哪些行正在动手术归零sub-diagonal元素。收缩压数组设置为一个4×4矩阵a,但可以扩展到任何尺寸遵循了同样的模式。这个实现只能与实际输入矩阵。

看到MATLAB函数中的MATLAB代码块执行使用CORDIC吉文斯转换,继续看下块面具。

在本例中,行和列的数量必须是4。矩阵B必须有4行和任意数量的列。

使用QR解矩阵方程Ax = B

第一步在解决矩阵方程AX = B是计算RX =问' B, R是上三角,Q是正交和Q * R =。

以下输入双精度浮点类型,所以设置迭代次数是52岁,是位尾数的数量翻倍。

格式NumberOfCORDICIterations = 52个;兰德(4,4)= 2 * 1;兰德(4,4)B = 2 * 1;

模拟模型来计算R和C = Q ' b。

sim卡fxpdemo_real_4x4_systolic_array_QR_modelR C
R = 1.5149 -0.0519 1.7292 -0.3224 0.9593 -0.0259 -0.0879 0 0 0.2565 - 1.0888 0 0 0 -0.6429 C = 0.5942 -0.2382 0.0676 -0.9370 -0.8887 0.6146 -0.5758 0.3051 0.1725 0.7339 0.5409 0.5374 0.8540 1.1078 -0.2183 -0.5620

验证back-substituting R和C = Q ' b和MATLAB给出相同的结果。

X = R \ C X_should_be = \ B
X = -7.1245 -12.1131 -0.6637 1.4236 -0.8779 0.7572 -0.5511 0.3545 6.3113 10.1759 0.6673 -1.6155 -1.3283 -1.7231 0.3396 0.8741 X_should_be = -7.1245 -12.1131 -0.6637 1.4236 -0.8779 0.7572 -0.5511 0.3545 6.3113 10.1759 0.6673 -1.6155 -1.3283 -1.7231 0.3396 0.8741

内置的标准区别MATLAB和CORDIC QR的解决方案应该小。

规范(X - X_should_be)
ans = 2.6739 e-14

计算Q和R

计算Q和R,使B等于单位矩阵。当B =单位矩阵,那么Q = C”。

NumberOfCORDICIterations = 52个;兰德(4,4)= 2 * 1;B =眼睛(大小(A, 1),“喜欢”,);sim卡fxpdemo_real_4x4_systolic_array_QR_modelQ = C ';

理论QR分解QR = =,所以计算QR和之间的差异要小。

规范(Q * R - A)
ans = 2.2861 e15汽油

QR并不是唯一的

QR分解是唯一的迹象R的行和列的问:你可以做一个独特的QR分解,使R的对角元素都是正面的。

D =诊断接头(标志(诊断接头(R)));Qunique = Q * D Runique = D * R
Qunique = -0.3086 0.1224 -0.1033 -0.9376 -0.6277 -0.7636 -0.0952 0.1174 -0.5573 0.3930 0.7146 0.1559 0.4474 -0.4975 0.6852 -0.2877 Runique = 1.4459 -0.8090 0.1547 0.3977 1.1441 0.0809 -0.2494 0 0 0 0 0 0.1894 0.8193 0.4836

然后你可以从模型来比较计算QR QR装入的MATLAB函数。

[Q0, R0] = qr (A);D0 =诊断接头(符号(诊断接头(R0)));Q0 = Q0 * D0 R0 = D0 * R0
Q0 = -0.3086 0.1224 -0.1033 -0.9376 -0.6277 -0.7636 -0.0952 0.1174 -0.5573 0.3930 0.7146 0.1559 0.4474 -0.4975 0.6852 -0.2877 R0 = 1.4459 -0.8090 0.1547 0.3977 1.1441 0.0809 -0.2494 0 0 0 0 0 0.1894 0.8193 0.4836

使用定点Hardware-Efficient实现

使用定点输入数据类型生产高效HDL代码ASIC和FPGA设备。

有关如何选择定点数据类型的更多信息,不会溢出,引用的例子使用CORDIC执行QR分解

您可以运行许多测试输入通过模型A和B通过三维数组。

n_test_inputs = 100;

下一节定义了随机输入的矩阵A和B 1和1之间的比例,所以设置定点单词长度为18位和部分长度14位,以便增长QR分解和中间计算CORDIC算法。

word_length = 18;fraction_length = 14;

best-precision CORDIC的迭代的数量的字长- 1。如果CORDIC的迭代的数量设置为小于word_length - 1,那么接下来准备好信号延迟和时钟将短,但它不会那么准确。CORDIC的迭代的数量不应设置任何更大,因为生成的代码不支持变化的单词长度大于定点类型。金宝app

NumberOfCORDICIterations = word_length - 1
NumberOfCORDICIterations = 17

随机测试输入连接,k,时刻的输入是一个(:,:,k)和B (:,:, k)。的每个元素A和B是一个统一的随机变量1和+ 1之间。

= 2 *兰德(4 4 n_test_inputs) 1;

选择B单位矩阵Q = C”。

B =眼(4);B = repmat (B, 1, 1, n_test_inputs);

给定点,铸像。

= fi (1、word_length fraction_length);B =投(B,“喜欢”,);

模拟模型

sim卡fxpdemo_real_4x4_systolic_array_QR_model

计算并画出错误

norm_error = 0(1、大小(R, 3));k = 1:尺寸(R, 3) Q_times_R_minus_A =双(C (:,:, k))的*双(R (:,:, k)) -双((:,:,k));norm_error (k) =规范(Q_times_R_minus_A);结束

错误应该在10 ^ 3的顺序。

clf情节(norm_error“啊——”网格)标题(“规范(QR - A)”)

% #好< * NASGU, * NOPTS >