2017-01-30 184 views
0

我正在解決一個線性系統,其中的矩陣是塊三對角線。設B是99×99三對角矩陣,主對角線上有4個矩陣,兩個子對角線上有-1個矩陣,讓我成爲99乘99的單位矩陣。我想存儲99^2大小爲99^2的塊三對角矩陣A,其主對角線爲B,子對角線爲-I。什麼是最有效的方法來做到這一點?我想出了一種方法:如何在MATLAB中有效地存儲塊三對角矩陣?

t1=ones(99,1); 
t2=ones(98,1); 
B=4*diag(t1)-diag(t2,-1)-diag(t2,1); 
I=diag(t1); 
Bp=repmat({B}, 99, 1); 
M = blkdiag(Bp{:}); 
t3=ones(9702,1); 
I=zeros(9801)-diag(t3,-99)-diag(t3,99); 
A=M+I; 

我不確定這是否是最有效的方法來做到這一點。任何其他可能的方法呢?

+0

商店作爲一個稀疏矩陣https://uk.mathworks.com/help/ matlab/ref/sparse.html(如果你有足夠新的版本) – Richard

+1

@Richard「在R2006a之前推出」 - 沒有足夠的新版本的危險,我認爲。 – beaker

+0

@Richard稀疏矩陣在MATLAB大約版本7.0(2004年左右)中引入。這個舊版本的MATLAB不能在當前大多數操作系統上運行,因此可以肯定地說,任何當前的MATLAB用戶都將擁有7.0以上的版本。 – rayryeng

回答

4

這個怎麼樣使用spdiags

B_size = 99; 
A_size = B_size^2; 

v = ones(A_size,1); 
D = [v*-1, v*-1, v*4, v*-1, v*-1]; 
A = spdiags(D, [-B_size, -1, 0, 1, B_size], A_size, A_size); 

這裏的樣本輸出B_size = 4

D = 

    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 

列各代表我們稀疏矩陣對角線。 spdiags調用中的第二個參數[-B_size -1 0 1 B_size]告訴它將每列放在哪個對角線上(負數低於主對角線,上面是正數)。列向量中不需要的值(負對角線的底部值,正對角線的頂部值)將被忽略。

A是一個稀疏矩陣,所以我會告訴full(A),所以你可以看到它實際上是這樣的:

>> full(A) 
ans = 

    4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 
    -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 
    0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 
    0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 
    -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 
    0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 
    0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 
    0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 
    0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 
    0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 
    0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 
    0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 
    0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 
    0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 
    0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 
    0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 
+0

真的很喜歡這種方法。非常感謝! –