本文概述
声明普通数组后, MATLAB将为数组中的每个元素创建一个内存位置。例如, 函数a =眼睛(10)将创建100个元素, 这些元素排列为10 x 10结构。在此数组中, 其中90个元素为零!
该矩阵需要100个元素, 但是只有10个元素包含非零数据。这是稀疏数组或稀疏矩阵的示例。
稀疏矩阵是其中大部分元素为零的大型矩阵。
现在假设我们创建另一个10 x 10矩阵b, 定义如下:
如果将这两个矩阵相乘, 则结果为
稀疏属性
MATLAB具有double数据类型的特定版本, 该版本旨在与稀疏数组一起使用。
在double数据类型的此特定版本中, 仅为数组的非零元素分配了内存位置, 并且据说该数组具有”稀疏”属性。
具有稀疏属性的数组将为每个非零元素保存三个值:元素本身的值以及元素所在的行号和列号。即使每个非零元素必须保存三个值, 但是如果矩阵只有几个非零元素, 则此方法比分配完整数组要有效得多。
为了说明稀疏矩阵的用法, 我们将创建一个10 x 10的单位矩阵:
如果使用函数sparse将此矩阵转换为稀疏矩阵, 则结果为
如果我们像whos命令一样检查数组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 | 它将稀疏矩阵转换为完整矩阵。 |
issparse | 它确定矩阵是否稀疏。 |
nnz | 它返回非零矩阵元素的数量。 |
nonzeros | 它返回矩阵的非零元素。 |
nzmax | 它返回分配给非零元素的存储量。 |
spalloc | 它为稀疏矩阵分配空间。 |
sparse | 它创建一个稀疏矩阵或将完整的转换为稀疏。 |
speye | 它创建一个稀疏身份矩阵。 |
sprand | 它创建一个稀疏均匀分布的随机矩阵。 |
sprandn | 它创建一个稀疏的正态分布随机矩阵。 |
find | 它查找矩阵中非零元素的索引和值。 |
spones | 它将非零稀疏矩阵元素替换为1。 |
spfun | 它将函数应用于非零矩阵元素 |
spy | 它将稀疏模式可视化为情节。 |
评论前必须登录!
注册