构造稀疏矩阵
创建稀疏矩阵
MATLAB® 从不会自动创建稀疏矩阵。相反,还必须确定矩阵中是否包含足够高百分比的零元素,以便利用稀疏方法。
矩阵的密度是指非零元素数目除以矩阵元素总数。对于矩阵 M
,这将为
nnz(M) / prod(size(M));
nnz(M) / numel(M);
密度非常低的矩阵通常很适合使用稀疏格式。
将满矩阵转换为稀疏矩阵
可以使用带有单个参量的 sparse
函数将满矩阵转换为稀疏存储。
例如:
A = [ 0 0 0 5 0 2 0 0 1 3 0 0 0 0 4 0]; S = sparse(A)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
列显输出中列出了 S
的非零元素及其行索引和列索引。这些元素按列排序,反映了内部数据结构体。
如果矩阵阶数不太高,可以使用 full
函数将稀疏矩阵转换为满存储。例如,A = full(S)
可反向转换该示例。
将满矩阵转换为稀疏存储并非生成稀疏矩阵的最常用方法。如果矩阵的阶数足够低可以进行满存储,则转换为稀疏存储很难显著节省内存。
直接创建稀疏矩阵
可以使用带有五个参量的 sparse
函数,基于一列非零元素来创建稀疏矩阵。
S = sparse(i,j,s,m,n)
i
和 j
分别是矩阵中非零元素的行索引和列索引的向量。s
是由对应的 (i,j)
对指定索引的非零值的向量。m
是生成的矩阵的行维度,n
是其列维度。
前一示例中的矩阵 S
可以直接通过以下表达式生成
S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5],4,4)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
sparse
命令具有许多备用形式。上面示例使用的形式将矩阵中的最大非零元素数设置为 length(s)
。如果需要,可以追加第六个参量用来指定更大的最大数,这样能在以后添加非零元素,而不必重新分配稀疏矩阵。
二阶差分算子的矩阵表示形式就是一个很好的稀疏矩阵示例。它是一个三对角矩阵,其中 -2s 在对角线上,1s 在上对角线和下对角线上。有多种方式生成此类炬阵,这里只是一种可能性。
n = 5; D = sparse(1:n,1:n,-2*ones(1,n),n,n); E = sparse(2:n,1:n-1,ones(1,n-1),n,n); S = E+D+E'
S = (1,1) -2 (2,1) 1 (1,2) 1 (2,2) -2 (3,2) 1 (2,3) 1 (3,3) -2 (4,3) 1 (3,4) 1 (4,4) -2 (5,4) 1 (4,5) 1 (5,5) -2
现在,F = full(S)
显示相应的满矩阵。
F = full(S)
F = -2 1 0 0 0 1 -2 1 0 0 0 1 -2 1 0 0 0 1 -2 1 0 0 0 1 -2
基于稀疏矩阵的对角线元素创建稀疏矩阵
基于稀疏矩阵的对角线元素创建稀疏矩阵是一种常用操作,因此函数 spdiags
可以处理此任务。其语法是
S = spdiags(B,d,m,n)
要创建大小为 m×n 且元素在 p
对角线上的输出矩阵 S
:
B
是大小为min(m,n)
×p 的矩阵。B
的列是用于填充S
对角线的值。d
是长度p
的向量,其整数元素可以指定要填充的S
对角线。
即,B
的列 j
中的元素填充 d
的元素 j
指定的对角线。
注意
如果 B
的列长度超过所替换的对角线,则上对角线从 B
列的下部获取,下对角线从 B
列的上部获取。
例如,考虑使用矩阵 B
和向量 d
。
B = [ 41 11 0 52 22 0 63 33 13 74 44 24 ]; d = [-3 0 2];
使用这些矩阵创建 7×4 稀疏矩阵 A
:
A = spdiags(B,d,7,4)
A = (1,1) 11 (4,1) 41 (2,2) 22 (5,2) 52 (1,3) 13 (3,3) 33 (6,3) 63 (2,4) 24 (4,4) 44 (7,4) 74
在其满矩阵形式中,A
类似于:
full(A)
ans = 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 0 52 0 0 0 0 63 0 0 0 0 74
spdiags
还可以从稀疏矩阵中提取对角线元素,或将矩阵对角线元素替换为新值。键入 help
spdiags
以了解详细信息。
导入稀疏矩阵
可以在 MATLAB 环境外部通过计算导入稀疏矩阵。结合使用 spconvert
函数与 load
命令导入包含索引和非零元素列表的文本文件。例如,考虑使用三列文本文件 T.dat
,它的第一列是行索引列表,第二列是列索引列表,第三列是非零值列表。这些语句将 T.dat
加载到 MATLAB 中并将其转换为稀疏矩阵 S
:
load T.dat
S = spconvert(T)