【发布时间】:2012-10-11 16:39:48
【问题描述】:
我使用下面的函数从我的优化器中为给定的一组猜测 lambda 生成 beta。
运行时我经常收到以下警告信息:
警告:矩阵对于工作精度来说是奇异的。 在 NSS_betas 在 9 19 岁的 DElambda 在 36 岁的 Individual_Lambdas 中
我希望能够从解决方案集中排除任何形成奇异矩阵的 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() 假设我采用下面给出的基准值。
但是,当我有两个接近但不完全相等的值时会发生什么?
我怎样才能决定什么是太接近了?
【问题讨论】: