15

我使用下面的函数从我的优化器中为给定的一组猜测 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() 工作假设我采用下面给出的基准值。

但是,当我有两个接近但不完全相等的值时会发生什么?

我怎样才能决定什么是太接近了?

4

5 回答 5

14

rcond是去这里的正确方法。如果它接近零的机器精度,则您的矩阵是奇异的。我通常会选择:

if( rcond(A) < 1e-12 )
    % This matrix doesn't look good
end

您可以尝试使用适合您需要的值,但使用 MATLAB 对矩阵求逆,甚至接近奇异矩阵会产生垃圾结果。

于 2012-10-22T07:09:02.980 回答
11

您可以将 的结果rank(G)与 的列数进行比较G。如果秩小于列维数,您将有一个奇异矩阵。

于 2012-10-21T20:27:32.173 回答
3

您还可以通过以下方式检查:

min(svd(A))>eps

并验证最小奇异值是否大于 eps 或与您的需求相关的任何其他数值公差。(代码将返回 1 或 0)

这里有更多关于它的信息......

于 2012-10-22T03:06:10.083 回答
3

条件编号(Maximal singular value/Minimal singular value)是另一个好方法:

  cond(A)

它使用svd. 它应该尽可能接近 1。非常大的值意味着矩阵几乎是奇异的。Inf意味着它是精确的单数。

请注意,其他答案中提到的几乎所有方法都以某种方式使用svd

于 2012-10-22T16:09:24.963 回答
1

有专门针对这个问题设计的工具,恰当地称为“秩揭示矩阵分解”。据我所知(虽然有点旧),判断n x n矩阵A是否非奇异的一个足够好的方法是使用

det(A) <> 0 <=> rank(A) = n

并使用 A 的秩揭示QR 分解

AP = QR

其中Q是正交的,P是一个置换矩阵,R是一个上三角矩阵,具有对角元素的大小沿对角线减小的性质。

于 2017-04-09T07:42:09.050 回答