稀疏矩阵
1. 稀疏矩阵
零元素个数多于非零元素个数的矩阵
2. 矩阵的存储方式
a. 完全存储方式
将矩阵的全部元素按列存储
b. 稀疏存储方式
只存储矩阵非零元素的值及其位置,即行号和列号。
矩阵元素的存储顺序不改变,也是按列的顺序进行存储。
%区分稀疏矩阵和稀疏存储方式概念、
%当矩阵的规模很大时,采用稀疏存储方式可以大大节约存储空间。
c. 完全存储方式与稀疏存储方式间转化
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
%先用完全存储方式,再转换为稀疏存储方式
d. 直接建立稀疏存储矩阵
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],[3,2,1],[3,1,2])
A =
(2,1) 2
(2,2) 1
(1,3) 3
>> B=full(A)
B =
0 0 3
2 1 0
B=spconvert(A):将A描述的稀疏矩阵,转化为稀疏存储矩阵
A为一个m×3或m×4的矩阵,其每行表示一个非零元素,m是非零元素的个数。
A(i,1)表示第i个非零元素所在的行
A(i,2)表示第i个非零元素所在的列
A(i,3)表示第i个非零元素值的实部
A(i,4)表示第i个非零元素值的虚部
若矩阵的全部元素都是实数,则无须第四列。
%sparse(u,v,S)参数为向量,B=spconvert(A)参数为矩阵,注意区分
>> A=[2,2,1;2,1,-1;2,4,3]
A =
2 2 1
2 1 -1
2 4 3
>> B=spconvert(A)
B =
(2,1) -1
(2,2) 1
(2,4) 3
%每行元素代表:行数,列数,元素值
e. 单位矩阵的稀疏存储
speye(m,n):产生一个m×n的稀疏存储单位矩阵
>> speye(3)
ans =
(1,1) 1
(2,2) 1
(3,3) 1
e.g.求下列三对角线性方程组的解。
>> 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];
%d为非零对角线位置
%kf1为带状稀疏矩阵B的第-1条非零对角线
>> A=spdiags(B,d,5,5);
%产生稀疏存储矩阵A
>> f=[0;3;2;1;5];
%常数项矩阵为f
>> x=A\f
x =
-0.1667
0.1111
2.7222
-3.6111
8.6111
e.g.产生5阶稀疏存储单位矩阵A,至少三种方法。
>> A1=sparse([1,2,3,4,5],[1,2,3,4,5],[1,1,1,1,1])
A1 =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> A5=sparse(eye(5))
A5 =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
%最容易理解
>> A=[1,1,1;2,2,1;3,3,1;4,4,1;5,5,1];
>> A2=spconvert(A1)
A2 =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> A3=spdiags([1;1;1;1;1],[0],5,5)
A3 =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> A4=speye(5)
A4 =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
%最简单
3. 稀疏矩阵的两种基本类型
a. 无规则结构的稀疏矩阵
b. 有规则结构的稀疏矩阵
i. 带状稀疏矩阵
所有非零元素集中在对角线上的矩阵
**[B,d]=spdiags(A):**从带状稀疏矩阵A中提取全部非零对角线元素赋给矩阵B,非零对角线的位置向量d
**A=spdiags(B,d,m,n):**产生带状稀疏矩阵的稀疏存储矩阵A,其中m、n为原带状稀疏矩阵的行数和列数,矩阵B的第i列即为原带状稀疏矩阵的第i条非零对角线,向量d为原带状稀疏矩阵的所有非零对角线的位置。
%两个函数的参数不同,可以看作互逆,只是A=spdiags(B,d,m,n)产生的A是稀疏存储形式矩阵,[B,d]=spdiags(A)里的A是完全存储形式
>> A=[11 0 0 12 0 0; 0 21 0 0 22 0; 0 0 31 0 0 32; 41 0 0 42 0 0; 0 51 0 0 52 0];
>> [B,d]=spdiags(A)
%A为带状稀疏矩阵【A也可以是普通矩阵】
B =
0 11 12
0 21 22
0 31 32
41 42 0
51 52 0
d =
-3
0
3
>> C=spdiags(B,d,5,6)
C =
(1,1) 11
(4,1) 41
(2,2) 21
(5,2) 51
(3,3) 31
(1,4) 12
(4,4) 42
(2,5) 22
(5,5) 52
(3,6) 32