Je souhaite écrire une fonction avec la signature suivanteVectorize une matrice symétrique
VectorXd vectorize (const MatrixXd&);
qui retourne le contenu d'une matrice symétrique en forme VectorXd
, sans éléments répétés. Par exemple,
int n = 3; // n may be much larger in practice.
MatrixXd sym(n, n);
sym << 9, 2, 3,
2, 8, 4,
3, 4, 7;
std::cout << vectorize(sym) << std::endl;
REVERSE:
9
2
3
8
4
7
L'ordre des éléments dans vec
n'a pas d'importance, à condition qu'il soit systématique. Ce qui est important à mes fins est de retourner les données de sym
sans les éléments répétés, car sym
est toujours supposé être symétrique. C'est-à-dire, je veux retourner les éléments de la "vue" triangulaire supérieure ou inférieure de sym
sous la forme VectorXd
.
J'ai naïvement implémenté vectorize
avec des boucles for
imbriquées, mais cette fonction peut être appelée très souvent dans mon programme (plus de 1 million de fois). Ma question est donc: quelle est la manière la plus efficace en termes de calcul pour écrire vectorize
? J'espérais utiliser le triangularView
d'Eigen, mais je ne vois pas comment.
Merci d'avance.
Il semblerait que vous ayez besoin d'utiliser 'TriangularView' et' Map'. – TriskalJM
Cette fonctionnalité-demande est liée: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=42 (voir en particulier comment2 pour une alternative d'emballage - vous devriez aussi faire plus ou moins manuellement, cependant). – chtz