我实现了一种谱聚类算法,我必须确保一个矩阵(laplacian)是正半正定的。
检查矩阵是否为正定(PD)就足够了,因为"半 - "部分可以在特征值中看到。矩阵非常大(nxn,其中n约为数千),因此特征分析很昂贵。
在Eigen中是否有任何检查可以在运行时产生bool结果?
如果矩阵不是PD,Matlab可以通过抛出异常来给出chol()
方法的结果。遵循这个想法,Eigen返回结果而不抱怨LLL.llt().matrixL()
,尽管我期待一些警告/错误。
Eigen也有方法isPositive
,但是由于bug,它对于具有旧Eigen版本的系统是不可用的。
答案 0 :(得分:12)
您可以使用Cholesky分解(LLT),如果矩阵为负数,则返回Eigen::NumericalIssue
,请参阅documentation。
以下示例:
#include <Eigen/Dense>
#include <iostream>
#include <stdexcept>
int main()
{
Eigen::MatrixXd A(2, 2);
A << 1, 0 , 0, -1; // non semi-positive definitie matrix
std::cout << "The matrix A is" << std::endl << A << std::endl;
Eigen::LLT<Eigen::MatrixXd> lltOfA(A); // compute the Cholesky decomposition of A
if(lltOfA.info() == Eigen::NumericalIssue)
{
throw std::runtime_error("Possibly non semi-positive definitie matrix!");
}
}
答案 1 :(得分:2)
除了@vsoftco的答案外,我们还将检查矩阵对称性,因为PD / PSD的定义需要对称矩阵。
Eigen::LLT<Eigen::MatrixXd> A_llt(A);
if (!A.isApprox(A.transpose()) || A_llt.info() == Eigen::NumericalIssue) {
throw std::runtime_error("Possibly non semi-positive definitie matrix!");
}
此检查很重要,例如一些本征求解器(例如LTDT)需要PSD(或NSD)矩阵输入。实际上,存在通过A
测试的非对称因此非PSD 矩阵A_llt.info() != Eigen::NumericalIssue
。考虑下面的示例(数字取自Jiuzhang Suanshu,第8章,问题1):
Eigen::Matrix3d A;
Eigen::Vector3d b;
Eigen::Vector3d x;
// A is full rank and all its eigen values >= 0
// However A is not symmetric, thus not PSD
A << 3, 2, 1,
2, 3, 1,
1, 2, 3;
b << 39, 34, 26;
// This alone doesn't check matrix symmetry, so can't guarantee PSD
Eigen::LLT<Eigen::Matrix3d> A_llt(A);
std::cout << (A_llt.info() == Eigen::NumericalIssue)
<< std::endl; // false, no issue detected
// ldlt solver requires PSD, wrong answer
x = A.ldlt().solve(b);
std::cout << x << std::endl; // Wrong solution [10.625, 1.5, 4.125]
std::cout << b.isApprox(A * x) << std::endl; // false
// ColPivHouseholderQR doesn't assume PSD, right answer
x = A.colPivHouseholderQr().solve(b);
std::cout << x << std::endl; // Correct solution [9.25, 4.25, 2.75]
std::cout << b.isApprox(A * x) << std::endl; // true
注意:更确切地说,可以通过检查A
是对称的并且所有A的特征值> = 0来应用definition of PSD。但是正如问题中提到的那样,这可能在计算上很昂贵。