2016-07-12 18 views
2

私は連続したOpenCV(非対称)行列cv::Mat mを持っています。その固有ベクトルと固有値をEigen::EigenSolverまで計算したいと思います。Eigen :: EigenSolverにEigen :: Mapオブジェクトを使用するにはどうしたらいいですか?

mは大きい可能性がありますので、cv2eigenでコピーを作成するのは非効率的です。次に、私はEigen::Mapを使いたいです。これは私のコードです:

Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> mMapped (m.ptr<float>(), m.rows, m.cols); 
Eigen::EigenSolver<Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>> solver(mMapped,true);//this gives a bunch of errors 

最後の行には、一連のエラーが表示されます(質問の最後を参照)。これをどうすれば解決できますか?私がmMappedを行列オブジェクトにコピーするのは避けるべきです。それ以外の場合はcv2eigenと同じです(私はそう思います)。

typedef Matrix<float,Dynamic,Dynamic,RowMajor> RowMatrixXf; 
Map<RowMatrixXf> mMapped (m.ptr<float>(), m.rows, m.cols); 
EigenSolver<MatrixXf> eig(mMapped); 

、あなたはまた、RowMatrixXfEigenSolverをインスタンス化することができますが、パフォーマンスが低下する必要があります:あなたはMapEigenSolverを宣言することはできません

/usr/local/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h: In instantiation of ‘class Eigen::EigenSolver<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’: 
../Math.hpp:64:104: required from ‘static void Math::createHashTable(const cv::Mat&, cv::Mat&, cv::Mat&, int, int) [with T = float]’ 
../CloudCache.cpp:155:58: required from here 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h:71:10: error: ‘Options’ is not a member of ‘Eigen::EigenSolver<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >::MatrixType {aka Eigen::Map<Eigen::Matrix<float, -1, -1, 1> >}’ 
    enum { 
     ^
In file included from /usr/local/include/eigen3/Eigen/Eigenvalues:29:0, 
       from ../Math.hpp:16, 
       from ../CloudCache.cpp:15: 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h: In instantiation of ‘class Eigen::RealSchur<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’: 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h:312:27: required from ‘class Eigen::EigenSolver<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’ 
../Math.hpp:64:104: required from ‘static void Math::createHashTable(const cv::Mat&, cv::Mat&, cv::Mat&, int, int) [with T = float]’ 
../CloudCache.cpp:155:58: required from here 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h:58:10: error: ‘Options’ is not a member of ‘Eigen::RealSchur<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >::MatrixType {aka Eigen::Map<Eigen::Matrix<float, -1, -1, 1> >}’ 
    enum { 
     ^
In file included from /usr/local/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h:14:0, 
       from /usr/local/include/eigen3/Eigen/Eigenvalues:29, 
       from ../Math.hpp:16, 
       from ../CloudCache.cpp:15: 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h: In instantiation of ‘class Eigen::HessenbergDecomposition<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’: 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h:228:41: required from ‘class Eigen::RealSchur<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’ 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h:312:27: required from ‘class Eigen::EigenSolver<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >’ 
../Math.hpp:64:104: required from ‘static void Math::createHashTable(const cv::Mat&, cv::Mat&, cv::Mat&, int, int) [with T = float]’ 
../CloudCache.cpp:155:58: required from here 
/usr/local/include/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h:64:10: error: ‘Options’ is not a member of ‘Eigen::HessenbergDecomposition<Eigen::Map<Eigen::Matrix<float, -1, -1, 1> > >::MatrixType {aka Eigen::Map<Eigen::Matrix<float, -1, -1, 1> >}’ 
    enum { 
     ^
subdir.mk:30: recipe for target 'CloudCache.o' failed 
make: *** [CloudCache.o] Error 1 

答えて

0

あなたのケースになるよう、マトリックス型は、Matrixでなければなりません転調にもかかわらず。

+0

あなたの答えをありがとう。だからあなたが上に投稿したコードでは、 'mMapped'を作成することは、' m'が本当に大きく、右(数十万行/列)でも効率的になるでしょうか? – justHelloWorld

+0

'mMapped'を作成するのはopではありませんが、固有値の計算には3次の複雑さがあります。したがって、m = 10^5の場合、妥当な時間内に答えを得る方法はありません。私は、あなたの行列が疎であり、すべての固有値を必要としないことを願っています。 – ggael

+0

幸いにもそれは対称ですので、間違っていないと計算すると対称行列の方が速くなるはずです。 – justHelloWorld

関連する問題