2010-11-11 148 views
6

是否有一种将矩阵的对角线更改为新的值列表的优雅方式, 等效于带SparseArray的Band?用Mathematica更改矩阵的对角线

说我有以下矩阵(见下文)

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

,我想给主对角线更改为以下获得“新的垫子”(见下文)

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

我知道使用ReplacePart将主对角线更改为给定值很容易。例如:

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

我也会喜欢不被限制在主对角线(以同样的方式,带不那么与SparseArray限制)

(我目前使用的方法是下面!)

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

(所需的输出是 '新垫')

alt text

回答

10

其实,你不需要使用Normal。 A 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要简单得多。

+0

谢谢!我从你的回复中学到了很多东西。我特别喜欢ReplacePart [mat,{i_,i_}:> newDiagList [[i]]]。我也非常喜欢你的方法来模仿乐队的行为,我发现它非常有用(至少可以说)。我假设我应该发现DiagonalMatrix。 – tomd 2010-11-11 20:38:21

+0

在不相关的主题上,您的用户名听起来像RickRoll'er。 – Margus 2010-11-13 23:39:35

+0

Leonid Shifrin使用MapTherad/ReplacePart,如下所示:MapThread [ReplacePart,{mat,newMainDiagList,Range [4]}]。 (请参阅www.mathprogramming-intro.org/read_online.html上的LS Mathematica编程。高级简介) – tomd 2010-12-03 17:58:46