MATLAB基础四——稀疏矩阵

时间:2024-04-03 14:53:12

MATLAB基础四——稀疏矩阵

1. 矩阵的存储方式

完全存储方式:将矩阵的全部元素按列存储。
稀疏存储方式:只存储矩阵的非零元素的值及其位置,即行号和列号。
注:采用稀疏存储方式时,矩阵元素的存储顺序并没有改变,也是按列的顺序进行存储。
MATLAB基础四——稀疏矩阵
当矩阵的规模很大时,采用稀疏存储方式可以大大节约存储空间。

2. 稀疏矩阵的存储方式的产生

(1)完全存储方式与稀疏存储方式之间的转化
A=sparse(S):将矩阵S转化为稀疏存储方式的矩阵A。
S=full(A):将矩阵A转化为完全存储方式的矩阵S。

>>A=sparse(eye(5))
A =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> B=full(A)
B =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
>> whos
Name Size Bytes Class Attributes
A 5x5 128 double sparse
B 5x5 200 double

(2)直接建立稀疏存储矩阵
sparse函数的其他调用格式:
sparse(m,n):生成一个m*n的所有元素都是零的稀疏矩阵。
sparse(u,v,S):其中u,v,S是3个等长的向量。S是要建立的稀疏存储矩阵的非零元素,u(i)、v(i)分别是S(i)的行和列下标。

>>A=sparse([1,2,2],[2,1,4],[4,5,-7])
A =
(2,1) 5
(1,2) 4
(2,4) -7
>> B=full(A)
B =
0 4 0 0
5 0 0 -7

使用spconvert函数直接建立稀疏存储矩阵,其调用格式为:B=spconvert(A)
其中,A为一个m*3或m*4的矩阵,其每行表示一个非零元素,
A(i,1)表示第i个非零元素所在的行。
A(i,2)表示第i个非零元素所在的列。
A(i,3)表示第i个非零元素所在的实部。
A(i,4)表示第i个非零元素所在的虚部。
若矩阵的全部元素都是实数,则无须第4列。

>>A=[1,2,2;2,1,4;4,5,-7]
A =
1 2 2
2 1 4
4 5 -7
>> B=spconvert(A)
B =
(2,1) 4
(1,2) 2
(4,5) -7
>> a=full(B)
a =
0 2 0 0 0
4 0 0 0 0
0 0 0 0 0
0 0 0 0 -7

(3)带状稀疏矩阵的稀疏存储
稀疏矩阵有两种基本类型:无规则结构和有规则结构的稀疏矩阵。
带状稀疏矩阵就是一种典型的具有规则结构的稀疏矩阵,它是指所有非零元素集中在对角线上的矩阵。
[B,D]=spdiags(A):从带状稀疏矩阵A中提取全部非零对角线元素及其这些非零对角线的位置向量d。
A=spdiags(B,d,m,n):产生带状稀疏矩阵的稀疏存储矩阵A,其中m、n为原带状稀疏矩阵的行数与列数,矩阵B的第i列即为原带状稀疏矩阵的第i条非零对角线,向量d为原带状稀疏矩阵所有非零对角线的位置。

>>A=[1,0,0,5,0,0;0,2,0,1,0,0;0,0,0,4,5,0;3,0,0,0,0,2]
A =
1 0 0 5 0 0
0 2 0 1 0 0
0 0 0 4 5 0
3 0 0 0 0 2
>> [B,d]=spdiags(A)
B =
0 1 0 0 5
0 2 0 1 0
0 0 4 5 0
3 0 0 2 0
d =
-3
0
1
2
3

利用带状稀疏矩阵非零对角线元素组成的矩阵B,以及对角线位置组成的向量d,命令执行后产生一个稀疏存储矩阵A。

>>C=spdiags(B,d,4,6)
C =
(1,1) 1
(4,1) 3
(2,2) 2
(1,4) 5
(2,4) 1
(3,4) 4
(3,5) 5
(4,6) 2

(4)单位矩阵的稀疏存储
speye(m,n)返回一个m*n的稀疏存储单位矩阵。

>> speye(4)
ans =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1

3. 稀疏矩阵应用举例

求下列三对角线性方程组的解。
MATLAB基础四——稀疏矩阵

>>kf1=[1;1;2;1;0];
>>k0=[2;4;6;6;1];
>>k1=[0;3;1;4;2];
>>B=[kf1,k0,k1];
>>d=[-1;0;1];
>>A=spdiags(B,d,5,5);
>>f=[0;3;2;1;5];
>>x=A\f
x =
-0.1667
0.1111
2.7222
-3.6111
8.6111

参考:中国大学MOOC《科学计算与MATLAB语言》