eigen: получить следующий блок матрицы с шагом = 2 - PullRequest
0 голосов
/ 09 марта 2020

Поддерживает ли Eigen получение следующего блока с шагом = 2?

Я заметил, что поведение по умолчанию с шагом = 1 в этом:

m.block<F, F>(i, j)

Я ищу решение, которое может дать мне следующий блок с не-1 шагом, как показано на анимированном Convolution Demo по следующей ссылке:

http://cs231n.github.io/convolutional-networks/

Если Eigen не поддерживает его, что было бы хорошим способом индексации, чтобы получить следующий блок с stride=k?

Ответы [ 2 ]

4 голосов
/ 09 марта 2020

Вы можете объявить шаг с помощью Eigen::Map следующим образом:

int main()
{
    constexpr int d = 10;
    MatrixXi m(d,d);
    VectorXi lin = VectorXi::LinSpaced(d*d, 0, d*d-1);
    m = Map<MatrixXi>(lin.data(), d, d);
    std::cout << m << "\n\n";

    std::cout << Map<MatrixXi, 0, InnerStride<2>>(m.data() + d + 1, 3, 3) << "\n\n";
    std::cout << Map<MatrixXi, 0, OuterStride<d>>(m.data() + d + 1, 3, 3) << "\n\n";
    // You probably want either this:
    std::cout << Map<MatrixXi, 0, Stride<d, 2>>  (m.data() + d + 1, 3, 3) << "\n\n";
    // or this:
    std::cout << Map<MatrixXi, 0, Stride<2*d, 2>>(m.data() + d + 1, 3, 3) << "\n\n";
    return 0;
}

Обратите внимание, что вы также можете установить шаг во время выполнения. Подробнее см. документацию .

2 голосов
/ 09 марта 2020

С новым API среза и индексации, который будет представлен в Eigen 3.4 (в настоящее время в основной ветке), вы можете написать нарезку в стиле Matlab, например,

   M(Eigen::seqN(i, Eigen::fix<F>, Eigen::fix<stride>),
     Eigen::seqN(j, Eigen::fix<F>, Eigen::fix<stride>));

Возвращает блок, начинающийся с (i,j) размером F x F с stride. Eigen::fix являются необязательными, но могут дать немного лучшее время выполнения.

Рабочий пример: https://godbolt.org/z/wzRdp7

Дополнительная документация: http://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html

С Eigen 3.3 вам нужно написать какое-нибудь решение на основе Map, как предложено @ AviGinsburg.

...