gpt4 book ai didi

wolfram-mathematica - 用 Mathematica 改变矩阵的对角线

转载 作者:行者123 更新时间:2023-12-04 08:12:08 24 4
gpt4 key购买 nike

是否有一种优雅的方法可以将矩阵的对角线更改为新的值列表,
相当于带 SparseArray 的 Band?

假设我有以下矩阵(见下文)

(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

最佳答案

实际上,您不需要使用 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 要简单得多。直接地。

关于wolfram-mathematica - 用 Mathematica 改变矩阵的对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4154924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com