whos A
Name Size Bytes Class Attributes
A 10000x10000 800000000 double
此矩阵使用 800 MB 内存。
将矩阵转换为稀疏存储。
S = sparse(A);
whos S
Name Size Bytes Class Attributes
S 10000x10000 240008 double sparse
采用稀疏形式时,同一矩阵只使用约 0.25 MB 内存。在这种情况下,您可以使用 speye
函数来避免满存储,该函数可以直接创建稀疏单位矩阵。
全零稀疏矩阵
All zero sparse: 10000x5000
指定大小的非零稀疏矩阵
j = [900 1000];
v = [10 100];
S = sparse(i,j,v,1500,1500)
S =
(900,900) 10
(1000,1000) 100
当指定的大小大于 max(i)
×max(j)
时,sparse
函数会使用额外的零值行和列填充输出。
size(S)
ans = 1×21500 1500
预分配稀疏矩阵中的存储空间
N = nnz(S)
N = 10
N_alloc = nzmax(S)
N_alloc = 100
spalloc
函数可以快速创建由全零元素构成的稀疏矩阵,同时还会在此矩阵中为非零数数值分配一定的存储空间。
将值累加到稀疏矩阵
j = [1 1 1 2 3 3 10 10]’;
v = [100 202 173 305 410 550 323 121]’;
并排显示下标和值。
[i,j,v]
ans = 8×36 1 100 6 1 202 6 1 173 5 2 305 10 3 410 10 3 550 9 10 323 9 10 121
使用 sparse
函数将具有相同下标的值累加。
S = sparse(i,j,v)
S =
(6,1) 475
(5,2) 305
(10,3) 960
(9,10) 444
输入参数
输入矩阵,指定为满矩阵或稀疏矩阵。如果 A
已为稀疏状态,则 sparse(A)
会返回 A
。
数据类型: double
| logical
复数支持: 是
i,j
- 下标对组(以单独参数指定)
标量 | 向量 | 矩阵
下标对组,指定为标量、向量或矩阵的单独参数。i
和 j
中的对应元素指定 S(i,j)
的下标对组,该对组决定 v
中的值在输出中的放置方式。i
和 j
必须具有相同的数据类型。如果 i
或 j
为向量或矩阵,则另一个输入可以是标量或者是具有相同元素数量的向量或矩阵。在这种情况下,sparse
会使用 i(:)
和 j(:)
作为下标。
如果 i
和 j
对 v
中的几个元素具有相同的值,则 sparse
会聚合 v
中具有重复索引的值。聚合行为取决于 v
中值的数据类型:
对于逻辑值,
sparse
应用any
函数。对于双精度值,
sparse
应用sum
函数。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
v
- 值
标量 | 向量 | 矩阵
值,指定为标量、向量或矩阵。如果 v
是向量或矩阵,则 i
或 j
的其中一个输入必须也是具有相同数量的元素的向量或矩阵。
v
中的任何零值元素都会被忽略,因为它们是 i
和 j
的对应下标。但是,如果您不指定输出的维度大小 m
和 n
,则 sparse
在忽略 v
中的任何零值元素之前,会先计算最大值 m = max(i)
和 n = max(j)
。
数据类型: double
| logical
复数支持: 是
m,n
- 每个维度的大小(作为单独参数)
整数值
每个维度的大小,指定为包含整数值的单独参数。如果指定 m
(行大小),则必须也指定 n
(列大小)。
如果不指定 m
和 n
,则 sparse
将使用默认值 m = max(i)
和 n = max(j)
。这些最大值在删除 v
中的任何零之前进行计算。
数据类型: double
nz
- 非零元素的存储空间分配
非负整数
非零元素的存储空间分配,指定为非负整数。nz
通常必须大于或等于 max([numel(i), numel(j), numel(v), 1])
。但是,如果 i
、j
和 v
的大小允许您为 nz
指定值 0
,则 sparse
会将该值设置为 1
。
对于稀疏矩阵 S
,nnz
函数返回矩阵中非零元素的数目,nzmax
函数返回为非零矩阵元素分配的空间量。如果 nnz(S)
和 nzmax(S)
返回不同的结果,则可能需要分配比实际需求更大的空间。鉴于此原因,请预先设置 nz
,再进行填充。
如果您不指定 nz
,则 sparse
使用默认值 max([numel(i), numel(j), numel(v), 1])
。
数据类型: double
局限性
如果
i,j
或m,n
输入中的任意值大于2^31-1
(32 位平台)或2^48-1
(64 位平台),则无法构造稀疏矩阵。
提示
MATLAB® 以压缩稀疏列格式存储稀疏矩阵。有关详细信息,请参阅 John R. Gilbert、Cleve Moler 和 Robert Schreiber 合著的 Sparse Matrices In MATLAB:Design and Implementation。
accumarray
函数具有与sparse
类似的累加行为。accumarray
使用 n 维下标将数据分组到 bin 中,而sparse
使用二维下标将数据分组到 bin 中。默认情况下,
accumarray
会将具有相同下标的元素添加到输出中,但您可以选择对 bin 应用任意函数。sparse
会在输出中对具有相同下标的元素应用sum
函数(对于双精度值)或any
函数(对于逻辑值)。
扩展功能
使用 Parallel Computing Toolbox™ 在群集的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
另请参阅
accumarray
| diag
| find
| full
| issparse
| nnz
| nonzeros
| nzmax
| spalloc
| speye
| spones
| sprandn
| sprandsym
| spy