Изменение диагоналей матрицы с помощью Mathematica - PullRequest
6 голосов
/ 11 ноября 2010

Есть ли элегантный способ изменить диагонали матрицы на новый список значений, эквивалент Band с SparseArray?

Скажите, у меня есть следующая матрица (см. Ниже)

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

и я хотел бы изменить основную диагональ на следующую, чтобы получить «новый мат» (см. Ниже)

newMainDiagList = Flatten@Array[Subscript[new, ##] &, {1, 4}]

Я знаю, что с помощью ReplacePart легко изменить основную диагональ на заданное значение. Например:

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

Я также хотел бы не ограничиваться главной диагональю (точно так же, как Band не ограничен SparseArray)

(метод, который я сейчас использую, следующий!)

(Normal@SparseArray[Band[{1, 1}] -> newMainDiagList] + 
   ReplacePart[mat, {i_, i_} -> 0]) // MatrixForm

(желаемый результат - «новый коврик»)

alt text

1 Ответ

10 голосов
/ 11 ноября 2010

На самом деле вам вообще не нужно использовать Normal.SparseArray плюс «нормальная» матрица дает вам «нормальную» матрицу.Использование Band при первоначальной проверке является наиболее гибким подходом, но эффективная (и немного менее гибкая) альтернатива:

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

DiagonalMatrix также принимает второе целое числопараметр, который позволяет указать, какую диагональ newDiagList представляет с главной диагональю, представленной 0.


Однако наиболее элегантной альтернативой является использование ReplacePart немного более эффективно: заменаRule может быть RuleDelayed, например

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

, который выполняет замену напрямую без промежуточных шагов.

Редактировать : имитировать Band 's поведение, мы также можем добавить условия к шаблону через /;.Например,

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

заменяет диагональ непосредственно над основной (Band[{1,2}]), а

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

заменяет только последние два элемента главной диагонали в 4x4 матрица (Band[{3,3}]).Но гораздо проще использовать ReplacePart напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...