2010-11-11 39 views
6

Có cách nào thanh lịch để thay đổi đường chéo của ma trận thành danh sách giá trị mới, số tương đương với Băng với SparseArray không?Thay đổi đường chéo của ma trận bằng Mathematica

Nói rằng tôi có ma trận sau đây (xem dưới đây)

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

và tôi muốn thay đổi đường chéo chính như sau để có được "mat mới" (xem dưới đây)

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

Tôi biết rất dễ để thay đổi đường chéo chính thành một giá trị đã cho bằng cách sử dụng ReplacePart. Ví dụ:

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

Tôi cũng thích không được giới hạn trong đường chéo chính (trong cùng một cách mà ban nhạc không phải là quá hạn chế với SparseArray)

(Phương pháp tôi sử dụng vào lúc này là sau!)

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

(Output mong muốn là 'thảm mới')

alt text

Trả lời

10

Thực ra, bạn không cần phải sử dụng Normal bất cứ điều gì. A SparseArray cùng với ma trận "bình thường" cung cấp cho bạn ma trận "bình thường". Sử dụng Band là, về kiểm tra ban đầu, cách tiếp cận linh hoạt nhất, nhưng một cách hiệu quả (và hơi ít linh hoạt) thay thế là:

DiagonalMatrix[newDiagList] + ReplacePart[mat, {i_,i_}->0] 

DiagonalMatrix cũng chấp nhận một tham số số nguyên thứ hai cho phép bạn chỉ định đường chéo mà newDiagList đại diện với đường chéo chính thể hiện bằng 0.


việc thay thế thanh lịch nhất, tuy nhiên, là sử dụng ReplacePart hiệu quả hơn một chút: thay thế Rule có thể là một RuleDelayed, ví dụ:

ReplacePart[mat, {i_,i_} :> newDiagList[[i]] ] 

thay thế của bạn trực tiếp mà không có các bước trung gian.

Chỉnh sửa: để bắt chước hành vi của Band, chúng tôi cũng có thể thêm điều kiện vào mẫu qua /;. Ví dụ,

ReplacePart[mat, {i_,j_} /; j==i+1 :> newDiagList[[i]] 

thay thế đường chéo ngay trên một trong những chính (Band[{1,2}]), và

ReplacePart[mat, {i_,i_} /; i>2 :> newDiagList[[i]] 

sẽ chỉ thay thế hai yếu tố cuối cùng của đường chéo chính trong một ma trận 4x4 (Band[{3,3}]). Tuy nhiên, nó đơn giản hơn nhiều bằng cách sử dụng trực tiếp ReplacePart.

+0

Cảm ơn! Tôi đã học được rất nhiều từ câu trả lời của bạn. Tôi đặc biệt thích ReplacePart [mat, {i_, i_}:> newDiagList [[i]]]. Tôi cũng rất thích các phương pháp của bạn để bắt chước hành vi của Band, điều mà tôi thấy cực kỳ hữu ích (để nói ít nhất). Tôi cho là tôi nên phát hiện DiagonalMatrix. – tomd

+0

Về chủ đề không liên quan, tên người dùng của bạn có vẻ như RickRoll'er. – Margus

+0

Leonid Shifrin sử dụng MapTherad/ReplacePart, như sau: MapThread [ReplacePart, {mat, newMainDiagList, Range [4]}]. (Xem Lập trình Mathematica. Giới thiệu nâng cao, của LS tại www.mathprogramming-intro.org/read_online.html) – tomd

Các vấn đề liên quan