我使用下面的函数为我的优化器生成一组给定的猜测lambda。
运行时,我经常收到以下警告信息:
警告:Matrix的工作精度非常高。 在NSS_betas 9 在DElambda 19 在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
感谢您的建议:
在将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()工作假设我采用下面给出的基准值。
然而,当我有两个接近但不完全相等的值时会发生什么?
我怎样才能决定什么距离太近?
答案 0 :(得分:14)
rcond
是去这里的正确方法。如果它接近零的机器精度,你的矩阵是单数。我通常会选择:
if( rcond(A) < 1e-12 )
% This matrix doesn't look good
end
您可以尝试一个满足您需求的值,但是使用MATLAB的矩阵的倒数可能会产生垃圾结果。
答案 1 :(得分:9)
您可以将rank(G)
的结果与G
的列数进行比较。如果排名小于列维度,您将拥有一个奇异矩阵。
答案 2 :(得分:3)
你也可以通过以下方式检查:
min(svd(A))>eps
并验证最小奇异值是否大于eps,或任何其他与您的需求相关的数值公差。 (代码将返回1或0)
答案 3 :(得分:3)
条件编号(Maximal singular value/Minimal singular value)
是另一个好方法:
cond(A)
它使用svd
。它应该尽可能接近1。非常大的值意味着矩阵几乎是单数。 Inf
意味着它恰好是单数。
请注意,其他答案中提到的几乎所有方法都以某种方式使用svd
:
答案 4 :(得分:1)
为此问题设计了专门的工具,适当地称为“排名显示矩阵因子分解”。尽我所知(虽然有点旧)的知识,一个足够好的方法来决定 #(struct:diff-exp
#(struct:diff-exp
#(struct:const-exp 1)
#(struct:const-exp 2))
#(struct:diff-exp
#(struct:const-exp 3)
#(struct:diff-exp
#(struct:const-exp 4)
#(struct:const-exp 5)))
矩阵n x n
是否是非奇异的是
A
并使用A:
的排名显示QR factorizationdet(A) <> 0 <=> rank(A) = n
其中AP = QR
是正交的,Q
是一个置换矩阵,P
是一个上三角矩阵,其特征是对角线元素的大小沿对角线减小。