BLV脉动阵列实现矩阵SVD分解

理论上,由于噪声的存在,自相关矩阵是正定的,而对于对称正定阵,它的奇异值分解等价于于特征值分解。

在之前看到的论文中,有用单边jacobi算法来求出矩阵特征值及特征向量,我在matlab上并没有实现,其中有条求theta的公式不知原作者是怎么得到的,在看了BLV阵列的文章后决定来用BLV阵列求特征值和特征向量。
BLV脉动阵列的方法如下,假设一n阶矩阵(n为偶数,若n为奇数可以加一行和一列“0”元素),将其分成(n/2)²个单元,每个单元是一个2x2阶的子矩阵。1.首先处理对角线上子矩阵,求出对应的theta_l和theta_r,并使用双边jacobi旋转(如果是对称阵则theta_l与theta_r相等)。
图1
图2
2.第二步,在上一步求出的theta_l和theta_r分别向行和列传递,非对角线上的二阶子矩阵在接受的角度theta后同样做双边jacobi旋转,使其对角化,如图1。
3.第三步,在所有子矩阵完成对角化后,交换元素位置,完成一轮操作;
交换规则如下:
图3
4.第四步,判断非对角元素是否收敛,若收敛则停止算法,否则返回第一步。
BLV脉动阵列图:
图4
其中,粗箭头表示传递角度theta细箭头表示元素交换位置
一开始,我也没有搞懂如何交换元素,举个例子吧,4x4阶矩阵交换元素的结果如下:
图5
经过,这样的计算就可以求出矩阵的奇异值,但是矩阵的特征向量还没有求出,
在我看到的另一篇文章中(针对对称阵)采用了修正的BLV脉动阵列的特征向量求解方法。方法如下:
首先初始给出一个n阶单位矩阵,和求解特征值时一样,将单位阵分成2x2的子矩阵。修正的BLV脉动阵列图如下(6阶阵为例):
图6
其中,theta1,theta2,theta3为算法第一步中求出的对角线上子矩阵的角度theta。求特征向量的方法和求奇异值一样,首先对所有子矩阵旋转,右乘R(θ);然后交换元素位置,完成一轮操作。交换规则如下:
图7

图8
下面为matlab计算结果:
输入矩阵A=[1 2 3 4;2 5 6 7;3 6 8 9;4 7 9 10];
matlab的SVD函数结果:在这里插入图片描述
BLV阵列计算结果:
在这里插入图片描述
结果正确。
BLV脉动阵列方法优点:计算简单,并行度高,利于FPGA上实现且迭代次数少。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值