在Octave / Matlab中围绕pinv([inf])= NaN的方法

时间:2015-02-11 23:30:38

标签: matlab octave matrix-inverse

我正在使用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以使其工作吗?还是我错过了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

Moore–Penrose pseudo inverse是Matab和octave pinv的基础,是通过与inv函数完全不同的算法实现的。更具体地说,singular value decomposition is used,它需要有限值矩阵(它们也不能是sparse)。你没有说你的矩阵是否正方形。 pinv的实际用途是用于解决非方形系统(over-underdetermined)。

但是,无论您的矩阵是什么维度,您都不应该使用pinvinv作为您的应用。相反,您应该使用mldivideoctaveMatlab),即反斜杠运算符\。这样效率更高,数值更强大。

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)返回的结果略有不同。但是,两者都是有效的解决方案。