7

我正在尝试将矩阵块作为函数的左值返回。假设我的函数如下所示:

Block<Derived> getBlock(MatrixXd & m, int i, int j, int row, int column)
{
    return m.block(i,j,row,column);
}

事实证明,C++ 编译器似乎理解 block() 运算符仅提供临时值,因此编译器禁止将其作为左值返回。但是,在 Eigen 文档中有一些示例,我们可以将 Eigen 用作左值(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing)所以我想知道我们如何不能对函数做同样的事情返回。

a.block(0,0,2,3) = a.block(2,1,2,3);

谢谢!

4

2 回答 2

8

我想把我发现自己的东西放出来,这样可能对其他人有帮助:

我的基本解决方案是知道您希望该块是什么派生类型。在这种情况下:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column)
{
    return m.block(i,j,row,column);
}

有趣的是,这个方法默认会返回对矩阵 m 内容的引用。所以如果我们这样做:

MatrixXd m = MatrixXd::Zero(10,10);
Block<MatrixXd> myBlock = getBlock(m, 1, 1, 3, 3);
myBlock << 1, 0, 0, 
           0, 1, 0, 
           0, 0, 1;

矩阵 m 中的内容也将被修改。但是请注意,

MatrixXd m = MatrixXd::Zero(10,10);
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3);
myBlock << 1, 0, 0, 
           0, 1, 0, 
           0, 0, 1;

不管用。我的理解是,一旦我们将块转换为另一种类型,Eigen 就会在转换之前复制数据。

于 2012-12-06T08:07:30.810 回答
0

我正在尝试这样的事情,特别是返回 4 元素向量的最后 3 个元素,但我无法让它工作。

解决方案结果很好,但如果您不熟悉尾随返回类型,可能会有点混乱:

struct foo{

  Eigen::Vector4d e_;

  // const version
  auto get_tail() const -> const auto { return e_.tail<3>(); };

  // non-const version
  auto get_tail() -> auto { return e_.tail<3>(); };

};
于 2022-01-07T22:49:34.430 回答