2013-12-04 7 views
3

Есть ли простой и эффективный способ извлечения нечетные/четные строк или столбцов, используя матрицу:Извлечение любой другой строки или столбца матрицы Эйгена в качестве новой матрицы

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

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

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

ответ

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