关于优化:Eigen: Replicate (broadcast) by rows

Eigen: Replicate (broadcast) by rows

我想复制矩阵 M 的每一行而不发生任何复制(即通过创建视图):

1
2
3
4
0  1          0  1
2  3    ->    0  1
              2  3
              2  3
  • M.rowwise().replicate(n)M.replicate(1,n) 的捷径,看起来没什么用。

  • 以下代码片段进行复制,如果 M 是表达式,则无法工作。

1
2
3
    Eigen::Index rowFactor = 2;
    Eigen::MatrixXi M2 = Eigen::Map(M.data(), 1, M.size()).replicate(rowFactor, 1);
    M2.resize(M.rows()*rowFactor, M.cols()) ;
  • 在某些情况下,我可能会通过重塑其他操作数来使用中间视图 Eigen::Map<Eigen::MatrixXi>(M.data(), 1, M.size()).replicate(rowFactor, 1),但这并不是很令人满意。

有没有合适的方法来实现这个广播视图?


你想要的本质上是一个带有一个矩阵的 Kronecker 乘积。您可以为此使用(不受支持的)KroneckerProduct 模块:

1
2
3
4
5
6
7
8
#include <iostream>
#include <unsupported/Eigen/KroneckerProduct>

int main() {
    Eigen::Matrix2i M; M << 0, 1, 2, 3;
    std::cout << Eigen::kroneckerProduct(M, Eigen::Vector2i::Ones()) << '\
';
}

"不受支持"意味着模块的 API 不能保证是稳定的(尽管我认为这个模块自推出以来就没有改变过)。