我使用下面的函数从我的优化器生成给定的一组猜测lambdas的betas.
运行时,我经常会收到以下警告消息:
警告:矩阵对工作精度是单数.
在NSS_betas在9
在19岁的DElambda
在36岁的Individual_Lambdas
我想要排除形成解决方案集合中的单数矩阵的任何betas,但是我不知道如何测试它?
我一直在尝试使用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()工作,假设我拿下面给出的基准值.
然而,当我有两个接近但不完全相同的值时会发生什么?
我如何决定什么是太近?