如何滚动 Eigen:Matrix 的行?

How to roll the rows of a Eigen:Matrix?

我想通过像这样滚动 N∈ℤ 行来重新索引 Eigen:Matrix(此处 N=+1):

1 4 7  ->  3 6 9
2 5 8      1 4 7
3 6 9      2 5 8 

有没有简单的方法,还是我必须创建一个新矩阵并复制数据?

我建议设置一个新矩阵并复制数据。 Eigen 的块操作允许以有效的方式执行此操作。下面是如何为上面的示例完成 n 行的移位。

MatrixXi A(3,3);
A << 1, 2, 3, 4, 5, 6, 7, 8, 9;
A.transposeInPlace();
int n = 1; // number of shifts
n = n % A.rows();

MatrixXi B(A.rows(), A.cols());
B.bottomRows(A.rows() - n) = A.topRows(A.rows() - n);
B.topRows(n) =  A.bottomRows(n);

std::cout << "B = " << B << std::endl;

如果您对 matlab-like 语法感兴趣,您也可以使用

MatrixXd A;
//... fill A
VectorXi indices = {{2,0,1}};

A(indices, Eigen::all); 

我不知道,这是否是内部复制。

注意:这不适用于稀疏矩阵,请参见