Странное поведение Eigen с нулевым шагом

Из Eigen::Stride документы:

Внутренний шаг - это приращение указателя между двумя последовательными записями в данной строке основной матрицы строк или в данном столбце основной матрицы столбцов.

Внешний шаг - это приращение указателя между двумя последовательными строками матрицы строк или между двумя последовательными столбцами матрицы столбцов.

Допустим, я хочу создать матрицу, состоящую из повторяющегося вектора в виде строки. В Python NumPy я могу использовать шаг нулевой длины, чтобы сделать это. Собственные документы ничего не говорят о нулевых шагах, но поведение выглядит очень странно:

typedef Matrix<float, Dynamic, Dynamic, RowMajor> MatrixType;

MatrixType M1(3, 3);
M1 << 1, 2, 3,
      4, 5, 6,
      7, 8, 9;

Map<MatrixType, 0, Stride<0, 0>> zeroMap(M1.data(), 2, 2);  
Map<MatrixType, 0, Stride<2, 0>> oneMap(M1.data(), 2, 2);  

cout << "Row stride = 0:" << "\n";
cout << zeroMap << "\n" << "Row stride = 2:" << "\n";
cout << oneMap;
cout << "\n";

Возвращает одинаковый результат в обоих случаях:

Row stride = 0:
1 2
3 4
Row stride = 2:
1 2
3 4

Почему результаты одинаковы для шага 0 и шага 2?

1 ответ

Решение

Шаг 0 во время компиляции означает "естественный шаг" в Eigen. Если вы хотите повторить вектор несколько раз, вы должны использовать .replicate() функция:

M1.row(0).replicate<3,1>();

Также посмотрите на .rowwise().replicate(), .colwise().replicate() каждый с аргументами шаблона или аргументами времени выполнения (в зависимости от того, что вам действительно нужно).

Другие вопросы по тегам