22.1.3 查找稀疏矩阵信息

有多个函数可用于获取有关稀疏矩阵的信息。其中最基础的是 issparse,用来判断某个 Octave 对象是否为稀疏矩阵。

另一个基础函数是 nnz,返回稀疏矩阵中非零元素的个数; 函数 nzmax 返回该稀疏矩阵已分配的存储空间大小。 请注意,Octave 会优先释放稀疏对象中未使用的内存。 在某些用户创建的稀疏对象中,nzmax 的返回值可能与 nnz 不同,但在大多数情况下二者是一致的。 函数 spstats 返回稀疏矩阵各列的基本统计信息, 包括每列的非零元素数量、均值和方差。

 
tf = issparse (x)

x 为稀疏矩阵时返回 true。

参见: ismatrix

 
n = nnz (A)

返回矩阵 A 中的非零元素个数。

参见: nzmaxnonzerosfind

 
v = nonzeros (A)

返回矩阵 A 中所有非零元素组成的列向量。

参见: findnnz

 
n = nzmax (SM)

返回稀疏矩阵 SM 已分配的存储空间大小。

编程说明:Octave 会优先释放稀疏对象中未使用的存储。 因此,一般来说 nzmax 的返回值与 nnz 相同, 仅在部分用户手动创建的稀疏对象中可能不同。

另外请注意,Octave 始终为至少一个元素保留分配空间。 因此,对空矩阵而言 nnz 将报告 0,而 nzmax 报告 1。

参见: nnzspallocsparse

 
[count, mean, var] = spstats (S)
[count, mean, var] = spstats (S, j)

返回稀疏矩阵中非零元素的统计信息。

count 是每列的非零元素数量, mean 是每列非零元素的均值, var 是每列非零元素的方差。

若调用时提供两个输入参数:S 为数据矩阵,j 为各数据对应的分箱编号, 则对每个分箱分别计算统计信息。此时,分箱内可以包含值为零的数据点; 而只用一个输入参数调用 spstats (S) 时,零值会被忽略。

在用 Octave 求解涉及稀疏矩阵的线性方程组时,Octave 会根据矩阵的类型 选择合适的求解方法(参见 稀疏矩阵上的线性代数)。 Octave 会在除法运算符(/\)首次作用于某矩阵时探测其类型,并缓存结果。 若要在使用除法运算符之前主动确定稀疏矩阵的类型,可使用 matrix_type 函数,例如:

a = tril (sprandn (1024, 1024, 0.02), -1) ...
    + speye (1024);
matrix_type (a);
ans = Lower

可见 Octave 已正确识别出此矩阵为下三角矩阵。 matrix_type 还可显式强制指定矩阵类型。例如:

a = matrix_type (tril (sprandn (1024, ...
   1024, 0.02), -1) + speye (1024), "Lower");

这一方式可以避免每次进行矩阵类型探测的开销。 但请注意,若指定错误的矩阵类型,求解结果将不正确, 因此正确识别矩阵类型的责任完全由用户自己承担。

有多种图形化手段可以展示稀疏矩阵的信息。最基本的是 spy 命令, 用于可视化非零元素的整体分布。关于 spy 的用法示例, 参见 图 22.1。 更丰富的图形化信息可通过 treeplotetreeplotgplot 命令获得。

spmatrix

图 22.1:简单稀疏矩阵的非零元素分布。

稀疏矩阵的一个常见应用场景是图论, 将节点之间的连接关系表示为邻接矩阵: 若图中第 i 个节点与第 j 个节点相连, 则邻接矩阵的第 i,j 个元素(无向图中对称的第 j,i 个元素) 为非零。若为每个节点指定一组坐标位置,即可用 gplot 命令 将节点之间的连接关系以图形方式展示出来。

gplot 最简单的使用示例如下:

A = sparse ([2,6,1,3,2,4,3,5,4,6,1,5],
    [1,1,2,2,3,3,4,4,5,5,6,6],1,6,6);
xy = [0,4,8,6,4,2;5,0,5,7,5,7]';
gplot (A,xy)

上述代码建立了邻接矩阵 A,表示各节点之间的连接: 节点 1 连接至节点 2 和 6,节点 2 连接至节点 1 和 3,依此类推。 节点的坐标位置保存在 n×2 矩阵 xy 中。参见 图 22.2

gplot

图 22.2:gplot 命令的简单使用示例。

进行 Cholesky 分解时,各节点间的依赖关系可在一次线性扫描中 (无需实际执行 Cholesky 分解)通过 etree 命令计算得出。 etree 返回矩阵的消去树,可用下面对阵 A 的命令 对消去树进行图形化绘制: 当 A 不对称时,使用 treeplot (etree (A+A')); 当 A 对称时,使用 treeplot (etree (A))

 
spy (x)
spy (…, markersize)
spy (…, line_spec)

绘制稀疏矩阵 x 的非零元素分布图(sparsity pattern)。

若给出可选数值参数 markersize,则用其指定图中标记点的大小。

若给出可选字符串参数 line_spec,则将其传递给 plot, 以控制图的外观样式。

参见: plotgplot

 
p = etree (S)
p = etree (S, typ)
[p, q] = etree (S, typ)

返回矩阵 S 的消去树(elimination tree)。

默认情况下,S 被视为对称矩阵,函数返回对称消去树。 参数 typ 决定返回对称消去树还是列消去树;有效值为 "sym"(对称)或 "col"(列)。

调用时若传入第二个参数,etree 还会额外返回该树的后序遍历排列。

 
etreeplot (A)
etreeplot (A, node_style, edge_style)

绘制矩阵 A 的消去树。若 A 不对称,则绘制矩阵 A+A' 的消去树;若 A 对称,则直接绘制 A 的消去树。

可选参数 node_styleedge_style 分别指定节点与连线的输出样式。

参见: treeplotgplot

 
gplot (A, xy)
gplot (A, xy, line_style)
[x, y] = gplot (A, xy)

从图论意义上绘制由 Axy 定义的图形。

A 是该图形的邻接矩阵,xy 是一个 n×2 矩阵, 保存图中各节点的坐标。

可选参数 line_style 用于指定输出图形的线型。 不带输出参数调用时,直接弹出图形窗口显示该图形; 带输出参数调用时,返回计算所得图形的坐标到 xy

参见: treeplotetreeplotspy

 
treeplot (tree)
treeplot (tree, node_style, edge_style)

绘制树或森林的图形结构。

第一个参数 tree 是一个各元素为父节点索引的行向量。

可选参数 node_styleedge_style 分别指定节点与连线的输出样式。

该算法的时间复杂度和空间复杂度均为 O(n)。

参见: etreeplotgplot

 
[x, y] = treelayout (tree)
[x, y] = treelayout (tree, permutation)
[x, y, h, s] = treelayout (…)

计算树或森林中各节点的位置坐标,供绘图使用。

第一个参数 tree 是一个各元素为对应节点前驱节点的向量。

第二个可选参数 permutation 是一个后序遍历(postorder)排列。

该算法的时间及空间复杂度均为 O(n)。

参见: etreeplotgplottreeplot


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2