是否有一种优雅的方法可以将矩阵的对角线更改为新的值列表 相当于Band with 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
(期望输出为'新垫')
答案 0 :(得分:10)
实际上,您无需使用Normal
。 SparseArray
加上“普通”矩阵为您提供“正常”矩阵。在初步检查时,使用Band
是最灵活的方法,但有效(并且稍微不那么灵活)的替代方案是:
DiagonalMatrix[newDiagList] + ReplacePart[mat, {i_,i_}->0]
DiagonalMatrix
还接受第二个整数参数,该参数允许您指定newDiagList
表示的主对角线由0表示的对角线。
然而,最优雅的选择是更有效地使用ReplacePart
:替换Rule
可以是RuleDelayed
,例如。
ReplacePart[mat, {i_,i_} :> newDiagList[[i]] ]
直接替换,无需中间步骤。
修改:为了模仿Band
的行为,我们还可以通过/;
为模式添加条件。例如,
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
会更简单。