我正在编写一个包含许多步骤(PCA)的算法,其中两个步骤是查找给定矩阵的特征值和特征向量。
我不想为此编写整个代码,因为我知道这是一项漫长的工作,因此我搜索了一些临时代码,但只找到了1或2个库,起初我不想包含库,也不想转移到matlab。
是否有任何算法/教程/代码看起来不太难以理解?
我正在编写一个包含许多步骤(PCA)的算法,其中两个步骤是查找给定矩阵的特征值和特征向量。
我不想为此编写整个代码,因为我知道这是一项漫长的工作,因此我搜索了一些临时代码,但只找到了1或2个库,起初我不想包含库,也不想转移到matlab。
是否有任何算法/教程/代码看起来不太难以理解?
如果有人需要的话,这是我如何做到的。
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
Eigen
是一个仅包含头文件的软件包(因此,在技术上,您不需要链接到任何库),这里是文档中用于计算特征值的示例。 - user6764549