3

我遵循wiki上的公式:

http://en.wikipedia.org/wiki/Pseudo_inverse

计算伪逆,但我无法收到正确的结果。例如:我想找到theta方程:Y=R*theta,我在matlab上写:

R = -[1/sqrt(2) 1 1/sqrt(2) 0;0 1/sqrt(2) 1 1/sqrt(2);-1/sqrt(2) 0 1/sqrt(2) 1];
% R is 3x4 matrix

Y = [0; -1/sqrt(2);-1]; %Y is 3x1 matrix

B1 = pinv(R);
theta1 = B1*Y;
result1 = R*theta1 - Y

B2 = R'*inv(R*R');
theta2 = B2*Y;
result2 = R*theta2 - Y

这是结果:

   result1 =
   1.0e-15 *
   -0.1110
   -0.2220
   -0.2220
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND =  1.904842e-17. 
> In pseudoinverse at 14 
result2 =
    0.1036
   -0.1768
   -0.3536

显然,theta2 是错误的答案,但我不知道如何以及为什么。我读了很多书,他们给了我与 wiki 相同的公式。有人可以帮我手工做伪逆吗?谢谢 !

4

3 回答 3

4

代数告诉您可以使用伪逆来求解此类方程,但代数不考虑有限精度计算。

事实上,使用矩阵乘法方法计算伪逆是不合适的,因为它在数值上不稳定。使用\运算符进行矩阵除法,如

theta = R \ Y;

在代数上,矩阵除法与伪逆乘法相同。但是 MATLAB 的实现要稳定得多。

有关更多信息,包括稳定方法,请参阅

于 2013-05-24T19:01:22.323 回答
1

正如 Ben 已经说过的,矩阵求逆在数值上是不稳定的。inv除非您想对矩阵进行实际反转,否则不建议使用该函数,例如参见此链接。误用inv是数值线性代数的新手最常犯的错误。

inv在大多数线性代数计算中,您可以使用数值稳定算法来规避。例如,我们有线性求解器的 LU 分解,以及普通最小二乘法的 QR 或 SVD 方法。

于 2013-05-24T21:00:35.390 回答
0

您没有正确计算 B1。在你的情况下

B1 = inv(R'*R)*R';

因为 R 领先(传统上它是相反的)。但是,这并不能解决您的奇点问题。

pinv 使用 SVD 计算伪逆,您可以在此处阅读。

所以基本上它以更优雅的方式完成:

[U,S,V] = svd(R);
S(abs(S)<(sum(sum(S))*1e-8)) = 0; % removes near-singular values.
Stemp = 1./S;
Stemp(isinf(Stemp)) = 0; % This take the inverse of non-zero terms... I'm sure there is faster way
B1 = V * Stemp' * U';

然后你就可以继续上路了……

于 2013-05-25T06:36:53.373 回答