matlab——sparse函數和full函數(稀疏矩陣和非稀疏矩陣轉換)


 

 

函數功能:生成稀疏矩陣 

使用方法
S = sparse(A) 
將矩陣A轉化為稀疏矩陣形式,即矩陣A中任何0元素被去除,非零元素及其下標組成矩陣S。
如果A本身是稀疏的,sparse(S)返回S。 
S = sparse(i,j,s,m,n,nzmax) 
由向量i,j,s生成一個m*n的含有nzmax個非零元素的稀疏矩陣S,並且有 S(i(k),j(k)) = s(k)。
向量 i,j 和 s 有相同的長度。對應對向量i和j的值,s 中任何零元素將被忽略。
s 中在 i 和 j 處的重復值將被疊加。 
注意:如果i或j任意一個大於最大整數值范圍,2^31-1, 稀疏矩陣不能被創建。 

S = sparse(i,j,s,m,n) 
用 nzmax = length(s) 
S = sparse(i,j,s) 
使m = max(i) 和 n = max(j),在s中零元素被移除前計算最大值,[i j s]中其中一行可能為[m n 0]。
S = sparse(m,n) 
sparse([],[],[],m,n,0)的縮寫,生成一個m*n的所有元素都是0的稀疏矩陣。 


備注:
MATLAB中所有內置的算術,邏輯和索引操作都可以應用到稀疏矩陣或混合於稀疏和全矩陣上。
稀疏矩陣的操作返回稀疏矩陣,全矩陣的操作返回權矩陣。 
在大多數情況下,稀疏和全矩陣的混合操作返回全矩陣,例外的一種情況是混合操作的結果在結構上稀疏,例如,A.*S至少和矩陣S一樣稀疏。 

應用舉例:
S = sparse(1:n,1:n,1) 生成一個n*n的單位稀疏矩陣,和S = sparse(eye(n,n))有相同的結果,但是如果它的元素大部分是零元素的情況下也會暫時性的生成n*n的全矩陣。

B = sparse(10000,10000,pi) 可能不是非常有用的,但是它是能運行和允許的,它生成一個10000*10000的僅僅包含一個非零原色的矩陣,不要用full(B),因為這需要800兆儲存單元。 

分析和重組一個稀疏矩陣: 
[i,j,s] = find(S); 
[m,n] = size(S); 
S = sparse(i,j,s,m,n); 

如果最后一行和最后一列是非零項,有下面: 
[i,j,s] = find(S); 
S = sparse(i,j,s);

 

MATLAB中的full matrix和sparse matrix

對full matrix和sparse matrix的理解:其實這只是matlab中存儲稀疏矩陣的兩種方法。

 

MATLAB函數sparse簡介
函數功能:
這個函數與稀疏矩陣有關。
先說MATLAB中兩個概念:full storage organization(對應於full matrix)和sparse storage organization(對應於sparse matrix)。
而要說明這兩個概念,需要介紹稀疏矩陣的概念。
一般意義上的稀疏矩陣,就是看起來很松散的,也就是說,在這個矩陣中,絕大多數元素是零。例如:
0, 0, 0, 0;
0, 0, 1, 0;
0, 0, 0, 0;
0, 1, 0, 2;


計算機存儲稀疏矩陣可以有兩種思路:
1.按照存儲一個普通矩陣一樣存儲一個稀疏矩陣,比如上面這個稀疏矩陣中總共十六個元素(三個非零元素),把這些元素全部放入存儲空間中。這種存儲方式,在matlab就叫做full storage organization。
2.只存儲非零元素,那么怎么存儲呢?
(4,2)        1
(2,3)        1
(4,4)        2
看出來了吧, 只存儲非零元素在稀疏矩陣中的位置和值。比如,上面所舉的這個例子,值為2的項在第4行第4列,那么我們就只需要存儲這一非零項在稀疏矩陣中的“坐標”(4,4)和這一非零項的值2。在MATLAB中,這種存儲方式就叫做sparse storage organization。雖然,這樣要多存儲一組坐標,但如果稀疏矩陣中非零元素非常少,以這種存儲方式存儲稀疏矩陣反而節省了內存空間。


為什么matlab中會同時存在這兩種存儲方式呢?
第一種方式, 更加直觀,進行矩陣運算時(比如稀疏矩陣的乘法),算法簡單易實現。
而第二種方式,雖然有時可以節省存儲數據時占用的存儲空間,但進行運算時需要專門的算法實現(使用C語言編寫過稀疏矩陣乘法的同學應該能體會到)。


sparse
函數的功能就是把以第一種存儲形式存儲的稀疏矩陣轉換成第二種形式存儲(其實這個函數更重要的功能是構建稀疏矩陣,這里不再討論)。對應的函數為full,即把以第二種方式存儲的稀疏矩陣轉換成第一種方式存儲。
在MATLAB中,存儲一個稀疏矩陣有兩種方法。
語法格式:
S = sparse(A)
S = sparse(i,j,s,m,n,nzmax)
S = sparse(i,j,s,m,n)
S = sparse(i,j,s)
S = sparse(m,n)
各種語法格式詳見MATLAB幫助文檔。
相關函數:full、issparse


程序示例
>> A = [0, 0, 0, 0;
0, 0, 1, 0;
0, 0, 0, 0;
0, 1, 0, 2];
>> sparse(A)
ans =
   (4,2)        1
   (2,3)        1
   (4,4)        2

當然sparse函數還可以通過一定規則構造稀疏矩陣,這里就不多說了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM