2017-06-12 3 views
3
matrice diagonale

Je veux ajouter des éléments à la diagonale d'un objet Eigen :: MatrixXd avec la bibliothèque Eigen3 (version 3.3.2).Matrix et dans Eigen3

deux pour l'optimisation et être en mesure d'utiliser constness, je veux le faire en ajoutant une matrice diagonale par rapport à l'original, comme celui-ci

const MatrixXd a(2,2); a << 1, 2, 3, 4; 
const VectorXd v(2); v << 10, 20; 
const MatrixXd b = a + v.asDiagonal(); 

Mais cela ne fonctionne pas: je reçois une erreur de compilation au sujet il n'y a pas de operator+. Ajoutant deux MatrixXd fonctionne, donc je m'attendrais à ce qu'il se comporte pour la spécialisation en diagonale.

Retrait de la constness ne contribue pas. L'utilisation de matrices de tailles statiques ne fait aucune différence, ce n'est donc pas une dimension dynamique. Et construire explicitement un DiagonalMatrix plutôt que d'utiliser le DiagonalWrapper retourné par asDiagonal() donne aussi la même erreur.

La multiplication est bien formée pour ces types: MatrixXd c = a * v.asDiagonal(); compile et s'exécute très bien. Est-ce que je fais quelque chose de mal, ou est operator+(Matrix,DiagonalMatrix) manquant juste de la bibliothèque?

+1

https://forum.kde.org/viewtopic.php?f=74&t=136617 – CoryKramer

+0

Également relié: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=610 – chtz

Répondre

1

Merci à @CoryKramer pour relier à une question équivalente posées et réponses sur le forum KDE/Eigen: https://forum.kde.org/viewtopic.php?f=74&t=136617 Voici un résumé pour la postérité:

plus « normale » d'un Eigen Matrix et soit un DiagonalMatrix ou DiagonalWrapper n'est pas une opération prise en charge, tandis que la multiplication ou l'ajout de composés sont corrects. += n'est pas une option si vous essayez de travailler avec des objets const, mais la construction d'un Matrix2d explicite de l'appel asDiagonal() - pourquoi ne pas que je pense à essayer que ?! - fonctionne bien:

MatrixXd b = a + Matrix2d(v.asDiagonal()); 

Je suppose qu'il existe des pénalités de performance potentielles, ce qui explique pourquoi cela n'est pas pris en charge sans la construction de type. Mais ils ne risquent pas d'être pire que l'alternative sale consistant à boucler manuellement des index diagonaux.