MATLAB稀疏矩陣

1.1.1矩陣存儲方式

MATLAB的矩陣有兩種存儲方式,完全存儲方式和稀疏存儲方式
1.完全存儲方式
將矩陣的全部元素按列存儲,矩陣中的全部零元素也存儲到矩陣中。
2.稀疏存儲方式
僅存儲矩陣所有的非零元素的值及其位置,即行號和列號,顯然這對於具有大量零元素的稀疏矩陣來說是十分有效的。

      1 0 0 0
A= 0 5 0 0
      2 0 0 7

是具有稀疏矩陣特徵的矩陣,其完全存儲方式是按列存儲的全部12個元素
1,0,2,0,5,0,0,0,0,0,0,7
其稀疏存儲方式如下:
(1,1),1,(3,1),2,(2,2),5,(3,4),7
括號內爲元素的行列位置,後面爲元素值。
當矩陣非常的“稀疏”時,會有效的節省存儲空間。

1.1.2稀疏存儲方式的產生

1.將完全存儲方式轉化爲稀疏存儲方式
A=sparse(S);將S矩陣轉換爲稀疏矩陣A;
sparse(m,n);產生m*n的所有元素都爲0的稀疏矩陣
sparse(u,v,S);S爲建立係數矩陣的非零元素,u(i),v(i)分別爲S(i)的行和列下標,S,u,v爲等長向量。
[u,v,S]=find(A);返回矩陣A中非零元素的下標和元素,返回值可以作爲sparse(u,v,S);的參數
full(A);返回和稀疏存儲方式A對應的完全存儲方式。
例如
X=[2,0,0,0,0;0,0,0,0,0;0,0,0,5,0;0,1,0,0,-1;0,0,0,0,-5]
A=sparse(X)
A=
     (1,1)    2
     (4,2)    1
     (3,4)    5
     (4,5)    -1
     (5,5)    -5
A就是X的稀疏存儲方式。

2.產生稀疏存儲矩陣
sparse可以講完全存儲方式轉換爲稀疏存儲方式,那麼,當使用稀疏矩陣時,要先產生完全存儲方式的矩陣,然後再轉換,這顯然是不可取的,MATLAB有自己產生稀疏矩陣的函數spconvert:
B=spconvert(A);A爲一個m*3或m*4的矩陣,A的每一列的意義分別爲:
(i,1)第i非零元素所在行
(i,2)第i非零元素所在列
(i,3)第i非零元素的實部
(i,4)第i非零元素的虛部


3.帶狀(對角)稀疏矩陣

函數 spdiags

格式 [B,d] = spdiags(A) %從矩陣A中提取所有非零對角元素,這些元素保存在矩陣B中,向量d表示非零元素的對角線位置。

B = spdiags(A,d)     %從A中提取由d指定的對角線元素,並存放在B中。

A = spdiags(B,d,A) %用B中的列替換A中由d指定的對角線元素,輸出稀疏矩陣。

A = spdiags(B,d,m,n) %產生一個m×n稀疏矩陣A,其元素是B中的列元素放

在由d指定的對角線位置上。

例1

>>A = [11   0    13    0

            0    22    0    24

            0    0     33    0

           41   0      0    44

           0    52    0     0

           0    0     63   0

            0   0      0    74];

>>[B,d] = spdiags(A)

B =

    41    11     0

    52    22    0

    63    33    13

    74    44    24

d =

    -3      %表示B的第1列元素在A中主對角線下方第3條對角線上

     0      %表示B的第2列在A的主對角線上

     2      %表示B的第3列在A的主對角線上方第2條對角線上

例1

>> B=[1 2 3 4

      5 6 7 8

      9 10 11 12

      13 14 15 16];

>> d=[-2 0 1 3];

>> A=spdiags(B,d,4,4);

>> full(A)

ans =

     2     7     0    16

     0     6    11     0

     1     0    10    15

     0     5     0    14


4.單位矩陣的稀疏矩陣

speye(m,n);產生m*n的稀疏存儲單位陣。

遍歷

>> A = [0 1 0; 2 0 0; 1 0 1]
A =
0 1 0
2 0 0
1 0 1
>> B = sparse(A)
B =
(2,1) 2
(3,1) 1
(1,2) 1
(3,3) 1
>> C = find(B)
C =
2
3
4
9
>>
for i = C
B(i)
end
ans =
(1,1) 2
(2,1) 1
(3,1) 1
(4,1) 1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章