0

来自Eigen::Stride文档:

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

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

假设我想创建一个包含重复向量作为一行的矩阵。在 python numpy 中,我可以使用零长度步幅来执行此操作。Eigen 文档对零步幅只字未提,但行为看起来很奇怪:

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 的结果相同?

4

1 回答 1

2

A stride of 0 at compile time means "natural stride" in Eigen. If you want to repeat a vector multiple times, you should use the .replicate() function:

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

Also have a look at .rowwise().replicate(), .colwise().replicate(), each with template arguments or runtime arguments (depending on what you actually need).

于 2017-07-17T12:32:55.547 回答