倍频程/Matlab中pinv([inf])=NaN的处理方法
我使用的是Octave 3.8.1,一个类似Matlab的程序。我想将倍频程/Matlab中pinv([inf])=NaN的处理方法,matlab,octave,matrix-inverse,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
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以使其正常工作?还是我错过了什么?谢谢 是Matab和octave的pinv
的基础,通过与inv
函数完全不同的算法实现。更具体地说,它需要的是有限值矩阵(它们也不能是稀疏的)。你没说你的矩阵是不是正方形。pinv
的真正用途是求解非平方系统(or)
但是,无论矩阵的维数如何,您都不应该在应用程序中使用pinv
或inv
。相反,您应该使用mldivide
(,),即反斜杠操作符\
。这是更有效和数字稳健
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
如果运行上面的代码,您将看到
A3inv
的结果与pinv(A3)
返回的结果略有不同。但是,这两种方法都是有效的。pinv
计算矩阵的伪逆。MATLAB结果:1/inf->0
,pinv([inv])->错误
,inv([inf])->0+警告
。你最好的选择是完全不要依赖那些inf
-骗局…很有趣-谢谢knedlsepp。您的pinv
调用中有一个输入错误-参数应该是inf
而不是inv
-这会改变Matlab中的结果吗?@racingtapole:很抱歉输入错误pinv([inf])
也给出了一个错误。与inv
相反,反斜杠运算符的真正好处是直接求解线性系统(特别是当只有一个右手边时,它是稳定的+比反转快)。做Ainv=A\eye(大小(A)),在数值上没有好处;Ainv*V
,与inv(A)*V
相反!我阅读这个答案的方式建议使用Ainv=A\eye(大小(A))
而不是Ainv=inv(A)
,这是没有用的。@knedlsepp:是的,这个答案绝对建议使用A\eye(size(A))
而不是inv(A)
,如果你只想得到相反的结果!当然可以,(但它是)mldivide
更稳定,数值误差更小(尤其是当矩阵变得更奇异时)。对于显式反转,在某些情况下inv(A)
更快,但现在A\eye(size(A))
通常更快或更具可比性。您是否有任何来源支持使用mldivide
会更稳定的假设?我对此深表怀疑。@knedlsepp:这在的文档中是正确的。这是所用算法的基础。这仍然不意味着人们应该使用Ainv=A\eye(size(A))
来计算一个显式逆,并使用结果来求解一个线性系统,例如x=Ainv*b
,而不是使用x=A\b
,即使这比x=inv(A)*b稍差一点。这只意味着如果需要/想要相反的尺寸,A\eye(尺寸(A)
更稳健。如果你知道你的矩阵不是单数且条件数较低,那么inv
就可以非常好地返回相同的结果。我想你可能会误解那里的文档。它表明求解线性系统a\b
在数值上比求解inv(a)更稳定*b
,我完全同意。但是使用不同的方法生成逆矩阵(例如使用a\eye(大小(a))
)与使用inv
时的数值问题相同。不稳定性源于可能存在的病态逆和矩阵乘法。mldivide
在使用a\b
时更稳健,因为有迭代方法来计算结果。