我正在使用Eigen,并且当前正在尝试编写一个函数来对矩阵的行进行操作。我遵循了guidelines in the docs,但是没有尝试编译(使用clang或g++);我机智。如何实际编写将要使用RowXpr的函数?

作为引用,这是我到目前为止尝试过的:

#include <iostream>
#include <Eigen/Core>

using namespace std;
using namespace Eigen;

constexpr Eigen::StorageOptions Order = ColMajor;

using vect_t = Matrix<double, 1, 3, Order>;
using matr_t = Matrix<double, Dynamic, 3, Order>;

#define FUNC 3

#if FUNC == 1

vect_t func(const vect_t& f)
{
    return f;
}

#elif FUNC == 2

vect_t func(const Ref<vect_t>& f)
{
    return f;
}

#elif FUNC == 3

template<class D> vect_t func(const MatrixBase<D>& f)
{
    return f;
}

#endif

int main()
{
    matr_t M = matr_t::Random(5,3);
    cout << M << endl;
    cout << func( M.row(2) ) << endl;

    return 0;
}

谢谢!

编辑:

使用clang(版本3.8.0-2ubuntu4)我得到的错误如下。该错误与g++相当。
dan@dan-laptop:~/workspace/scratch$ clang++ eigen_func_test.cpp -I /home/dan/Downloads/eigen_3.3.3/ --std=c++11 && ./a.out
In file included from eigen_func_test.cpp:2:
In file included from /home/dan/Downloads/eigen_3.3.3/Eigen/Core:436:
/home/dan/Downloads/eigen_3.3.3/Eigen/src/Core/PlainObjectBase.h:899:7: error: static_assert failed
      "INVALID_MATRIX_TEMPLATE_PARAMETERS"
  ...EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dan/Downloads/eigen_3.3.3/Eigen/src/Core/util/StaticAssert.h:32:40: note: expanded from macro
      'EIGEN_STATIC_ASSERT'
    #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
                                       ^             ~
/home/dan/Downloads/eigen_3.3.3/Eigen/src/Core/PlainObjectBase.h:535:7: note: in instantiation of member function
      'Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 0, 1, 3> >::_check_template_params' requested here
      _check_template_params();
      ^
/home/dan/Downloads/eigen_3.3.3/Eigen/src/Core/Matrix.h:379:9: note: in instantiation of function template
      specialization 'Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 0, 1, 3>
      >::PlainObjectBase<Eigen::Block<Eigen::Matrix<double, -1, 3, 0, -1, 3>, 1, 3, false> >' requested here
      : Base(other.derived())
        ^
eigen_func_test.cpp:32:9: note: in instantiation of function template specialization 'Eigen::Matrix<double, 1, 3, 0,
      1, 3>::Matrix<Eigen::Block<Eigen::Matrix<double, -1, 3, 0, -1, 3>, 1, 3, false> >' requested here
        return f;
               ^
eigen_func_test.cpp:41:10: note: in instantiation of function template specialization
      'func<Eigen::Block<Eigen::Matrix<double, -1, 3, 0, -1, 3>, 1, 3, false> >' requested here
        cout << func( M.row(2) ) << endl;
                ^
1 error generated.

最佳答案

如果您阅读用lang突出显示的部分

EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)

您会看到,如果矩阵在编译时有一行,并且有多于一列,则它必须是RowMajor。这意味着,如果您设置Order = RowMajor或仅将, Order留在
using vect_t = Matrix<double, 1, 3, Order>;

您的代码应该可以正常编译(看起来其他所有内容都只是后续错误)。

10-04 12:27