将Eigen矩阵的每隔一行或一列提取为新矩阵

3

有没有一种简单有效的方法来提取下面矩阵中的奇数/偶数行或列:

int m=999,n = 1000;
MatrixXd mat(m,n);

如何将它们提取到一个新矩阵中?

一种可能的方法是使用一个 for 循环,并将所需的行/列放入新矩阵的相应行/列中。但是否有更简单、更高效的方法来实现呢?

1个回答

2

没有更有效的解决方案,但对于列来说,由于您有一个列主矩阵,并且列数为偶数,因此可以将数据重塑为这样的形式,即偶数/奇数列形成块:

MatrixXd even_cols = MatrixXd::Map(mat.data(), 2*999, 500).topRows(999);
MatrixXd odd_cols  = MatrixXd::Map(mat.data(), 2*999, 500).bottomRows(999);

另一种更常见的方法是使用步长(strides)来操作:
MatrixXd even_cols = MatrixXd::Map(mat.data(),     999, 500, OuterStride<>(2*999));
MatrixXd odd_cols  = MatrixXd::Map(mat.data()+999, 999, 500, OuterStride<>(2*999));

这对于列优先矩阵的偶/奇行也适用。在这种情况下,我们需要定义一个内部步幅为2:

MatrixXd even_rows = MatrixXd::Map(mat.data(),   500, 1000, Strides<Dynamic,2>(999,2));
MatrixXd odd_rows  = MatrixXd::Map(mat.data()+1, 499, 1000, Strides<Dynamic,2>(999,2));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接