MATLAB®从来没有创建自动稀疏矩阵。相反,您必须确定一个矩阵是否包含足够大百分比的零,以便从稀疏技术中获益。
的密度矩阵的非零元素数除以矩阵元素总数。对矩阵米
,这将是
nnz (M) /刺激(大小(M));
nnz (M) /元素个数(M);
密度非常低的矩阵通常是使用稀疏格式的好候选者。
方法可以将完整矩阵转换为稀疏存储稀疏的
具有单个参数的函数。
例如:
A = [0 0 0 5 0 2 0 0 1 3 0 0 0 0 0 4 0];S =稀疏(A)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
的非零元素年代
,以及它们的行和列索引。元素按列排序,反映内部数据结构。
方法可以将稀疏矩阵转换为全存储完整的
函数,只要矩阵的阶数不是太大。例如,充满(S) =
反转示例转换。
将一个完整的矩阵转换为稀疏存储并不是生成稀疏矩阵的最常用方法。如果矩阵的阶数足够小,完全存储是可能的,那么转换为稀疏存储很少提供显著的节省。
方法可以从非零元素列表创建稀疏矩阵稀疏的
带有五个参数的函数。
S =稀疏(i, j S, m, n)
我
和j
分别是矩阵的非零元素的行指标和列指标的向量。年代
一个非零值的向量,其指标是由对应的(i, j)
对。米
得到的矩阵的行维是n
是列维。
矩阵年代
上面的例子可以直接生成
S = sparse([3 2 3 4 1],[1 2 2 3 4 4],[1 2 3 4 5],4,4)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
的稀疏的
Command有许多替代形式。上面的例子使用了一种形式,将矩阵中非零元素的最大数目设置为长度(年代)
.如果需要,您可以添加指定更大最大值的第六个参数,从而允许您稍后添加非零元素,而无需重新分配稀疏矩阵。
二阶差分算子的矩阵表示是稀疏矩阵的一个很好的例子。它是一个三对角矩阵,对角线上有-2s,上对角线和子对角线上有1。有很多方法可以产生它——这里有一种可能性。
n = 5;D =稀疏(1:n, 1: n, 2 * (1, n)、n, n);E =稀疏(2:n, 1: n - 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(4)1(4、5)1 (5,5)2
现在F =全(S)
显示相应的完整矩阵。
F =全(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 0 1 -2
基于它们的对角元素创建稀疏矩阵是一种常见的操作,因此函数spdiags
处理这个任务。它的语法是
S = spdiags (B, d, m, n)
创建输出矩阵年代
的大小米——- - - - - -n与元素p
对角线:
B
矩阵是有大小的吗分钟(m, n)
——- - - - - -p.的列B
填充对角线的值是多少年代
.
d
向量的长度是多少p
谁的整数元素指定对角线年代
填充。
也就是列中的元素j
的B
填充元素指定的对角线j
的d
.
请注意
如果一列B
比它要替换的对角线长吗,超对角线是从列的下部取的B
,子对角线从的柱的上部取B
.
以矩阵为例B
和向量d
.
B = [41 11 0 52 22 0 63 33 13 74 44 24];D = [-3 0 2];
使用这些矩阵来创建一个7 × 4稀疏矩阵一个
:
一个= spdiags (4) B, d, 7日
=(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
其完整的形式,一个
是这样的:
完整的(一个)
Ans = 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 52 0 0 0 0 63 0 0 0 0 0 74
spdiags
还可以从稀疏矩阵中提取对角元素,或用新值替换矩阵对角元素。类型帮助
spdiags
获取详细信息。
你可以从MATLAB环境之外的计算中导入稀疏矩阵。使用spconvert
函数与负载
用于导入包含索引和非零元素列表的文本文件的命令。例如,考虑一个三列文本文件T.dat
它的第一列是行索引的列表,第二列是列索引的列表,第三列是非零值的列表。这些语句加载T.dat
并把它转换成一个稀疏矩阵年代
:
负载T.datS = spconvert (T)