2017-09-03 11 views
0

Ich habe eine seltene Matrix A in Eigen C++. Jetzt mag ich es an einem anderen Sparse Matrix zur Symmetrierung Asym:Wie man eine spärliche Matrix in Eigen C++ symmetriert?

Ich habe gehofft, dass es so einfach sein würde, wie:

Eigen::SparseMatrix<FLOATDATA> A; 
... 
Eigen::SparseMatrix<FLOATDATA> Asym = 0.5*(A+A.transpose()); // error here 

Aber wegen offensichtlichen Gründen es den folgenden Assertion-Fehlerfehler gibt:

error: static assertion failed: THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH 

Meine Frage ist, wie Sie die obige Operation in Eigen C++ sauber machen?

+0

ist ein symmetrisches? Wenn nicht, können Sie A und seine Transponierung nicht hinzufügen. Mit anderen Worten, Sie können zwei Matrizen hinzufügen, mxn und nxm genau dann, wenn m == n ist. Ich habe auch nie eine einzige Formel gesehen, in der A + A^T durchgeführt wird. Versuchen Sie A^T x A, was manchmal sehr sinnvoll ist. –

Antwort

1

Der einfachste Weg, Ihren Code Kompilierung zu machen, ist die transponierte Matrix in eine temporäre der sachgemäße Lagerung, um zu bewerten:

Eigen::SparseMatrix<FLOATDATA> Asym = 0.5*(A+Eigen::SparseMatrix<FLOATDATA>(A.transpose()))); 
+0

Danke! Glauben Sie, dass die vorübergehende Transponierung dadurch optimiert wird? – user62039

+0

Es wird das temporäre nicht los - und ich denke nicht, dass es einen effizienten Algorithmus gibt, um spärliche Matrizen mit unterschiedlicher Speicherordnung hinzuzufügen (vielleicht, wenn Sie nicht eine spezielle Struktur der Matrix ausnutzen können). – chtz

Verwandte Themen