2017-09-03 4 views
0

J'ai une matrice clairsemée A dans Eigen C++. Maintenant, je veux symétriser à une autre matrice clairsemée Asym:Comment symétriser une matrice clairsemée dans Eigen C++?

J'espérais que ce serait aussi simple que:

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

Mais pour des raisons évidentes, il donne l'erreur d'échec assert suivant:

error: static assertion failed: THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH 

Ma question est comment faire proprement l'opération ci-dessus dans Eigen C++?

+0

est un symétrique? Sinon, vous ne pouvez pas ajouter A et sa transposition. En d'autres termes, vous pouvez ajouter deux matrices, mxn et nxm si et seulement si m == n. Je n'ai jamais vu une seule formule où A + A^T est effectuée. Est-ce que vous essayez A^T x A, ce qui a beaucoup de sens à la fois. –

Répondre

1

La meilleure façon de rendre votre compilation de code est d'évaluer la matrice transposée dans un temporaire de l'ordre de stockage correct:

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

Merci! Pensez-vous que cette manière d'optimiser la transposition temporaire? – user62039

+0

Il ne se débarrasse pas du temporaire - et je ne pense pas qu'il existe un algorithme efficace pour ajouter des matrices éparses avec un ordre de stockage différent (peut-être à moins que vous puissiez exploiter une structure spéciale de la matrice). – chtz