如何在Matlab中找到矩阵是否是奇异的

时间:2012-10-21 20:19:52

标签: matlab matrix

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

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

警告:Matrix的工作精度非常高。 在NSS_betas 9 在DElambda 19 在Individual_Lambdas at 36

我希望能够排除任何形成解决方案集的奇异矩阵的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()工作假设我采用下面给出的基准值。

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

我怎样才能决定什么距离太近?

5 个答案:

答案 0 :(得分:14)

rcond是去这里的正确方法。如果它接近零的机器精度,你的矩阵是单数。我通常会选择:

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

您可以尝试一个满足您需求的值,但是使用MATLAB的矩阵的倒数可能会产生垃圾结果。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

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

min(svd(A))>eps

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

Here's more info about it ...

答案 3 :(得分:3)

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

  cond(A)

它使用svd。它应该尽可能接近1。非常大的值意味着矩阵几乎是单数。 Inf意味着它恰好是单数。

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

答案 4 :(得分:1)

为此问题设计了专门的工具,适当地称为“排名显示矩阵因子分解”。尽我所知(虽然有点旧)的知识,一个足够好的方法来决定 #(struct:diff-exp #(struct:diff-exp #(struct:const-exp 1) #(struct:const-exp 2)) #(struct:diff-exp #(struct:const-exp 3) #(struct:diff-exp #(struct:const-exp 4) #(struct:const-exp 5))) 矩阵n x n是否是非奇异的是

A

并使用A:

的排名显示QR factorization
det(A) <> 0 <=> rank(A) = n

其中AP = QR 是正交的,Q是一个置换矩阵,P是一个上三角矩阵,其特征是对角线元素的大小沿对角线减小。