在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
我在最后一个最低特征值的范围内看。但是,特征值的行为似乎很奇怪,而且我不确定我是否真的找到了真正的最低值。
因此,有关如何操作的任何想法
非常感谢!
答案 0 :(得分:1)
我似乎已经解决了我的特殊问题。如果矩阵是正定的,则Matlabs命令chol
可以返回值为p
的零。因此,执行
[~,p] = chol(A)
在我的情况下,确定从正定到非正定的过渡(意思是先奇异然后不确定),并且在计算上也非常有效。在chol
的文档中,检查正定性也比eigs
更为可取。但是,如果矩阵仅是正的半限定的,则结果可能会有些混乱,因此请小心。
我想提出几种可能的解决方案:
行列式: 对于正定矩阵,行列式为正。但是,对于不确定的矩阵,它可能为负-这可能表示过渡。但是,通常不建议使用大的近似奇异矩阵的行列式。
特征值:对于正定矩阵,所有特征值的实部均为正。如果至少一个特征值是零,则矩阵是奇异的;如果一个特征值是负的,而其余的是正的,则它是不确定的。检测最低特征值的符号偏移指示矩阵变为奇异点。在Matlab中,最低特征值可能是由
D = eigs(A,1,'smallestreal')
但是,在我的情况下,Matlab无法执行此操作。另外,您可以尝试在零附近搜索:
D = eigs(A,1,0)
但是,这只会找到最接近零的特征值。即使您像我上面的原始问题中所述那样进行循环,也不能保证实际找到最低的。而且在某些情况下,几乎是奇异矩阵的特征值的精度似乎很低。
条件编号:Matlabs cond
通过执行以下操作返回矩阵的条件编号
C = cond(A)
表示最大特征值与最小特征值之比。条件编号中符号的偏移由此说明了转换。但是,这对我不起作用,因为即使我的特征值是负数,我也只能得到正数的条件数。但是也许在其他情况下也可以。