我正在使用Octave 3.8.1,一个类似Matlab的程序。我想将1/x
推广到x
可能是标量或矩阵的情况。将1/x
替换为inv(x)
或pinv(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以使其工作吗?还是我错过了什么?谢谢!
答案 0 :(得分:1)
Moore–Penrose pseudo inverse是Matab和octave pinv
的基础,是通过与inv
函数完全不同的算法实现的。更具体地说,singular value decomposition is used,它需要有限值矩阵(它们也不能是sparse
)。你没有说你的矩阵是否正方形。 pinv
的实际用途是用于解决非方形系统(over-或underdetermined)。
但是,无论您的矩阵是什么维度,您都不应该使用pinv
或inv
作为您的应用。相反,您应该使用mldivide
(octave,Matlab),即反斜杠运算符\
。这样效率更高,数值更强大。
A1 = 3;
A2 = [1 2 1;2 4 6;1 1 3];
A1inv = A1\1
A2inv = A2\eye(size(A2))
mldivide
函数也可以处理矩形矩阵,但与pinv
相比,欠定系统会得到不同的答案,因为两个use different methods可以选择解决方案。
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
如果您运行上面的代码,您会发现A3inv
的结果与pinv(A3)
返回的结果略有不同。但是,两者都是有效的解决方案。