6
votes

Modifier la diagonale de la matrice Eigen

J'ai un Eigen :: matrixxd et j'ai besoin de modifier la valeur des éléments dans sa diagonale. En particulier, j'ai un autre Eigen :: matrixxd avec une seule colonne et le même nombre de lignes de la première matrice.

J'ai besoin de soustraire à la diagonale de la première matrice la valeur des éléments de la deuxième matrice.

exemple: xxx

Comment puis-je faire?


2 commentaires

Soustrayez une diagonale arbitraire? Ou est-ce toujours 1 (en d'autres termes soustrayez-vous toujours le Matrice d'identité )


@Corykramer diagonale arbitraire


4 Réponses :


0
votes
for(int i = 0; i < matrix1.rows(); ++i)
    matrix1(i, i) -= matrix2(i, 0);
This code iterates over each row of the matrix (matrix1.rows()) and subtracts the corresponding value of matrix2 (matrix2(i, 0)) from the diagonals in matrix1 (matrix1(i, i)).

1 commentaires

Bien que ce code puisse répondre à la question, fournissant un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.



6
votes

Cela fonctionne pour moi:

A_2=A-B.asDiagonal();


0 commentaires

0
votes

manipulation matricielle dans Eigen Très similaire à celui des tableaux. L'indexation commence de zéro et il est majeur de la ligne. La documentation ( Eigen: la classe matricielle est bien écrite et peut vous aider à résoudre les problèmes futurs .

Pour votre problème indiqué, la solution est donnée ci-dessous. xxx

Cependant, j'utiliserais matrix3d ​​et vector3d pour la première et la deuxième matrice, respectivement.


1 commentaires

Il est probablement préférable d'utiliser matb.Rows () au lieu d'un numéro codé dur 3 , comme fait dans la réponse par @ otah007



6
votes

Le moyen le plus simple et le plus rapide de faire est: xxx

bien sûr, mieux utiliser le type vectoriel pour les vecteurs (ici pour B < / Code>), et enfin si B est constant, vous pouvez utiliser des installations de réseau: xxx


2 commentaires

Comment est-ce plus simple et plus rapide que a - b.asdiagonal () ?


Peut-être parce qu'il évite de créer B en tant que matrice diagonale et ne doit-il faire que des calculs A2.Rows () plutôt que A2.SIZE? Bien que je suppose que l'Eigen est assez intelligent quand il sait que B.ASDIAGONAL () est diagonale.