2010-11-11 25 views
6

Gibt es eine elegante Möglichkeit, die Diagonalen einer Matrix in eine neue Liste von Werten zu ändern, die Entsprechung von Band mit SparseArray?Ändern der Diagonalen einer Matrix mit Mathematica

sagen, dass ich die folgende Matrix (siehe unten)

(mat = Array[Subscript[a, ##] &, {4, 4}]) // MatrixForm 

und ich möchte die Hauptdiagonale auf die folgende bekommen „neue Matte“ (siehe unten)

newMainDiagList = [email protected][Subscript[new, ##] &, {1, 4}] 
ändern

Ich weiß, dass es einfach ist, die Hauptdiagonale mit ReplacePart auf einen bestimmten Wert zu ändern. Zum Beispiel:

ReplacePart[mat, {i_, i_} -> 0] 

Ich würde auch auf die Hauptdiagonale beschränkt werden (in der gleichen Art und Weise, dass Band ist nicht so mit SparseArray beschränkt) wie nicht

(Die Methode, die ich im Moment verwenden ist folgende!)

([email protected][Band[{1, 1}] -> newMainDiagList] + 
    ReplacePart[mat, {i_, i_} -> 0]) // MatrixForm 

(gewünschte Ausgabe ist 'neue Matte')

alt text

Antwort

10

Eigentlich müssen Sie Normal überhaupt nicht verwenden. A SparseArray plus eine "normale" Matrix gibt Ihnen eine "normale" Matrix. Mit Band ist, bei dem ersten Inspektion, der flexibelste Ansatz, sondern eine effektiven (und etwas weniger flexibel) Alternative ist:

DiagonalMatrix[newDiagList] + ReplacePart[mat, {i_,i_}->0] 

DiagonalMatrix auch einen zweiten Integer-Parameter akzeptiert, die Sie mit angeben können, welche diagonal dass newDiagList darstellen die Hauptdiagonale von 0 dargestellt


die eleganteste Alternative ist jedoch ReplacePart ein wenig effektiver zu nutzen: der Ersatz Rule kann ein RuleDelayed sein, zB

ReplacePart[mat, {i_,i_} :> newDiagList[[i]] ] 

, die Ihren Ersatz direkt ohne die Zwischenschritte macht.

bearbeiten: Band ‚s Verhalten, können wir auch hinzufügen Bedingungen das Muster über /; zu imitieren. Zum Beispiel

ReplacePart[mat, {i_,j_} /; j==i+1 :> newDiagList[[i]] 

ersetzt die diagonal unmittelbar über dem Haupt eine (Band[{1,2}]) und

ReplacePart[mat, {i_,i_} /; i>2 :> newDiagList[[i]] 

würden die beiden letzten Elemente der Hauptdiagonale in einer Matrix 4x4 (Band[{3,3}]) nur ersetzen. Aber es ist viel einfacher mit ReplacePart direkt.

+0

Danke! Ich habe viel von deiner Antwort gelernt. Ich mag besonders ReplacePart [mat, {i_, i_}:> newDiagList [[i]]]. Ich mag auch Ihre Methoden sehr, um das Verhalten von Band nachzuahmen, was ich äußerst nützlich finde (um es gelinde auszudrücken). Ich behaupte, ich hätte DiagonalMatrix entdecken sollen. – tomd

+0

Zum nicht verwandten Thema klingt Ihr Benutzername wie RickRoll'er. – Margus

+0

Leonid Shifrin verwendet MapTerad/ReplacePart wie folgt: MapThread [ReplacePart, {mat, newMainDiagList, Range [4]}]. (Siehe Mathematica Programming. Eine erweiterte Einführung, von LS unter www.mathprogramming-intro.org/read_online.html) – tomd

Verwandte Themen