Remplacement conditionnel par élément
j'ai un $4\times 4$matrice (symbolique). Il a une variable, disons jj, qui devrait être$1$ pour diagonale et $0$pour les entrées non diagonales. J'ai besoin d'écrire une règle de remplacement qui peut le faire. Maintenant, je sélectionne chaque élément et élimine jjséparément en utilisant matrix[[1, 1]] /. jj -> 1. Mais c'est trop fastidieux et je suis sûr qu'il doit y avoir une manière plus intelligente de le faire.
La matrice d'origine est trop grande et très complexe. J'écris un échantillon$3\times 3$ matrice ici:
A = {{2 AcD am g1*jj, jj + 1, 3 + g}, {jj + 2*g1, g1*jj,
AcD + jj}, {jj*g1, g1 + jj, AcD+jj*am}}
Réponses
J'utiliserais MapIndexed[]+ KroneckerDelta[]pour cela:
MapIndexed[# /. jj -> Apply[KroneckerDelta, #2] &, A, {2}]
{{2 AcD am g1, 1, 3 + g}, {2 g1, g1, AcD}, {0, g1, AcD + am}}
Cela fonctionne en extrayant d'abord la diagonale de la matrice, en définissant jj dans la diagonale à 1 et en l'ajoutant à nouveau à la matrice, où tous les jj ont été mis à zéro:
A = {{2 AcD am g1 jj, jj + 1, 3 + g}, {jj + 2 g1, g1 jj,
AcD + jj}, {jj g1, g1 + jj, AcD + jj*am}}
setDiagonalEntries[m_?MatrixQ] :=
With[{d = Diagonal[m] //. jj -> 1,
o = (m - DiagonalMatrix[Diagonal[m]]) //. jj -> 0},
DiagonalMatrix[d] + o]
setDiagonalEntries[A] // MatrixForm
ReplacePart[A, p : Alternatives @@ Position[A, jj] :> Boole[Equal @@ p[[;; 2]]]]
{{2 AcD am g1, 1, 3 + g}, {2 g1, g1, AcD}, {0, g1, AcD + am}}