在Matlab中,我有一个实的对称n x n矩阵a,其中n>6000。即使A是正定的,它也接近于单数。对于一个变化的特定变量,A从正定到奇异再到不定。我要确定A何时变为单数。我不相信行列式,所以我在看特征值,但我没有内存(或时间)来计算所有n个特征值,我只对最小的一个感兴趣,尤其是当它的符号从正变为负时。我试过
D = eigs(A,1,'smallestabs')
通过它我失去了特征值的符号,通过
D = eigs(A,1,'smallestreal')
Matlab无法获得最低的特征值进行收敛。然后我尝试定义一个类似的偏移值
for i = 1:10
if i == 1
D(i) = eigs(A,1,0)
else
D(i) = eigs(A,1,D(i-1))
end
end
在最后一个最低特征值的范围内。然而,特征值似乎表现得很奇怪,我不确定我是否真的找到了真正的最低值。
所以,关于如何的任何想法
- 毫无疑问地找到具有"eigs"的最小特征值,或者
- 通过另一种方式确定A何时变为奇异(当改变A中的变量时)
非常感谢!
解决方案
我似乎已经解决了我的特殊问题。如果矩阵是正定的,则Matlabs命令chol
有可能返回值p
,该值为零。因此,执行
[~,p] = chol(A)
在我的例子中,确定了从正定到非正定(意思是先奇异后不定)的转换,并且在计算上也是非常有效的。在chol
的文档中,检查正定性也优于eigs
。然而,如果矩阵只是正的半的-确定的,那么结果似乎有一些混乱,所以如果是这种情况,请小心。
替代解决方案
我遇到了几种可能的解决方案,我想说明一下:
行列式:对于正定矩阵,行列式是正的。然而,对于不定矩阵,它可能是负的——这可能表明转换。不过,一般不建议使用大的近似奇异矩阵的行列式。
特征值:对于正定矩阵,所有特征值的实部都是正的。如果至少有一个特征值为零,则矩阵是奇异的,如果其中一个为负,其余为正,则矩阵不确定。检测最低特征值的符号偏移指示矩阵变为奇异的点。在matlab中,可以通过找到最低特征值
D = eigs(A,1,'smallestreal')
然而,在我的情况下,Matlab无法执行此操作。或者,你可以尝试在零附近搜索:
D = eigs(A,1,0)
然而,这只找到最接近于零的特征值。即使你做了一个循环,就像我在上面的原始问题中指出的那样,你也不能保证真的找到最低的。在某些情况下,近似奇异矩阵的特征值的精度似乎很低。
条件号:Matlabscond
通过执行返回矩阵的条件号
C = cond(A)
其表示最大特征值与最低特征值的比率。因此,条件数中符号的偏移表示转换。然而,这对我不起作用,因为即使我有负的本征值,我也只得到正的条件数。但也许它在其他情况下也会起作用。