【发布时间】:2016-02-05 14:58:15
【问题描述】:
我正在实现一个谱聚类算法,我必须确保一个矩阵(拉普拉斯算子)是半正定的。
检查矩阵是否为正定 (PD) 就足够了,因为可以在特征值中看到“半”部分。矩阵非常大(nxn,其中 n 大约为数千),因此特征分析很昂贵。
在 Eigen 中是否有任何检查会在运行时给出 bool 结果?
如果矩阵不是 PD,Matlab 可以使用 chol() 方法通过抛出异常来给出结果。遵循这个想法,Eigen 返回一个结果而不抱怨LLL.llt().matrixL(),尽管我期待一些警告/错误。
Eigen 也有方法isPositive,但由于bug,它不能用于具有旧 Eigen 版本的系统。
【问题讨论】:
-
你不能先检查它是否是厄米特,然后再看特征值吗?检查封闭性很简单。
-
你对厄米特部分是正确的,但理想情况下,我想避免多次计算一个巨大矩阵的特征值,因为这是我想要的输出,所以我希望尽可能只发生一次。
-
也许您可以尝试从 Eigen 进行 Cholesky 分解,如果矩阵为负,则返回
NumericalIssue,请参阅 eigen.tuxfamily.org/dox/classEigen_1_1LLT.html -
可能是版本问题,因为:
error: 'class Eigen::LDLT has no member named 'info' -
哦,实际上它适用于 LLT,虽然它不适用于 LLT,感谢您的指点!如果你愿意,你可以写一个答案让我接受,否则我稍后会发布一个 sn-p 作为答案。