gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:25:08 28 4
gpt4 key购买 nike

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

检查矩阵是否为正定矩阵 (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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com