【Matlab学习2.5】稀疏矩阵

矩阵的存储方式

完全存储方式:将矩阵的全部元素按列存储。

稀疏存储方式:只存储矩阵的非零元素的值及其位置,即行号和列号。

注意,采用稀疏存储方式时,矩阵元素的存储顺序并没有改变,也是按列的顺序进行存储。

$ A = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 5 & 0 & 0 \\ 2 & 0 & 0 & 7  \\ \end{bmatrix} $

A 矩阵的稀疏存储方式:

(1,1),1
(3,1),2
(2,2),5
(3,4),7

当矩阵的规模很大时,采用稀疏存储方式可以大大节约存储空间。

稀疏存储方式的产生

完全存储方式与稀疏存储方式之间的转化

A=sparse(S):将矩阵 S 转化为稀疏存储方式的矩阵 A。

S=full(A):将矩阵 A 转化为完全存储方式的矩阵 S。

例2.5.1:

>> A = sparse(eye(5))
>> B = full(A)
>> whos

例2.5.1

直接建立稀疏存储矩阵

sparse 函数的其他调用格式:

sparse(m,n):生成一个 m×n 的所有元素都是零的稀疏矩阵。

sparse(u,v,S):其中 u、v、S 是3个等长的向量。S 是要建立的稀疏存储矩阵的非零元素,u(i)、v(i) 分别是 S(i) 的行和列下标。

例2.5.2:

>> 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 的矩阵,其每行表示一个非零元素,m 是非零元素的个数 。
A(i,1) 表示第 i 个非零元素所在的行;
A(i,2) 表示第 i 个非零元素所在的列;
A(i,3) 表示第 i 个非零元素值的实部;
A(i,4) 表示第 i 个非零元素值的虚部。
若矩阵的全部元素都是实数,则无须第4列。

例2.5.2:

>> 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
>> C = [1,2,2,0; 2,1,4,4; 4,5,-7,-3]
C =
     1     2     2     0
     2     1     4     4
     4     5    -7    -3
>> D = spconvert(C)
D =
   (2,1)      4.0000 + 4.0000i
   (1,2)      2.0000 + 0.0000i
   (4,5)     -7.0000 - 3.0000i

带状稀疏矩阵的稀疏存储

稀疏矩阵有两种基本类型:无规则结构的稀疏矩阵与有规则结构的稀疏矩阵。

带状稀疏矩阵就是一种十分典型的具有规则结构的稀疏矩阵,它是指所有非零元素集中在对角线上的矩阵。

[ B,d ] = spdiags (A):从带状稀疏矩阵 A 中提取全部非零对角线元素赋给矩阵 B 及其这些非零对角线的位置向量 d。

A = spdiags(B,d,m,n):产生带状稀疏矩阵的稀疏存储矩阵 A, 其中 m 、n 为原带状稀疏矩阵的行数与列数,矩阵 B 的第 i 列即为原带状稀疏矩阵的第 i 条非零对角线, 向量 d 为原带状稀疏矩阵所有非零对角线的位置。

例2.5.3:

>> 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]
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)
B =
     0    11    12
     0    21    22
     0    31    32
    41    42     0
    51    52     0
d =
    -3
     0
     3
%利用带状稀疏矩阵非零对角线元素组成的矩阵 B,以及对角线位置组成的向量 d,命令执行后产生一个稀疏存储矩阵 A。
>> A = spdiags(B,d,5,6)
A =
   (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

总结:

用 spdiags 函数产生带状稀疏矩阵的稀疏存储 A: A = spdiags(B,d,m,n)
其中,m、n 为原带状矩阵的行数与列数。B 为 r×p 矩阵,这里 r = min(m,n),p 为原带状矩阵所有非零对角线的条数,矩阵 B 的第 i 列即为原带状矩阵的第 i 条非零对角线。
取值方法是:若非零对角线上元素个数等于 r,则取全部元素;若非零对角线上元素个数小于 r,则应该用零补足到 r 个元素。
补零的原则是:若 m<n(行数<列数), 则 d<0 时(主对角线以下)在后面补 0,d>0 (主对角线以上)时在后面补 0 ;当 m≥n(行数≥列数),则 d<0 时在后面补 0;d>0 时在前面补 0。 

单位矩阵的稀疏存储

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

例2.5.4:

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

 

例2.5.5 稀疏矩阵的应用实例:

求下列三对角线性方程组的解。

$$\left[\begin{array}{ccccc}2 & 3 & & & \\1 & 4 & 1 & & \\& 1 & 6 & 4 & \\& & 2 & 6 & 2 \\& & & 1 & 1\end{array}\right]\left[\begin{array}{c}x_{1} \\x_{2} \\x_{3} \\x_{4} \\x_{5}\end{array}\right]=\left[\begin{array}{c}0 \\3 \\2 \\1 \\5\end{array}\right]$$

>> 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

例2.5.5

注意:当参与运算的数据对象不全是稀疏存储矩阵时,所得结果是完全存储形式。

 

思考:

1.稀疏矩阵与稀疏存储矩阵有何区别?

2.产生5阶稀疏存储单位矩阵A,使用至少3种方法。

答案:

1.稀疏矩阵是0元素个数多于非0元素个数的矩阵,稀疏矩阵可以采用稀疏存储方式,也可以采用完全存储方式;
稀疏存储矩阵是按照系数存储方式存储的矩阵,稀疏存储矩阵既可以是稀疏矩阵,也可以是稠密矩阵。

2.

%完全存储方式与稀疏存储方式之间的转化,使用 sparse 函数和 eye 函数
>> A = sparse(eye(5))
A =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1

%直接建立稀疏存储矩阵,使用 sparse 函数
>> A = sparse ([1,2,3,4,5],[1,2,3,4,5],[1,1,1,1,1]) 
A =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1

%直接建立稀疏存储矩阵,使用 spconvert 函数
>> A = [1,1,1; 2,2,1; 3,3,1; 4,4,1; 5,5,1];
>> spconvert(A)
ans =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1

%单位矩阵的稀疏存储,使用 speye 函数
>> A = speye (5,5) 
A =
   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1

 

友链:朋友的博客,第二章总结「matlab学习笔记」MATLAB矩阵处理

posted @ 2023-02-03 20:57  SplendidCrepuscule  阅读(233)  评论(0编辑  收藏  举报