定义: 含有大量0元素的矩阵
不是稀疏矩阵,则称满矩阵。full matrix
matlab对稀疏矩阵有专门的的运算命令,为了节省存储空间和运算时间。
- 怎么节省存储空间?
一个 m × n m\times n m×n的满矩阵,元素的数据类型是double,则总共需要 m × n × 8 m\times n\times 8 m×n×8个Bytes。
如果它满足稀疏特性,即大量元素为0,则可以存储为稀疏矩阵,只需要存储所有非零元素的值和位置(行号,列号),一般行号列号均占8个字节,所以每个非零元素需要用24个字节,那么如果有M个非零元素,则需要的存储空间是 24 × M 24\times M 24×M个Bytes。
非零元素越少,需要的内存越少。
a=eye(1000); % 单位阵
b=speye(1000); % 或sparse(a)
whos
b多了8个字节,我不知道是存了什么
Name Size Bytes Class Attributes
a 1000x1000 8000000 double
b 1000x1000 24008 double sparse
- 怎么节省运算时间?
计算时也只对非零元素操作,
s=sparse([1,2,3,4,5],[5,4,3,2,1],[12 23 34 45 53],6,7) % 6行7列的稀疏矩阵
a=full(s)
b=[1 0 0;3 0 4;0 0 3;0 5 0]
c=sparse(b)
d=rand(10,6)>0.96; % 稀疏矩阵,这时是完全存储
d=sparse(d) % 存储为稀疏矩阵
whos d
注意稀疏矩阵的存储仍然是按完全存储的列存储的顺序来的,即第一列存完再存第2列····输出顺序和存储顺序一样
完全存储是把矩阵(不管几维)存成一条向量
s =
(5,1) 53
(4,2) 45
(3,3) 34
(2,4) 23
(1,5) 12
a =
0 0 0 0 12 0 0
0 0 0 23 0 0 0
0 0 34 0 0 0 0
0 45 0 0 0 0 0
53 0 0 0 0 0 0
0 0 0 0 0 0 0
b =
1 0 0
3 0 4
0 0 3
0 5 0
c =
(1,1) 1
(2,1) 3
(4,2) 5
(2,3) 4
(3,3) 3
d =
10×6 稀疏 logical 数组
(10,1) 1
(2,2) 1
Name Size Bytes Class Attributes
d 10x6 74 logical sparse
查看稀疏矩阵中非零元素的信息:
d=rand(10,6)>0.94; % 稀疏矩阵,这时是完全存储
d=sparse(d) % 存储为稀疏矩阵
n1=nnz(d) % number of non-zero elements
n2=nonzeros(d) %查看非零元素的值
n3=nzmax(d) %
spy(d) % 图形化显示非零元素的分布
n4=n1/prod(size(d)) % 查看稀疏程度(非零元素密度),prod(size(d))是矩阵总的元素数目
d =
10×6 稀疏 logical 数组
(4,1) 1
(6,4) 1
(8,5) 1
n1 =
3
n2 =
3×1 logical 数组
1
1
1
n3 =
3
n4 =
0.0500
>>