有多个函数可用于获取有关稀疏矩阵的信息。其中最基础的是
issparse,用来判断某个 Octave 对象是否为稀疏矩阵。
另一个基础函数是 nnz,返回稀疏矩阵中非零元素的个数;
函数 nzmax 返回该稀疏矩阵已分配的存储空间大小。
请注意,Octave 会优先释放稀疏对象中未使用的内存。
在某些用户创建的稀疏对象中,nzmax 的返回值可能与
nnz 不同,但在大多数情况下二者是一致的。
函数 spstats 返回稀疏矩阵各列的基本统计信息,
包括每列的非零元素数量、均值和方差。
n = nzmax (SM) ¶返回稀疏矩阵 SM 已分配的存储空间大小。
编程说明:Octave 会优先释放稀疏对象中未使用的存储。
因此,一般来说 nzmax 的返回值与 nnz 相同,
仅在部分用户手动创建的稀疏对象中可能不同。
另外请注意,Octave 始终为至少一个元素保留分配空间。
因此,对空矩阵而言 nnz 将报告 0,而 nzmax 报告 1。
[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。
更丰富的图形化信息可通过 treeplot、etreeplot 和
gplot 命令获得。
图 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。
图 22.2:gplot 命令的简单使用示例。
进行 Cholesky 分解时,各节点间的依赖关系可在一次线性扫描中
(无需实际执行 Cholesky 分解)通过 etree 命令计算得出。
etree 返回矩阵的消去树,可用下面对阵 A 的命令
对消去树进行图形化绘制:
当 A 不对称时,使用 treeplot (etree (A+A'));
当 A 对称时,使用 treeplot (etree (A))。
(x) ¶(…, markersize) ¶(…, line_spec) ¶绘制稀疏矩阵 x 的非零元素分布图(sparsity pattern)。
若给出可选数值参数 markersize,则用其指定图中标记点的大小。
若给出可选字符串参数 line_spec,则将其传递给 plot,
以控制图的外观样式。
p = etree (S) ¶p = etree (S, typ) ¶[p, q] = etree (S, typ) ¶返回矩阵 S 的消去树(elimination tree)。
默认情况下,S 被视为对称矩阵,函数返回对称消去树。
参数 typ 决定返回对称消去树还是列消去树;有效值为
"sym"(对称)或 "col"(列)。
调用时若传入第二个参数,etree 还会额外返回该树的后序遍历排列。
(A) ¶(A, node_style, edge_style) ¶绘制矩阵 A 的消去树。若 A 不对称,则绘制矩阵
A+A' 的消去树;若 A 对称,则直接绘制 A 的消去树。
可选参数 node_style 与 edge_style 分别指定节点与连线的输出样式。
(A, xy) ¶(A, xy, line_style) ¶[x, y] = gplot (A, xy) ¶从图论意义上绘制由 A 和 xy 定义的图形。
A 是该图形的邻接矩阵,xy 是一个 n×2 矩阵, 保存图中各节点的坐标。
可选参数 line_style 用于指定输出图形的线型。 不带输出参数调用时,直接弹出图形窗口显示该图形; 带输出参数调用时,返回计算所得图形的坐标到 x 和 y。
(tree) ¶(tree, node_style, edge_style) ¶绘制树或森林的图形结构。
第一个参数 tree 是一个各元素为父节点索引的行向量。
可选参数 node_style 和 edge_style 分别指定节点与连线的输出样式。
该算法的时间复杂度和空间复杂度均为 O(n)。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2