2017-08-02 7 views
2

Ich mag würde jede Zeile einer Matrix M ohne Kopie replizieren auftritt (dh durch Erstellen einer Ansicht):Eigen: Replizieren (broadcast) durch Reihen

0 1   0 1 
2 3 -> 0 1 
       2 3 
       2 3 
  • M.rowwise().replicate(n) ist ein shorcut für M.replicate(1,n) das scheint irgendwie nutzlos.

  • Das folgende Snippet erstellt eine Kopie und funktioniert nicht, wenn M ein Ausdruck ist.

 
    Eigen::Index rowFactor = 2; 
    Eigen::MatrixXi M2 = Eigen::Map(M.data(), 1, M.size()).replicate(rowFactor, 1); 
    M2.resize(M.rows()*rowFactor, M.cols()) ; 
  • In einigen Situation kann ich die Zwischenansicht Eigen::Map<Eigen::MatrixXi>(M.data(), 1, M.size()).replicate(rowFactor, 1) durch Umformen die anderen Operanden verwenden, aber das ist nicht sehr befriedigend.

Gibt es einen richtigen Weg, um diese Broadcast-Ansicht zu erreichen?

Antwort

2

Was Sie wollen, ist im Wesentlichen ein Kronecker product mit einer Matrix von Einsen. Sie können die (nicht unterstützt) KroneckerProduct module dafür verwenden:

#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'; 
} 

Sein ‚nicht unterstützt‘ bedeutet, dass die API des Moduls nicht stabil sein wird garantiert (auch wenn dieses Modul seit seiner Einführung hat sich nicht geändert, glaube ich).

+0

Schöne Lösung, obwohl ein temporärer Vektor und Multiplikationen verwendet werden. Ich muss prüfen, ob dieses Produkt träge ist. – YvesgereY

+1

Das 'Vector2i :: Ones()' wird nicht explizit generiert. Es wird tatsächlich eine Multiplikation passieren, aber ich bin zuversichtlich, dass der Compiler zumindest für ganze Zahlen in der Lage sein wird, dies zu optimieren. Wenn Sie 100% sicher sein wollen, dass keine Multiplikation stattfindet, schauen Sie sich die Implementierung von KroneckerProduct an. – chtz

+0

Sie haben Recht. Sogar die dynamische Version 'VectorXi :: Ones (size)' gibt einen optimierten 'konstanten' Vektor zurück. – YvesgereY

Verwandte Themen