如何滚动 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);
我不知道,这是否是内部复制。
注意:这不适用于稀疏矩阵,请参见
我想通过像这样滚动 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);
我不知道,这是否是内部复制。
注意:这不适用于稀疏矩阵,请参见