【问题标题】:c++ find eigenvalues and eigenvectors of matrixc++ 求矩阵的特征值和特征向量
【发布时间】:2018-10-31 16:37:19
【问题描述】:

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

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

是否有任何算法/教程/代码似乎不太难理解?

【问题讨论】:

标签: c++ matrix eigenvalue eigenvector


【解决方案1】:

如果有人需要这个,我是怎么做的

    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 "承认一般矩阵,所以使用 ".real()" 去除虚部会给出错误的结果 " 因为我知道结果是真实的并且需要得到 Eigen: :VectorXf 代替复向量
  • @DavidAce “我不知道你在第 4 行之后要做什么”阅读以下评论:“我按照我们最常做的降序对它们进行排序。”
猜你喜欢
  • 2012-08-08
  • 2017-09-27
  • 2019-04-27
  • 1970-01-01
  • 2011-09-29
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多