Remplacement conditionnel par élément

Aug 24 2020

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

6 J.M.'sennui Aug 24 2020 at 19:13

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}}
4 infinitezero Aug 24 2020 at 17:14

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

kglr Aug 25 2020 at 12:46
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}}