【问题标题】:How can I use an Eigen::Map object for Eigen::EigenSolver?如何为 Eigen::EigenSolver 使用 Eigen::Map 对象?
【发布时间】:2016-07-12 03:46:35
【问题描述】:

我有一个连续的 OpenCV(非对称)矩阵 cv::Mat m,我想通过 Eigen::EigenSolver 计算其特征向量和特征值。

由于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(我认为)。

/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

【问题讨论】:

    标签: c++ opencv eigen


    【解决方案1】:

    你不能用Map声明EigenSolver,矩阵类型必须是Matrix,所以在你的情况下:

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

    您也可以用RowMatrixXf 实例化EigenSolver,但性能应该会更低,尽管有转置。

    【讨论】:

    • 感谢您的回答。因此,使用您在上面发布的代码,创建 mMapped 会很有效,即使 m 真的很大,对吧(数十万行/列)?
    • 创建mMapped 是无操作的,但计算特征值具有三次复杂性,因此如果 m=10^5 则无法在合理的时间内得到答案。我希望您的矩阵是稀疏的,并且您不需要所有特征值。
    • 幸运的是它是对称的,所以如果我没记错的话,计算它们应该更快
    • 对于对称矩阵,使用SelfAdjointEigenSolver,但这仍然需要大量时间(几天)。
    猜你喜欢
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多