【问题标题】:Extract every other row or column of an Eigen matrix as a new matrix将特征矩阵的每隔一行或一列提取为一个新矩阵
【发布时间】:2013-12-20 12:44:42
【问题描述】:

是否有任何简单有效的方法来提取以下矩阵的奇数/偶数行或列:

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

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

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

【问题讨论】:

    标签: c++ matrix eigen indices


    【解决方案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);
    

    另一种更通用的方法是使用 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));
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多