C ++查找矩阵的特征值和特征向量

10

我正在编写一个包含许多步骤(PCA)的算法,其中两个步骤是查找给定矩阵的特征值和特征向量。

我不想为此编写整个代码,因为我知道这是一项漫长的工作,因此我搜索了一些临时代码,但只找到了1或2个库,起初我不想包含库,也不想转移到matlab。

是否有任何算法/教程/代码看起来不太难以理解?


4
Eigen (https://bitbucket.org/eigen/eigen/) 是一个C++模板库,用于线性代数运算。它提供了高水平的抽象表示和丰富的算法实现,适合在科学计算、工程和机器学习等领域使用。Armadillo (http://arma.sourceforge.net/) 是一个开源的C++线性代数库,与Eigen类似,但它还包括了更多的统计分析功能。它支持矩阵、向量、立方体等基本对象以及高级线性代数运算。 - Severin Pappadeux
2
Eigen 是一个仅包含头文件的软件包(因此,在技术上,您不需要链接到任何库),这里是文档中用于计算特征值的示例。 - user6764549
1个回答

8

如果有人需要的话,这是我如何做到的。

    Eigen::EigenSolver<Eigen::MatrixXf> eigensolver;
    eigensolver.compute(covmat);
    Eigen::VectorXf eigen_values = eigensolver.eigenvalues().real();
    Eigen::MatrixXf eigen_vectors = eigensolver.eigenvectors().real();
    std::vector<std::tuple<float, Eigen::VectorXf>> eigen_vectors_and_values; 

    for(int i=0; i<eigen_values.size(); i++){
        std::tuple<float, Eigen::VectorXf> vec_and_val(eigen_values[i], eigen_vectors.row(i));
        eigen_vectors_and_values.push_back(vec_and_val);
    }
    std::sort(eigen_vectors_and_values.begin(), eigen_vectors_and_values.end(), 
        [&](const std::tuple<float, Eigen::VectorXf>& a, const std::tuple<float, Eigen::VectorXf>& b) -> bool{ 
            return std::get<0>(a) <= std::get<0>(b); 
    });
    int index = 0;
    for(auto const vect : eigen_vectors_and_values){
        eigen_values(index) = std::get<0>(vect);
        eigen_vectors.row(index) = std::get<1>(vect);
        index++;
    }

这里涉及到的是covmat,需要找出它的特征向量和特征值。同时,我们通常会按降序排序它们。一个重要的事情是,在选择使用哪种特征分解技术时要小心,因为它们并不是以相同的方式执行。你可以在这里找到更多信息 [https://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html ]


解决方案是实数还是复数取决于您输入的矩阵。求解器Eigen::EigenSolver接受一般矩阵,因此使用“.real()”来摆脱虚部将会得到错误的结果(此外,特征向量可能具有任意复杂相位!)。从名称“covmat”来看,我假设您正在输入一个协方差矩阵,该矩阵是对称的(或自共轭/自伴随的)。在这种情况下,为了提高性能和准确性,最好使用Eigen::SelfAdjointEigenSolver。我不知道您在第4行之后要做什么。 - DavidAce
@DavidAce "承认一般矩阵,因此使用".real()"来摆脱虚部将会得到错误的结果",因为我知道结果将是实数,并且需要获取Eigen :: VectorXf而不是复向量。 - GPrathap
@DavidAce:“我不知道你在第4行之后想做什么。”请阅读下面的评论:“我按照降序对它们进行排序,这是我们大多数时候所做的。” - GPrathap
C的替代品是什么? - mohammadsdtmnd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接