[英]Ways around pinv([inf])=NaN in Octave/Matlab
我正在使用类似Matlab的程序Octave 3.8.1。 我想将1/x
推广到x
可能是标量或矩阵的情况。 用inv(x)
或pinv(x)
替换1/x
适用于大多数x
,除了:
octave:1> 1/inf
ans = 0
octave:2> pinv([inf])
ans = NaN
octave:3> inv([inf])
warning: inverse: matrix singular to machine precision, rcond = 0
ans = Inf
之后是否应该将NaN转换为0,以使其正常工作? 还是我错过了什么? 谢谢!
Matore和octave的pinv
的基础是Moore-Penrose伪逆 ,它是通过与inv
函数完全不同的算法实现的。 更具体地说,使用奇异值分解 ,它需要使用有限值矩阵(它们也不能是sparse
)。 您没有说矩阵是否为正方形。 pinv
的真正用途是解决非正方形系统( 超 定或欠定 )。
但是,无论矩阵的尺寸如何,都不应在应用程序中使用pinv
或inv
。 相反,您应该使用mldivide
( 八度 , Matlab ),即反斜杠运算符\\
。 这是效率更高且数值上更可靠的。
A1 = 3;
A2 = [1 2 1;2 4 6;1 1 3];
A1inv = A1\1
A2inv = A2\eye(size(A2))
mldivide
函数也可以处理矩形矩阵,但是与pinv
相比,对于欠定系统,您将获得不同的答案,因为这两种方法使用不同的方法来选择解决方案。
A3 = [1 2 1;2 4 6]; % Underdetermined
A4 = [1 2;2 4;1 1]; % Overdetermined
A3inv = A3\eye(min(size(A3))) % Compare to pinv(A3), different answer
A4inv = A4\eye(max(size(A4))) % Compare to pinv(A4), same answer
如果运行上面的代码,您将看到与pinv(A3)
返回的结果相比, A3inv
结果略有不同。 但是,两者都是有效的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.