Sostituzione condizionale per elemento
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 jj
separatamente 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
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}}
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

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