Bedingter Austausch elementweise
Ich habe ein $4\times 4$Matrix (symbolisch). Es hat eine Variable, sagen wir jj, die sein sollte$1$ für Diagonale und $0$für nicht diagonale Einträge. Ich muss eine Ersatzregel schreiben, die dies kann. Jetzt wähle ich jedes Element aus und eliminiere es jjseparat mit matrix[[1, 1]] /. jj -> 1. Aber es ist zu langweilig, und ich bin sicher, es muss einen klügeren Weg geben, dies zu tun.
Die ursprüngliche Matrix ist zu groß und sehr komplex. Ich schreibe ein Beispiel$3\times 3$ Matrix hier drüben:
A = {{2 AcD am g1*jj, jj + 1, 3 + g}, {jj + 2*g1, g1*jj,
AcD + jj}, {jj*g1, g1 + jj, AcD+jj*am}}
Antworten
Ich würde MapIndexed[]+ KroneckerDelta[]dafür verwenden:
MapIndexed[# /. jj -> Apply[KroneckerDelta, #2] &, A, {2}]
{{2 AcD am g1, 1, 3 + g}, {2 g1, g1, AcD}, {0, g1, AcD + am}}
Dies funktioniert, indem zuerst die Diagonale aus der Matrix extrahiert wird, jj in der Diagonale auf 1 gesetzt und erneut zur Matrix hinzugefügt wird, wobei alle jj auf Null gesetzt wurden:
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}}