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

标签 c++ matrix eigen indices

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

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

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

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

最佳答案

没有更有效的解决方案,但对于列,因为您有一个列数为偶数的列主矩阵,您可以 reshape 数据,使偶数/奇数列形成 block :

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

关于c++ - 将特征矩阵的每隔一行或每隔一列提取为一个新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368446/

相关文章:

c++ - 为什么 Debian 和 AS400 给出不同的 base64 编码字符串?

c++ - MSAA UI Automation get_accChildCount 在 Winforms 中错误地为 Infragistics UltraTree 返回 0

c++ - C++中的新运算符

java - 想要JAVA中mxn矩阵中的所有对角线

c++ - Eigen、make 和 cmake 之间的问题(可能是 cmake 错误)

c++ - tftp 客户端没有从服务器接收(发送到错误的端口)

matlab - reshape 列向量

matlab - 如何对具有相同列值的行进行分组?

c++ - 如何将 Argb32 加载到 Eigen Matrix 中以获得最佳性能?

eigen - 按行线程安全写入 Eigen::MatrixXd