Извлечь каждую вторую строку или столбец собственной матрицы в качестве новой матрицы

Есть ли простой и эффективный способ извлечь нечетные / четные строки или столбцы приведенной ниже матрицы:

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

и извлечь их в новую матрицу?

Одним из возможных способов является использование for цикл и поместите нужные строки / столбцы в соответствующие строки / столбцы новой матрицы. Но есть ли более простой и эффективный способ сделать это?

3

Решение

Не более эффективное решение, но для столбцов, поскольку у вас есть матрица основных столбцов с четным номером столбца, вы можете изменить форму данных так, чтобы четные / нечетные столбцы образовывали блоки:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]