2010-11-11 149 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