2017-08-02 34 views
2

我想复制矩阵M的每一行,而不发生任何拷贝(通过创建一个视图IE):本征:复制(广播)由行

0 1   0 1 
2 3 -> 0 1 
       2 3 
       2 3 
  • M.rowwise().replicate(n)为shorcut M.replicate(1,n)这似乎有点无用。

  • 以下代码片段会执行副本,并且如果M是表达式,则无法工作。

 
    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),但是这不是非常令人满意。

是否有适当的方法来实现此广播视图?

回答

2

你想要的基本上是一个Kronecker product与矩阵的1。您可以使用的(不支持)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不保证是稳定的(尽管这个模块还没有推出以来改变,我认为)。

+0

不错的解决方案,尽管使用了临时向量和乘法。我必须检查这个产品是否懒惰。 – YvesgereY

+1

'Vector2i :: Ones()'不会被显式生成。确实会发生乘法,但我相信,至少对于整数来说,编译器将能够优化这些。如果您想100%确定不会发生乘法,请查看KroneckerProduct的实现。 – chtz

+0

你说得对。即使动态版本“VectorXi :: Ones(size)”也会返回一个优化的“常量”向量。 – YvesgereY