用Mathematica改变矩阵的对角线

时间:2010-11-11 13:33:29

标签: wolfram-mathematica

是否有一种优雅的方法可以将矩阵的对角线更改为新的值列表 相当于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

(期望输出为'新垫')

alt text

1 个答案:

答案 0 :(得分:10)

实际上,您无需使用NormalSparseArray加上“普通”矩阵为您提供“正常”矩阵。在初步检查时,使用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会更简单。