我注意到,如果A是NxN矩阵,它有逆矩阵。但是inv()和pinv()函数的输出是不同的。-我的环境是Win7x64 SP1,Matlab R2012a,Cygwin Octave 3.6.4,FreeMat 4.2
看看Octave的例子:
A = rand(3,3)
A =
0.185987 0.192125 0.046346
0.140710 0.351007 0.236889
0.155899 0.107302 0.300623
pinv(A) == inv(A)
ans =
0 0 0
0 0 0
0 0 0ans。inv(A)*A或A*inv(A),得到了八度和Matlab的恒等式3x3矩阵。A*pinv(A)和pinv(A)*A的结果是Matlab和FreeMat中的恒等式3x3矩阵。A*pinv(A)的结果是八阶的恒等式3x3矩阵。pinv(A)*A的结果不是八阶的3x3矩阵。我不知道为什么inv(A) != pinv(A),我已经考虑了矩阵中元素的细节。造成这一问题的原因似乎是浮动精度问题。
点后的10+数字可能与以下所示不同:
6.65858991579923298331777914427220821380615200000000元素在inv(A)(1,1)中的6.65858991579923209513935944414697587490081800000000元素在pinv(A)(1,1)中的应用发布于 2013-10-17 10:34:04
在我看来,你似乎回答了你自己的问题。其原因是浮点算法。inv()和pinv()的算法并不完全相同,因为pinv()必须能够处理非平方矩阵。因此,答案不会完全相同。
如果您查看pinv(A)*A的值,您会发现它非常接近恒等矩阵。
我得到:
ans =
1.0000e+00 6.1062e-16 -3.0809e-15
-5.8877e-15 1.0000e+00 6.3942e-15
2.4425e-15 -3.0184e-16 1.0000e+00而不是将矩阵与==进行比较,而是使用< tolerance_limit
c = A*pinv(A);
d = pinv(A)*A;
(c-d) < 1e-10Sidenote:
x = A^-1*b不应该被解决-- x = inv(A)*b;,而是x = A \ b; --参见the link Shai posted的解释。
发布于 2013-10-17 10:06:39
浮点算法具有一定的精度,不能依赖于相等。为了避免这样的错误,您可以尝试使用matlab的符号工具箱。
非常简单的八度代码行来演示这些问题:
>>> (1/48)*48==(1/49)*49
ans = 0
>>> (1/48)*48-(1/49)*49
ans = 1.1102e-16
>>>发布于 2021-11-03 15:46:51
利用A=[1,1,0;1,0,1;2,1,1]算法计算了pinv(A) (2级)的伪逆矩阵.A*pinv(A)给出了一个非恒等矩阵,即A*pinv(A)=[0.667, -0.333, 0.333; -0.333, 0.667,0.333; 0.333, 0.333, 0.667].我认为对于奇异矩阵,最好是用svd()手工计算伪逆矩阵.
下面是一些更新:A*pinv(A)本身可能不同于恒等矩阵,因为它是非满秩的。它可能不依赖于pinv(A)的Matlab算法。
https://stackoverflow.com/questions/19423198
复制相似问题