最近在做波达方向的估计的研究,其中涉及到了奇异矩阵的逆,直接通过matlab中的pinv()和inv()计算得到的结果误差较大,于是就诞生了这篇文章,当然,全文并非全部原创。奇异矩阵的求逆主要有三种方法:直接求解;SVD分解;QR分解,下面分别看看这三种方法的具体实现。并附上自己解决的问题,仅供大家参考。
① 直接求解:
求导,令导数为0,结果如下: InvA=(ATA)-1AT
% 直接求伪逆
InvA = inv(A'*A)*A';
② SVD求解
%% SVD分解求伪逆
% 原理和公式:1. SVD分解得到的矩阵:U和V是正交阵,S是对角阵
% 2. 正交阵的逆=转置
% 3. 对角阵的逆=非零元素求倒
% Step1: 求解A的SVD分解
[U,S,V] = svd(A); % A = U*S*V'
% Step2: 将S中的非零元素求倒
T=S;
T(find(S~=0)) = 1./S(find(S~=0));
% Step3: 求invA
svdInvA = V * T' * U';
③ QR求解
%% QR分解求伪逆
% 适用于稀疏矩阵
% 原理和公式:1. QR分解得到的矩阵:Q是正交阵,R是非奇异上三角阵
% 2. 正交阵的逆=转置
% 3. 上(下)三角矩阵的逆也仍然是上(下)三角矩阵。不必用高斯消去法,向前替换法解方程。
% 但是具体的我不知道怎么用程序来写,这里仍旧用了matlab的函数。
[Q,R] = qr(A);
InvR = inv(R'*R)*R';
qrInvA =InvR*Q';
解决的问题:
通过(22)和(23)式要求psai_x和psai_y,但是和
是 异矩阵,通过matlab中的pinv()和inv()函数计算的结果误差较大,于是通过上面提到的三种计算奇异矩阵的伪逆的方法很好的解决了我的问题。
参考文献:
(1)Two-Dimension Direction-of-Arrival Estimation for Massive MIMO Systems
(2)Low Complexity Direction of Arrival (DoA) Estimation for 2D Massive MIMO Systems
(3)http://www.blogbus.com/shijuanfeng-logs/238839798.html