На самом деле вам вообще не нужно использовать 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
напрямую.