作者:桂。
時間:2017-10-26 07:11:02
鏈接:http://www.cnblogs.com/xingshansi/p/7735016.html
前言
主要記錄特征值分解的硬件實現思路。
一、實數矩陣轉化
在FPGA運算中,對實數運算通常優於對復數運算。假設C為復數矩陣:C= A+iB;且
C = CH
從而A = AT;B = -BT;若C的奇異值
所對應的奇異向量為u + iv,且滿足:

對應有:

借助矩陣形式表示:

根據A、B的性質,存在:

一個NxN的Hermitian矩陣分解,轉化為2Nx2N的實對稱矩陣分解。
二、Jacobi算法(Givens旋轉)
對於對稱矩陣:

其中Givens參數:

該公式可進一步轉化:$tan(2theta) = 2a_{ij}/(a_{jj}-a_{ii})$;theta可以借助cordic算法求解。
此處可以借助Cordic求解角度,也可以利用CORDIC求根號的思路進行sin、cos的計算:

aii= 1; ajj = 3; aij = 1.2; tan_2 = (2*aij/(ajj-aii)); theta = 1/2*atan(tan_2); tao = 1/tan_2; t = sign(tao)/(abs(tao)+sqrt(1+tao.^2)); cos_1 = 1/sqrt(1+t^2) cos_1_new = cos(theta) sin_1 = t/sqrt(1+t^2) sin_1_new = sin(theta)
使用Givens旋轉左乘A,可以得到對角陣,右乘同樣可以得出。只使用左乘\右乘的Givens旋轉稱為單邊Givens旋轉。與之不同,對nxn對稱矩陣A同時采用左乘、右乘的方法,稱為雙邊Givens旋轉。
具體代碼實現,參見:印象筆記-005常用算法-0020Jacobi算法。
借助之前SVD實現矩陣求逆的思路,矩陣求逆的硬件實現,也可以在此基礎上直接實現。(此處實對稱矩陣,利用:特征向量x特征值取反x特征向量轉置,即完成矩陣求逆)
clc;clear all; x = rand(4,100)*20+1i*rand(4,100)*20; R = x*x'/100; A = real(R); B = imag(R); R_cat = [A -B;B A]; [D,V]=Jacobi(R_cat); % V = V'; U_est = V(1:4,1:2:end)+1i*V(5:end,1:2:end); D0 = diag(D); D0 = 1./D0(1:2:end); R_inv = U_est*diag(D0)*U_est'
三、並行拆解思路
對於nxn的矩陣分解,一種思路是尋找矩陣所有非對角元素中絕對值較大者進行雙邊Jacobi變換,使得該非對角線元素變為0.接着進行第二次變換,直到收斂至精度要求,O(n2)復雜度。
另一種是固定計算順序的方法(術語:循環Jacobi,cycle Jacobi),簡單粗暴且便於在硬件上實現(行/列):

假設矩陣維度為8,經過一次迭代的計算順序可表示為:

仿真驗證參考:Jacobi並行拆解
對於維度為N的矩陣,每一行的N/2個都可以並行,遍歷一次(專業術語:Sweep)需要N-1個周期。對於N維度的矩陣,排序的順序為:

如N = 10,除去1,2追溯到4,3追溯到2,5追溯到3.......依次類推。
S_0:(1,2)-(3,4)-(5,6)-(7,8)-(9,10)
S_1:(1,4)-(2,6)-(3,8)-(5,10)-(7,9)
......

BLV Array for N=8. Data transmission is represented as solid arrows and rotation parameters transmission with unfilled arrows.
