【问题标题】:det of a matrix returns 0 in matlab矩阵的det在matlab中返回0
【发布时间】:2011-12-03 22:01:53
【问题描述】:

我得到了一个非常大的矩阵(我无法更改矩阵的值),我需要计算(协方差)矩阵的逆矩阵。

有时我会收到错误提示

 Matrix is close to singular or badly scaled.
     Results may be inaccurate

在这些情况下,我看到 det 的值返回 0。

在计算(协方差矩阵的)逆之前,我想检查 det 的值并执行类似的操作

covarianceFea=cov(fea_class);
covdet=det(covarianceFea);
if(covdet ==0)
    covdet=covdet+.00001;
    %calculate the covariance using this new det
end 

有没有什么办法可以使用新的det,然后用它来计算协方差矩阵的逆?

【问题讨论】:

    标签: matlab matrix-inverse determinants


    【解决方案1】:

    Woodchips 很好地解释了为什么不应该使用行列式。这似乎是一个常见的误解,您的问题与关于反转矩阵的另一个问题非常相关:Is there a fast way to invert a matrix in Matlab?,OP 决定因为他的矩阵的行列式是 1,所以它绝对是可逆的!这是我的回答中的一个sn-p

    而不是det(A)=1,而是condition number of your matrix 决定了逆运算的准确性或稳定性。请注意det(A)=∏<sub>i=1:n</sub> λ<sub>i</sub>。所以只要设置λ<sub>1</sub>=Mλ<sub>n</sub>=1/Mλ<sub>i≠1,n</sub>=1 就会给你det(A)=1。但是,如M → ∞cond(A) = M<sup>2</sup> → ∞λ<sub>n</sub> → 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
    

    【讨论】:

      【解决方案2】:

      叹息。计算行列式以确定奇点是一件荒谬的事情,完全如此。对于大型矩阵尤其如此。对不起,但确实如此。为什么?是的,有些书告诉你这样做。甚至是你的导师。

      分析奇点是一回事。但是奇点的数值确定呢?除非您使用符号工具,否则 MATLAB 使用浮点运算。这意味着它将数字存储为浮点、双精度值。这些数字的数量级不能小于

      >> realmin
      ans =
        2.2251e-308
      

      (实际上,就非规范化数字而言,MATLAB 比这要低一些,可以下降到大约 1e-323。)看到当我尝试存储一个小于该数字的数字时,MATLAB 认为它为零。

      >> A = 1e-323
      A =
        9.8813e-324
      
      >> A = 1e-324
      A =
           0
      

      大矩阵会发生什么?例如,这个矩阵是奇异的吗:

      M = eye(1000);
      

      由于 M 是一个单位矩阵,它显然是非奇异的。事实上,det 确实表明它是非奇异的。

      >> det(M)
      ans =
           1
      

      但是,将它乘以某个常数。这是否使它非单一?不!!!!!!!!!!!!!!!!!!!!!!!!当然不是。不过还是试试吧。

      >>     det(M*0.1)
      ans =
           0
      

      嗯。那很奇怪。 MATLAB告诉我行列式为零。但我们知道行列式是 1e-1000。哦是的。天哪,1e-1000 比我刚刚向您展示的 MATLAB 可以存储为双精度数的最小数字要小得多。所以行列式下溢,即使它显然是非零的。矩阵是奇异的吗?当然不是。但是在这里使用 det 会失败吗?当然会,这是完全可以预料的。

      相反,使用一个好的工具来确定奇点。使用 cond 或 rank 之类的工具。例如,我们可以愚弄排名吗?

      >> rank(M)
      ans =
              1000
      
      >> rank(M*.1)
      ans =
              1000
      

      看到秩知道这是一个满秩矩阵,无论我们是否对其进行缩放。 cond也是一样,计算M的条件数。

      >> cond(M)
      ans =
           1
      
      >> cond(M*.1)
      ans =
           1
      

      欢迎来到浮点运算的世界。哦,顺便说一句,忘记 det 作为几乎任何使用浮点运算的计算的工具。这几乎总是一个糟糕的选择。

      【讨论】:

        【解决方案3】:

        在这种情况下,计算逆不是一个好主意。如果您只需要这样做,我建议使用它来提高显示精度:

        format long;
        

        其他建议可能是尝试使用矩阵的 SVD 并在那里修改奇异值。

        A = U∑V'
        inv(A) = V*inv(∑)*U'
        

        ∑ 是一个对角矩阵,您将看到其中一个对角线元素接近 0。如果您想要某种近似值,请尝试使用这个数字。

        【讨论】:

        • 伪逆有 PINV 函数
        猜你喜欢
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多