2014-02-12 6 views
9

Ich habe eine do_magic Methode, die ein Doppel und fügt 42 dazu. Ich möchte diese Methode auf jeden Koeffizienten einer Eigen::Matrix oder Eigen::Array anwenden (das heißt, ich hätte nichts dagegen, wenn es nur mit einem der beiden Typen möglich ist).Coefficient-weise benutzerdefinierte Funktionen in Eigen

Ist das möglich?

So:

Eigen::MatrixXd m(2, 2);  
m << 1,2,1,2;  
m.applyCoefficientWise(do_magic); 
// m is now 43, 44, 43, 44 

Antwort

10

können Sie unaryExpr verwenden, obwohl dies eine neue Sicht auf die Matrix zurückgibt, anstatt zuzulassen, dass Sie die Elemente in Position zu ändern.

Kopieren Sie das Beispiel aus der Dokumentation:

double ramp(double x) 
{ 
    if (x > 0) 
    return x; 
    else 
    return 0; 
} 
int main(int, char**) 
{ 
    Matrix4d m1 = Matrix4d::Random(); 
    cout << m1 << endl << "becomes: " << endl << m1.unaryExpr(ptr_fun(ramp)) << endl; 
    return 0; 
} 
+4

ich hinzufügen, dass würde, dass, wenn Sie disjoint effizient, tun müssen, und an Ort und Stelle Modifikation der Elemente, können Sie immer die hässliche std verwenden: : for_each auf m.data(). Die Kosten für das oben genannte können jedoch vollkommen akzeptabel sein, abhängig davon, was Sie mit m danach machen (da es eine faule Auswertung implementiert). –

+0

Sowohl die Antwort als auch der Kommentar sind genau das, was ich gesucht habe! Vielen Dank. –