特征:按行复制(广播)

时间:2017-08-02 16:35:16

标签: optimization eigen

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

M
  • 0 1 0 1 2 3 -> 0 1 2 3 2 3 M.rowwise().replicate(n)的缩写,似乎没用。

  • 以下代码段会复制,如果M.replicate(1,n)是表达式,则无效。

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

是否有正确的方法来实现此广播视图?

1 个答案:

答案 0 :(得分:3)

你想要的基本上是Kronecker product,其中包含一个矩阵。您可以使用(不支持的)KroneckerProduct module

#include <iostream>
#include <unsupported/Eigen/KroneckerProduct>

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

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