[英]manual calculation of pseudo inverse is not same as pinv in matlab
我有一个矩阵D,它是m * n,我正在使用公式inv(D'* D)* D'计算伪逆,但它不会产生与pinv(D)相同的结果。我需要inv( D'* D),我需要进行增量操作。 我所有的准确性取决于不正确的inv(D'* D)。 是否有其他方法可以准确获得inv(D'* D)? 有人可以帮我吗?
%D是我从一个博客复制而来的3x4矩阵,仅用于演示目的。 实际上,我的原始版本也有相同的问题,因为它的尺寸太大,我无法在此处发布。
D = -[1/sqrt(2) 1 1/sqrt(2) 0;0 1/sqrt(2) 1 1/sqrt(2);-1/sqrt(2) 0 1/sqrt(2) 1];
B1 = pinv(D)
B2 = D'*inv(D*D')
B1 =
-0.353553390593274 0.000000000000000 0.353553390593274
-0.375000000000000 -0.176776695296637 0.125000000000000
-0.176776695296637 -0.250000000000000 -0.176776695296637
0.125000000000000 -0.176776695296637 -0.375000000000000
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
1.904842e-017.
B2 =
-0.250000000000000 0 0.500000000000000
-0.500000000000000 0 0
0.250000000000000 -0.500000000000000 0
0 0 -0.750000000000000
我需要inv(D'D)进行增量操作。 实际上,在我在步骤1中遇到的问题中,每次将新行添加到D的最后一个位置,而在步骤2中,D的第一行将被删除。 所以我想使用我在这两个步骤之前计算的逆来找到最终的D逆。 更精确地在这里看看:
B = inv(D'*D); % if i can calculate it accurately then further work is as follows
D1 = [D;Lr]; %Lr is last row to be added
BLr = B-((B*Lr'*Lr*B)/(1+Lr*B*Lr')); % Row addition formula
Fr = D1(1,:); % First row to be removed
D2 = removerows(D1,1);
BFr = BLr+ ((BLr*Fr'*Fr*BLr)/(1-Fr*BLr*Fr')); % row deletion formula
B = BFr;
Y = BFr*D2;
您用于Moore-Penrose伪逆的公式(D ^ TD)^-1 D ^ T或D ^ T(DD ^ T)^-1仅在D具有完整的列或完整的行秩时才有效。
在您的情况下,情况并非如此,因为警告“矩阵接近单数”显示。
即使矩阵没有完整的行或完整的列秩,matlab pinv命令也适用于任意D。
尝试在矩阵上运行cond(D)
并查看条件编号是多少 。 数字越高,矩阵的状态越差。 同样,您可以运行cond(D'*D)
。 矩阵可以是全等级的,但仍然是病态的。 在纸上,病态矩阵仍然是可逆的。 但是,当您尝试将计算机上的病态矩阵直接求逆时,由量化和其他影响引起的小精度误差可能会在解决方案中导致难以预测的结果。
由于上述原因,通常有比直接计算逆数更好的方法(数值上更稳定)来实现目标。 其中许多涉及矩阵分解技术,例如SVD 。 如果您帮助我们理解了为什么需要inv(D'*D)
,将使您更容易找到合适的选择。 例如,如果只需要伪逆,则继续使用pinv()
,即使它与inv()
结果有所不同。 该pinv()
函数和\\ (mldivide)
反斜杠运营商都远远超过数值稳定工具inv()
请参阅http://www.mathworks.com/help/matlab/ref/pinv.html上的官方文档。
如果A x = pinv(A) * b
,则解x = pinv(A) * b
产生最小范数解,但x = A\\b
不会。 参见上面链接的数值示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.