用Mathematica更改矩阵的对角线
问题描述:
是否有一种将矩阵的对角线更改为新的值列表的优雅方式, 等效于带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
(所需的输出是 '新垫')
答
其实,你不需要使用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
要简单得多。
谢谢!我从你的回复中学到了很多东西。我特别喜欢ReplacePart [mat,{i_,i_}:> newDiagList [[i]]]。我也非常喜欢你的方法来模仿乐队的行为,我发现它非常有用(至少可以说)。我假设我应该发现DiagonalMatrix。 – tomd 2010-11-11 20:38:21
在不相关的主题上,您的用户名听起来像RickRoll'er。 – Margus 2010-11-13 23:39:35
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