1

我正在编写一个将行矩阵作为参数的方法,例如:

method(Matrix<float,1,Dynamic>& rowMatrix);

如果我尝试使用 Matrix.row(x) 的结果调用该方法,例如:

Matrix<float,Dynamic,Dynamic> matrix(2,2);
method(matrix.row(1));

我收到以下错误:

no known conversion for argument 1 from ‘Eigen::DenseBase<Eigen::Matrix<float, -1, -1> >::ColXpr {aka Eigen::Block<Eigen::Matrix<float, -1, -1>, -1, 1, true, true>}’ to ‘Eigen::Matrix<float, -1, 1>&’

我知道这里的问题是我正在尝试分配对 a 的引用Matrix<float,1,Dynamic>ColXpr这似乎无效。我可以通过按值传递来“解决”问题,在这种情况下,我猜想构造一个新的 Matrix 并使用ColXpras 参数构造函数,并且一切正常。

我没有修改方法内部的矩阵,所以按值传递是“可以接受的”。但是,我想通过引用传递以避免复制数据并提高性能。有什么方法可以从 return 转换Matrix::row()为任何可分配给的东西Matrix<datatype,1,Dynamic>&

4

1 回答 1

3

这是不可能的,但您有两种选择:

  1. 按照 Eigen手册中的说明制作函数模板。

  2. 如果您无法编写模板函数,那么devel 分支中可用的Ref<>类是正确的答案。基本上,它归结为:

    method(Ref<Matrix<float,1,Dynamic>, 0, InnerStride> rowMatrix);

    或 const 版本:

    method(const Ref<const Matrix<float,1,Dynamic>, 0, InnerStride<> >& rowMatrix);

于 2013-02-14T17:41:13.903 回答