📅  最后修改于: 2021-01-07 02:25:46             🧑  作者: Mango
声明一个普通数组后,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. |