c++ - Eigen - 检查矩阵是否为正(半)定

标签 c++ eigen eigen3

我正在实现谱聚类算法,我必须确保矩阵(拉普拉斯矩阵)是半正定矩阵。

检查矩阵是否为正定矩阵 (PD) 就足够了,因为可以在特征值中看到“半”部分。矩阵非常大(nxn,其中 n 是几千的数量级)所以特征分析很昂贵。

Eigen 中是否有任何检查在运行时给出 bool 结果?

如果矩阵不是 PD,Matlab 可以通过抛出异常来使用 chol() 方法给出结果。遵循这个想法,Eigen 返回一个结果而不提示 LLL.llt().matrixL(),尽管我期待一些警告/错误。 Eigen 也有方法 isPositive,但由于 bug它不适用于具有旧 Eigen 版本的系统。

最佳答案

您可以使用 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!");
    }    
}

关于c++ - Eigen - 检查矩阵是否为正(半)定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35227131/

相关文章:

c++ - 名称带有空格的文件不会被编译

c++ - 在调整 QWidget 大小时调整 QWidget 中的 QTextEdit 大小

eigen - 如何使用 Eigen 库用模板定义 Vector?

c++ - 如何将复杂矩阵从 Matlab R2018a 传输到 Eigen

c++ - Eigen's unsupported/CXX11/Tensor模块的编译错误

c++ - Eigen 版本 3.2.0 和 3.3.4 之间的数值差异

c++ - 如何将结构作为参数从 c++/cli 传递到 c++

c++ - 具有内部链接的命名空间

c++ - Eigen:是否有计算样本协方差的内置方法

c++ - 标量类型的特征模板