构造稀疏矩阵 您所在的位置:网站首页 matlab取矩阵长度 构造稀疏矩阵

构造稀疏矩阵

2023-05-17 22:14| 来源: 网络整理| 查看: 265

构造稀疏矩阵创建稀疏矩阵

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)

save 和 load 命令还可以处理作为 MAT 文件中的二进制数据存储的稀疏矩阵。

另请参阅

sparse | spconvert

相关主题稀疏矩阵运算


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有