c++ 特征分解速度大
c++ Large eigendecomposition speed
作为我的管道的一部分,我需要以 6000x6000 的数量级执行大矩阵的特征分解。矩阵是密集的,所以除非我简化问题(如果可能的话),否则不能使用稀疏方法。
目前我玩玩具数据。将特征库用于 513x513 矩阵我需要 ~6.5 秒,而对于 2049x2049 矩阵我需要 ~130 秒,这听起来令人望而却步,因为增加不是线性的。这是通过Eigen::SelfAdjointEigenSolver
实现的,而使用其他方法(如Eigen::EigenSolver
或Eigen::ComplexEigenSolver
)我没有得到显着的改善。当我尝试使用arma::eig_sym
犰狳时,即使使用"dc"选项,也发生了同样的情况,该选项应该提供更快但近似的结果。犰狳有一些方法只返回加速的前 X 特征值,但这仅适用于稀疏方法。目前,我可能可以摆脱前 10-20 个特征值。
有没有办法或库/方法可以给我一个显着的加速?
Spectra 用于检索大型矩阵的几个特征值。
用于计算最大和最小 10 个特征值的示例代码可能如下所示:
#include <Eigen/Core>
#include <Eigen/Eigenvalues>
#include <MatOp/DenseGenMatProd.h>
#include <MatOp/DenseSymShiftSolve.h>
#include <SymEigsSolver.h>
#include <iostream>
using namespace Spectra;
int main()
{
srand(0);
// We are going to calculate the eigenvalues of M
Eigen::MatrixXd A = Eigen::MatrixXd::Random(1000, 1000);
Eigen::MatrixXd M = A.transpose() * A;
// Matrix operation objects
DenseGenMatProd<double> op_largest(M);
DenseSymShiftSolve<double> op_smallest(M);
// Construct solver object, requesting the largest 10 eigenvalues
SymEigsSolver< double, LARGEST_MAGN, DenseGenMatProd<double> >
eigs_largest(&op_largest, 10, 30);
// Initialize and compute
eigs_largest.init();
eigs_largest.compute();
std::cout << "Largest 10 Eigenvalues :n" <<
eigs_largest.eigenvalues() << std::endl;
// Construct solver object, requesting the smallest 10 eigenvalues
SymEigsShiftSolver< double, LARGEST_MAGN, DenseSymShiftSolve<double> >
eigs_smallest(&op_smallest, 10, 30, 0.0);
eigs_smallest.init();
eigs_smallest.compute();
std::cout << "Smallest 10 Eigenvalues :n" <<
eigs_smallest.eigenvalues() << std::endl;
return 0;
}
我建议尝试Arpack-Eigen。我从Octave/Matlab知道它可以在一秒钟内计算随机2049x2049的最大特征值,并在5-20秒内计算最大的10特征值,eigs(rand(2049), 10)
。现在,它的文档help eigs
指向ARPACK。阿帕克-本根https://github.com/yixuan/arpack-eigen 允许您从较大的矩阵请求 10 个特征值,如下所示:SymEigsSolver< double, LARGEST_ALGE, DenseGenMatProd<double> > eigs(&op, 10, 30);
.
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- C++ 乔列斯基因式分解
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何加快本征C++中的LU分解?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何将整数分解为不同的变量?
- C++ 速度/效率:为 DRY 互斥函数创建临时或分解参数
- c++ 特征分解速度大