奇怪的特征映射行为,零步幅

时间:2017-07-17 10:59:14

标签: eigen stride

来自Eigen::Stride docs:

  

内部步幅是两个连续之间的指针增量   行主矩阵的给定行内或给定行内的条目   列主要矩阵的列。

     

外跨步是两个连续行之间的指针增量   行主矩阵或a的两个连续列之间   列主要矩阵。

假设我想创建一个包含重复向量作为行的矩阵。在python numpy中我可以使用零长度步幅来做到这一点。 Eigen docs没有提及零步,但行为看起来很奇怪:

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 :(得分:2)

编译时的步幅为0表示Eigen中的“自然步幅”。如果要多次重复向量,则应使用.replicate()函数:

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

另请查看.rowwise().replicate().colwise().replicate(),每个都带有模板参数或运行时参数(取决于您实际需要的内容)。