我使用下面的函数为我的优化器生成一组给定的猜测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甚至接近单数的矩阵的逆矩阵可以产生垃圾结果.
| 归档时间: |
|
| 查看次数: |
10880 次 |
| 最近记录: |