2017-08-26 10 views
1

Ich möchte ein dichtes VectorXf zu einem SparseMatrix hinzuzufügen, und ich weiß, dass ich Matrix + Vektor für dichte Matrix leicht tun könnten, like thisDünnbesetzte Matrix und Vektoraddition Rundfunk in Eigen

Eigen::MatrixXf mat(2,4); 
    Eigen::VectorXf v(2); 

    mat << 1, 2, 6, 9, 
     3, 1, 7, 2; 

    v << 0, 
     1; 

    //add v to each column of m 
    mat.colwise() += v; 

aber, wie dies zu tun für spärliche Matrix?

Antwort

2

Die einfachste Möglichkeit besteht darin, über alle Spalten zu iterieren und einen spärlichen Vektor zu Ihrer spärlichen Matrix hinzuzufügen. Und Sie sollten beachten, dass, wenn Sie colwise Operation benötigen, Ihre Matrix als Column-Major gespeichert werden sollte.

// allocate dense object 
Eigen::MatrixXd M(2,4); 
Eigen::VectorXd v(2); 
// allocate sparse vector 
Eigen::SparseVector<double> spV(2); 
// allocate Column-major sparse matrix 
Eigen::SparseMatrix<double, Eigen::ColMajor> spM(2, 4); 
// initialize dense objects values 
M << 1, 0, 0, 2, 
    4, 5, 0, 0; 
v << 1, 
    3; 
// convert dense objects to sparse representation 
spM = M2.sparseView(); 
spV = v2.sparseView(); 
// iterate over sparse Matrix columns 
for(int i = 0; i< spM.cols(); ++i) { 
    spM.col(i) += spV; 
} 

Es kann nicht in einer solchen Art und Weise für dichte Vektor und einer der Gründe ist, durchgeführt werden, dass dieser Vorgang keinen Sinn macht, da die resultierende Matrix dicht sein wird. In diesem Fall müssen Sie einige dichte Matrix erstellen und colwise Betrieb mit dichtem Vektor wie folgt durchführen:

Eigen::MatrixXd(spM).colwise() + v 
+0

Dank und ziemlich klar, eigentlich, was ich jetzt tue, ist die gleiche wie Sie gesagt hat, dh Iterierte alle Spalten und tun 'spM.col (i) + = spV', und da dichte Matrix eine so bequeme Methode' .colwise() 'ohne Iteration der Spalten hat, so habe ich gerade diese Frage geschrieben, um zu bestätigen, ob wir das tun könnten '.colwise' Sache für spärliche Matrix :-) – avocado

+0

@avocado Wie schon von isakoff angegeben, ist das Ergebnis sowieso dicht, also sollte man wohl die spärliche Matrix in eine dichte Matrix konvertieren und von dort weitermachen. 'Eigen :: MatrixXd (spM) .colwise() + v 'gibt Ihnen keine dünn besetzte Matrix, es gibt Ihnen eine dichte temporäre Matrix (zumindest wird es einmal ausgewertet). –

+0

@AviGinsburg, so 'Eigen :: MatrixXd (spM) .colwise() + v 'wird sowieso eine dichte Matrix erstellen, oder? Wenn ja, dann nehme ich diesen Weg vielleicht nicht, da die spärliche Matrix, mit der ich es zu tun habe, ziemlich groß ist. – avocado