📜  MATLAB中的稀疏数组

📅  最后修改于: 2021-01-07 02:25:46             🧑  作者: Mango

MATLAB中的稀疏数组

声明一个普通数组后,MATLAB将为该数组中的每个元素创建一个内存位置。例如,函数a =眼睛(10)将创建100个元素,这些元素排列为10 x 10结构。在此数组中,其中90个元素为零!

此矩阵需要100个元素,但其中只有10个包含非零数据。这是稀疏数组稀疏矩阵的示例。

稀疏矩阵是其中大多数元素为零的大型矩阵。

现在假设我们创建另一个10 x 10矩阵b,定义如下:

如果将这两个矩阵相乘,则结果为

稀疏属性

MATLAB具有double数据类型的特定版本,该版本旨在与稀疏数组一起使用。

在double数据类型的此特定版本中,仅为数组的非零元素分配了内存位置,并且称该数组具有“稀疏”属性。

具有稀疏属性的数组为每个非零元素保存三个值:元素本身的值以及元素所在的行号和列号。即使每个非零元素必须保存三个值,但如果矩阵只有几个非零元素,则此方法比分配完整数组要有效得多的内存效率。

为了说明稀疏矩阵的用法,我们将创建一个10 x 10的恒等矩阵:

如果使用函数sparse将此矩阵转换为稀疏矩阵,则结果为

如果我们检查数组a作为卫生组织命令,结果是

» whos 
Name            Size         Bytes     Class      Attributes 
   a                10x10         800    double 
  as               10x10         164    double       sparse

一个数组占用800个字节,因为有100个元素,每个元素有8个字节的存储空间。 as数组占用164个字节,因为有10个非零元素,每个元素有8个字节的存储空间,再加上20个数组索引,每个数组索引分别占4个字节和4个字节的开销。请注意,稀疏阵列比完整阵列占用的内存少得多。

函数issparse可用于确定给定数组是否稀疏。如果数组稀疏,则issparse(数组)返回true(1)。

稀疏数据类型的功效可以通过考虑每行平均有4个非零元素的1000 x 1000矩阵z来看出。如果此矩阵存储为完整矩阵,则将需要8,000,000字节的空间。另一方面,如果将其转换为稀疏矩阵,则内存使用量将急剧下降。

» zs = sparse(z); 
» whos 
Name         Size         Bytes         Class 
z              1000x1000      8000000      double array 
zs             1000x1000        51188         sparse array 
Grand total is 1003932 elements using 8051188 bytes.

生成稀疏矩阵

MATLAB可以通过使用稀疏函数将完整矩阵转换为稀疏矩阵或通过使用MATLAB函数speye,sprand和sprandn直接制作稀疏矩阵来生成稀疏矩阵,speye,sprand和sprandn是eye,rand和randn的稀疏等效项。

 For example, the expression a = speye(4) generates a 4 x 4 sparse matrix.
» a = speye(4) 
a = 
      (1, 1)     1 
      (2, 2)         1 
      (3, 3)         1 
      (4, 4)         1

表达式b = full(a)将稀疏矩阵转换为full矩阵。

» b = full (a) 
   b = 
            1   0    0   0 
           0    1   0    0 
           0    0   1   0
           0    0   0   1

使用稀疏矩阵

一旦使矩阵变得稀疏,就可以使用简单的赋值语句将单个元素添加到其中或从中删除。

例如,以下语句生成一个4 x 4稀疏矩阵,然后向其添加另一个非零元素:

» a = speye (4) 
        a = 
           (1, 1)    1
           (2, 2)     1 
           (3, 3)     1 
           (4, 4)      1
» a (2,1) = -2 
        a = 
           (1, 1)    1 
           (2, 1)   -2 
           (2, 2)    1
           (3, 3)    1
           (4, 4)    1

稀疏矩阵函数

该表显示在处理稀疏矩阵时最常用的一些功能。

Function Description
full It converts a sparse matrix to a full matrix.
issparse It determines if a matrix is sparse.
nnz It return the number of nonzero matrix elements.
nonzeros It returns the nonzero elements of a matrix.
nzmax It returns the amount of storage allocated for nonzero elements.
spalloc It allocate space for a sparse matrix.
sparse It create a sparse matrix or converts full to sparse.
speye It creates a sparse identity matrix.
sprand It creates a sparse uniformly distributed random matrix.
sprandn It creates a sparse normally distributed random matrix.
find It finds indices and values of nonzero elements in a matrix.
spones It replaces nonzero sparse matrix elements with ones.
spfun It apply function to nonzero matrix elements
spy It visualizes sparsity pattern as a plot.