我使用下面的函数从我的乐观主义者那里为一组给定的猜测lambda生成beta。
运行时,我经常收到以下警告消息:
警告:矩阵对于工作精度来说是奇异的。
9点在新南威尔士大学
在德兰巴达19点
36岁的兰姆达斯
我希望能够排除任何组成解集的奇异矩阵的be t a,但是我不知道如何测试它?
我一直在尝试使用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()假设我采用下面给出的基准值。
然而,当我有两个接近但不完全相等的值时会发生什么?
我怎样才能决定什么离得太近?
最佳答案
rcond
是正确的方法如果它接近零的机器精度,你的矩阵是奇异的我通常会说:
if( rcond(A) < 1e-12 )
% This matrix doesn't look good
end
您可以尝试使用一个满足您需要的值,但是使用MATLAB对一个甚至接近奇异的矩阵求逆会产生垃圾结果。
关于matlab - 如何在Matlab中查找矩阵是否为奇异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13001800/