Main Content

构造稀疏矩阵

创建稀疏矩阵

MATLAB® 从不会自动创建稀疏矩阵。相反,还必须确定矩阵中是否包含足够高百分比的零元素,以便利用稀疏方法。

矩阵的密度是指非零元素数目除以矩阵元素总数。对于矩阵 M,这将为

nnz(M) / prod(size(M));
nnz(M) / numel(M);

密度非常低的矩阵通常很适合使用稀疏格式。

将满矩阵转换为稀疏矩阵

可以使用带有单个参量的 sparse 函数将满矩阵转换为稀疏存储。

例如:

A = [ 0   0   0   5
      0   2   0   0
      1   3   0   0
      0   0   4   0];
S = sparse(A)
 S =
     
   (3,1)        1
   (2,2)        2
   (3,2)        3
   (4,3)        4
   (1,4)        5

列显输出中列出了 S 的非零元素及其行索引和列索引。这些元素按列排序,反映了内部数据结构体。

如果矩阵阶数不太高,可以使用 full 函数将稀疏矩阵转换为满存储。例如,A = full(S) 可反向转换该示例。

将满矩阵转换为稀疏存储并非生成稀疏矩阵的最常用方法。如果矩阵的阶数足够低可以进行满存储,则转换为稀疏存储很难显著节省内存。

直接创建稀疏矩阵

可以使用带有五个参量的 sparse 函数,基于一列非零元素来创建稀疏矩阵。

S = sparse(i,j,s,m,n)

ij 分别是矩阵中非零元素的行索引和列索引的向量。s 是由对应的 (i,j) 对指定索引的非零值的向量。m 是生成的矩阵的行维度,n 是其列维度。

前一示例中的矩阵 S 可以直接通过以下表达式生成

S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5],4,4)
S =

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

sparse 命令具有许多备用形式。上面示例使用的形式将矩阵中的最大非零元素数设置为 length(s)。如果需要,可以追加第六个参量用来指定更大的最大数,这样能在以后添加非零元素,而不必重新分配稀疏矩阵。

二阶差分算子的矩阵表示形式就是一个很好的稀疏矩阵示例。它是一个三对角矩阵,其中 -2s 在对角线上,1s 在上对角线和下对角线上。有多种方式生成此类炬阵,这里只是一种可能性。

n = 5;
D = sparse(1:n,1:n,-2*ones(1,n),n,n);
E = sparse(2:n,1:n-1,ones(1,n-1),n,n);
S = E+D+E'
S =

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

现在,F = full(S) 显示相应的满矩阵。

F = full(S)
F =

    -2     1     0     0     0
     1    -2     1     0     0
     0     1    -2     1     0
     0     0     1    -2     1
     0     0     0     1    -2

基于稀疏矩阵的对角线元素创建稀疏矩阵

基于稀疏矩阵的对角线元素创建稀疏矩阵是一种常用操作,因此函数 spdiags 可以处理此任务。其语法是

S = spdiags(B,d,m,n)

要创建大小为 m×n 且元素在 p 对角线上的输出矩阵 S

  • B 是大小为 min(m,n)×p 的矩阵。B 的列是用于填充 S 对角线的值。

  • d 是长度 p 的向量,其整数元素可以指定要填充的 S 对角线。

即,B 的列 j 中的元素填充 d 的元素 j 指定的对角线。

注意

如果 B 的列长度超过所替换的对角线,则上对角线从 B 列的下部获取,下对角线从 B 列的上部获取。

例如,考虑使用矩阵 B 和向量 d

B = [ 41    11     0
      52    22     0
      63    33    13
      74    44    24 ];

d = [-3
      0
      2];

使用这些矩阵创建 7×4 稀疏矩阵 A

A = spdiags(B,d,7,4)
A =

   (1,1)       11
   (4,1)       41
   (2,2)       22
   (5,2)       52
   (1,3)       13
   (3,3)       33
   (6,3)       63
   (2,4)       24
   (4,4)       44
   (7,4)       74

在其满矩阵形式中,A 类似于:

full(A)
ans =

    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

spdiags 还可以从稀疏矩阵中提取对角线元素,或将矩阵对角线元素替换为新值。键入 help spdiags 以了解详细信息。

导入稀疏矩阵

可以在 MATLAB 环境外部通过计算导入稀疏矩阵。结合使用 spconvert 函数与 load 命令导入包含索引和非零元素列表的文本文件。例如,考虑使用三列文本文件 T.dat,它的第一列是行索引列表,第二列是列索引列表,第三列是非零值列表。这些语句将 T.dat 加载到 MATLAB 中并将其转换为稀疏矩阵 S

load T.dat
S = spconvert(T)

saveload 命令还可以处理作为 MAT 文件中的二进制数据存储的稀疏矩阵。

另请参阅

|

相关主题