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

时间:2013-12-04 06:21:40

标签: c++ matrix eigen indices

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

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

并将它们提取到一个新的矩阵中?

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

1 个答案:

答案 0 :(得分:1)

没有更高效的解决方案,但是对于列,由于您有一个列数为大的矩阵,并且有一个偶数列,您可以重新整形数据,使得偶数/奇数列形成块:

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

另一种更通用的方法是大步前进:

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));