2017-08-02 33 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