Sostituzione condizionale per elemento

Aug 24 2020

Ho un $4\times 4$matrice (simbolica). Ha una variabile, diciamo jj, che dovrebbe essere$1$ per diagonale e $0$per voci non diagonali. Devo scrivere una regola sostitutiva che possa farlo. Ora sto selezionando ogni elemento ed eliminando jjseparatamente usando matrix[[1, 1]] /. jj -> 1. Ma è troppo noioso e sono sicuro che ci deve essere un modo più intelligente per farlo.
La matrice originale è troppo grande ed è molto complessa. Sto scrivendo un campione$3\times 3$ matrice qui:

A = {{2 AcD am g1*jj, jj + 1, 3 + g}, {jj + 2*g1, g1*jj, 
   AcD + jj}, {jj*g1, g1 + jj, AcD+jj*am}}

Risposte

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

Userei MapIndexed[]+ KroneckerDelta[]per questo:

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

Funziona estraendo prima la diagonale dalla matrice, impostando jj nella diagonale a 1 e aggiungendola di nuovo alla matrice, dove tutti i jj sono stati impostati a zero:

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}}