Есть ли простой и эффективный способ извлечь нечетные / четные строки или столбцы приведенной ниже матрицы:
int m=999,n = 1000;
MatrixXd mat(m,n);
и извлечь их в новую матрицу?
Одним из возможных способов является использование for
цикл и поместите нужные строки / столбцы в соответствующие строки / столбцы новой матрицы. Но есть ли более простой и эффективный способ сделать это?
Не более эффективное решение, но для столбцов, поскольку у вас есть матрица основных столбцов с четным номером столбца, вы можете изменить форму данных так, чтобы четные / нечетные столбцы образовывали блоки:
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));
Других решений пока нет …