【问题标题】:Strange Eigen map behavior with zero stride零步幅的奇怪特征图行为
【发布时间】:2017-07-17 10:59:14
【问题描述】:

来自Eigen::Stride docs:

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

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

假设我想创建一个包含重复向量作为一行的矩阵。在 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 的结果相同?

【问题讨论】:

    标签: eigen stride


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      相关资源
      最近更新 更多