bha*_*avs 5 matlab matrix-inverse determinants
我给了一个非常大的矩阵(我不能改变矩阵的值),我需要计算(协方差)矩阵的逆.
有时我得到错误说
Matrix is close to singular or badly scaled.
Results may be inaccurate
Run Code Online (Sandbox Code Playgroud)
在这些情况下,我看到det的值返回0.
在计算逆(协方差矩阵)之前,我想检查det的值并执行类似的操作
covarianceFea=cov(fea_class);
covdet=det(covarianceFea);
if(covdet ==0)
covdet=covdet+.00001;
%calculate the covariance using this new det
end
Run Code Online (Sandbox Code Playgroud)
有没有办法使用新的det然后用它来计算协方差矩阵的逆?
小智 16
叹.计算确定奇点的行列式是一件荒谬的事情,完全如此.对于大型矩阵尤其如此.对不起,但确实如此.为什么?是的,有些书告诉你这样做.也许甚至是你的导师.
分析奇点是一回事.但是如何确定奇点的数值?除非您使用符号工具,否则MATLAB使用浮点运算.这意味着它将数字存储为浮点,双精度值.这些数字的数量不能小于
>> realmin
ans =
2.2251e-308
Run Code Online (Sandbox Code Playgroud)
(实际上,就非规范化数字而言,MATLAB略低于此,可以下降到大约1e-323.)当我尝试存储小于该数字的数字时,MATLAB认为它为零.
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
Run Code Online (Sandbox Code Playgroud)
大矩阵会发生什么?例如,这个矩阵是单数的:
M = eye(1000);
Run Code Online (Sandbox Code Playgroud)
由于M是单位矩阵,因此它非常明显.事实上,det确实表明它是非单数的.
>> det(M)
ans =
1
Run Code Online (Sandbox Code Playgroud)
但是,将它乘以一些常数.这是否使它成为非单数?没有!!!!!!!!!!!!!!!!!!!!!!!!当然不是.但无论如何都要试试.
>> det(M*0.1)
ans =
0
Run Code Online (Sandbox Code Playgroud)
嗯.多数民众赞成.MATLAB告诉我行列式为零.但我们知道决定因素是1e-1000.哦,是的.天哪,1e-1000比我刚刚向你展示的最小数字要小得多,MATLAB可以存储为双倍数.因此决定因素下溢,即使它明显不为零.矩阵是单数吗?当然不是.但是这里使用det失败了吗?当然会,这是完全可以预料的.
相反,使用一个好的工具来确定奇点.使用像cond或rank这样的工具.例如,我们可以欺骗等级吗?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
Run Code Online (Sandbox Code Playgroud)
看看等级知道这是一个完整的等级矩阵,无论我们是否扩展它.cond也是如此,计算M的条件数.
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
Run Code Online (Sandbox Code Playgroud)
欢迎来到浮点运算世界.哦,顺便说一句,忘记det作为几乎所有使用浮点运算的计算的工具.几乎总是这是一个糟糕的选择.
Woodchips为您提供了一个很好的解释,说明为什么不应该使用行列式.这似乎是一个常见的误解,你的问题与另一个关于反转矩阵的问题非常相关:在Matlab中有一种快速的方法来反转矩阵吗?OP决定因为他的矩阵的行列式为1,它绝对是可逆的!这是我的回答的片段
而不是
det(A)=1
,矩阵的条件数决定了逆的准确性或稳定性.请注意.所以只设置,并且会给你.然而,as ,并且,意味着你的矩阵接近奇点,并且在计算逆时会出现大的数值误差.det(A)=?i=1:n ?i
?1=M
?n=1/M
?i?1,n=1
det(A)=1
M ? ?
cond(A) = M2 ? ?
?n ? 0
您可以使用以下简单示例在MATLAB中对此进行测试:
A = eye(10);
A([1 2]) = [1e15 1e-15];
%# calculate determinant
det(A)
ans =
1
%# calculate condition number
cond(A)
ans =
1.0000e+30
Run Code Online (Sandbox Code Playgroud)
在这种情况下,计算倒数并不是一个好主意。如果您必须这样做,我建议使用它来提高显示精度:
\n\nformat long;\n
Run Code Online (Sandbox Code Playgroud)\n\n其他建议可能是尝试使用矩阵的 SVD 并在那里修改奇异值。
\n\nA = U\xe2\x88\x91V'\ninv(A) = V*inv(\xe2\x88\x91)*U'\n
Run Code Online (Sandbox Code Playgroud)\n\n\xe2\x88\x91 是一个对角矩阵,您将看到其中一个对角线条目接近 0。如果您想要某种近似值,请尝试使用这个数字。
\n 归档时间: |
|
查看次数: |
3159 次 |
最近记录: |