Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
倍频程/Matlab中pinv([inf])=NaN的处理方法_Matlab_Octave_Matrix Inverse - Fatal编程技术网

倍频程/Matlab中pinv([inf])=NaN的处理方法

倍频程/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

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

是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
时更稳健,因为有迭代方法来计算结果。