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

Baz*_*man 15 matlab matrix

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

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

警告:Matrix的工作精度非常高.在NSS_betas at 9 In DElambda at 19 In 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
Run Code Online (Sandbox Code Playgroud)

感谢您的建议:

在将lambda值设置为相等以便设置单个矩阵之后,我测试了以下所有三个示例

 if (~isinf(G))
  r=rank(G);
  r2=rcond(G);
  r3=min(svd(G)); 
 end
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

din*_*elk 15

rcond是去这里的正确方式.如果它接近零的机器精度,你的矩阵是单数.我经常跟:

if( rcond(A) < 1e-12 )
    % This matrix doesn't look good
end
Run Code Online (Sandbox Code Playgroud)

您可以尝试一个满足您需求的值,但是使用与MATLAB甚至接近单数的矩阵的逆矩阵可以产生垃圾结果.

  • 仅供参考:`eps('double')`给出`2.220446049250313e-16`(或`2 ^ -52`),`eps('single')`给出'1.1920929e-07`(或`2 ^ -23) `)。 (2认同)

mat*_*975 10

您可以将结果rank(G)与列数进行比较G.如果等级小于列维度,则将具有单个矩阵.