Spectraは、大きな行列のいくつかの固有値を取り出すために使用されます。あなたはわずか数最高または最小の固有ベクトルが必要な場合は、より効率的な方法がある
#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;
}
:最大と最小の10個の固有値を計算する
サンプル・コードは次のように見えるかもしれません。 – SpamBot
これはまさに私が言いますが、これは十分な回避策かもしれません。これらの方法はどちらですか?すべてのポインタをお願いしますか? –
Lapackはこのようなルーチンを提供します。あなたの数に関しては、 'Eigen :: SelfAdjointEigenSolver'を使った2049x2049行列に対して7.5s、6000x6000行列に対して280sを得ました。コンパイラの最適化をオンにしてコンパイルしてください。もちろん、これは依然として禁止的であり、第1の固有ベクトルだけを抽出する専用アルゴリズムをよりよく使用する。 – ggael