【问题标题】:How to find if a matrix is Singular in Matlab如何在Matlab中查找矩阵是否为奇异矩阵
【发布时间】:2012-10-11 16:39:48
【问题描述】:

我使用下面的函数从我的优化器中为给定的一组猜测 lambda 生成 beta。

运行时我经常收到以下警告信息:

警告:矩阵对于工作精度来说是奇异的。 在 NSS_betas 在 9 19 岁的 DElambda 在 36 岁的 Individual_Lambdas 中

我希望能够从解决方案集中排除任何形成奇异矩阵的 beta,但是我不知道如何测试它?

我一直在尝试使用 rcond(),但我不知道在哪里区分单数和非单数?

当然,如果 Matlab 正在生成警告消息,它已经知道矩阵是否是单数的,所以如果我能找到该变量的存储位置,我可以使用它吗?

function betas=NSS_betas(lambda,data)

mats=data.mats2'; 
lambda=lambda;
yM=data.y2';
nObs=size(yM,1);
G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))];

betas=G\yM;
r=rcond(G);

end

感谢您的建议:

在将 lambda 值设置为相等之后,我测试了以下所有三个示例,从而得到了一个奇异矩阵

 if (~isinf(G))
  r=rank(G);
  r2=rcond(G);
  r3=min(svd(G)); 
 end

r=3, r2 =2.602085213965190e-16; r3= 1.075949299504113e-15;

所以在这个测试中,rank() 和 rcond() 假设我采用下面给出的基准值。

但是,当我有两个接近但不完全相等的值时会发生什么?

我怎样才能决定什么是太接近了?

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    您可以将rank(G) 的结果与G 的列数进行比较。如果秩小于列维数,则会有一个奇异矩阵。

    【讨论】:

    • 为什么这被认为是一个不够糟糕的答案?
    【解决方案2】:

    您也可以通过以下方式检查:

    min(svd(A))>eps
    

    并验证最小奇异值是否大于 eps 或与您的需求相关的任何其他数值容差。 (代码将返回 1 或 0)

    Here's more info about it...

    【讨论】:

    • 我认为rank 完全按照你说的做。
    【解决方案3】:

    rcond 是去这里的正确方式。如果它接近零的机器精度,则您的矩阵是奇异的。我通常会选择:

    if( rcond(A) < 1e-12 )
        % This matrix doesn't look good
    end
    

    您可以尝试使用适合您需要的值,但使用 MATLAB 对甚至接近奇异的矩阵求逆可能会产生垃圾结果。

    【讨论】:

    • cutoff值应该和eps值相关吗?
    • 在 MATLAB 中,'eps' 为 2^(-52)。官方文档在这里:mathworks.com/help/matlab/ref/eps.html。它表示从 1.0 到下一个最大浮点数的距离。矩阵在值远大于 'eps' 时是病态的,因为 eps 本质上是 MATLAB 可以表示的最小偏差。
    • 仅供参考:eps('double') 提供2.220446049250313e-16(或2^-52),eps('single') 提供1.1920929e-07(或2^-23)。
    【解决方案4】:

    条件号(Maximal singular value/Minimal singular value)是另一个好方法:

      cond(A)
    

    它使用svd。它应该尽可能接近 1。非常大的值意味着矩阵几乎是奇异的。 Inf 表示它是精确的单数。

    请注意,其他答案中提到的几乎所有方法都以某种方式使用svd:

    【讨论】:

      【解决方案5】:

      有专门针对这个问题设计的工具,恰当地称为“秩揭示矩阵分解”。据我所知(虽然有点老了),一个足够好的方法来确定 n x n 矩阵 A 是否是非奇异的就是使用

      det(A) &lt;&gt; 0 &lt;=&gt; rank(A) = n

      并使用 A 的排名显示 QR factorization:

      AP = QR
      

      其中Q 是正交的,P 是一个置换矩阵,R 是一个上三角矩阵,其属性是对角元素的大小沿对角线减小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多