2017-08-02 3 views
2

によって(ブロードキャスト)複製Iは、(ビューを作成することによって)生じる任意コピーせずに行列Mの各行を複製したい:固有:行

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

本質的には、行列が1の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は(このモジュールはその導入以来変わっていないのに、私は思う)安定であることが保証されていないことを意味します。

+0

一時的なベクトルと乗算が使用されますが、うまく解決します。この商品が遅れているかどうかを確認する必要があります。 – YvesgereY

+1

'Vector2i :: Ones()'は明示的に生成されません。実際には乗算が行われますが、少なくとも整数の場合、コンパイラはそれを最適化することができると確信しています。乗算が発生しないことを100%確実にしたい場合は、KroneckerProductの実装を見てください。 – chtz

+0

あなたはそうです。動的バージョン 'VectorXi :: Ones(size) 'でも最適化された'定数 'ベクトルが返されます。 – YvesgereY