我使用下面的函数从我的优化器中为给定的一组猜测 lambda 生成 beta。
运行时,我经常收到以下警告消息:
警告:矩阵对于工作精度来说是奇异的。在 NSS_betas 中 9 在 DElambda 在 19 在 Individual_Lambdas 在 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() 工作假设我采用下面给出的基准值。
但是,当我有两个接近但不完全相等的值时会发生什么?
我怎样才能决定什么是太接近了?