有几种方法可以创建稀疏矩阵。
有许多函数直接返回稀疏矩阵。其中包括 speye、sprand、diag 等。
函数 sparse 允许从表示行、列和数据的三个向量构建稀疏矩阵。或者,函数 spconvert 使用三列矩阵格式,便于从其他地方导入数据。
函数 sparse 或 spalloc 可用于创建一个空矩阵,然后由用户填充。
用户可以直接在 oct 文件中创建稀疏矩阵。
有几个基本函数可以返回特定的稀疏矩阵。例如,稀疏单位矩阵是一种经常需要的矩阵。因此它有自己专门的创建函数:speye (n) 或 speye (r, c),分别用于创建 n×n 或 r×c 的稀疏单位矩阵。
另一种经常需要的典型稀疏矩阵是随机元素的随机分布。函数 sprand 和 sprandn 分别对均匀和正态随机分布的元素执行此操作。它们具有完全相同的调用约定,其中 sprand (r, c,
d) 创建一个 r×c 的稀疏矩阵,其填充元素的密度为 d。
其他直接创建稀疏矩阵的有用函数是 diag 或其推广 spdiags,它们可以接受矩阵对角线的定义并创建与之对应的稀疏矩阵。例如,
s = diag (sparse (randn (1,n)), -1);
创建一个定义了单个对角线的 (n+1)×(n+1) 稀疏矩阵。
B = spdiags (A) ¶[B, d] = spdiags (A) ¶B = spdiags (A, d) ¶A = spdiags (v, d, A) ¶A = spdiags (v, d, m, n) ¶函数 diag 的推广。
使用单个输入参数调用时,提取 A 的非零对角线 d。
使用两个参数调用时,要提取的对角线由向量 d 给出。
spdiags 的另外两种形式通过替换对角线来修改输入矩阵。它们使用 v 的列来替换由向量 d 表示的对角线。如果定义了稀疏矩阵 A,则替换该矩阵的对角线。否则,创建一个 m×n 的矩阵,其对角线由 v 的列给出。
d 的负值表示主对角线以下的对角线,d 的正值表示主对角线以上的对角线。
例如:
spdiags (reshape (1:12, 4, 3), [-1 0 1], 5, 4)
⇒ 5 10 0 0
1 6 11 0
0 2 7 12
0 0 3 8
0 0 0 4
另请参阅: diag。
s = speye () ¶s = speye (n) ¶s = speye (m, n) ¶s = speye ([m, n]) ¶返回大小为 m×n 的稀疏单位矩阵。
如果不带参数调用,则返回稀疏标量值 1。
如果使用单个标量参数 n 调用,则返回一个 N×N 的稀疏方阵单位矩阵。
如果使用两个标量参数(m, n)或一个 2 元素向量
[m, n] 调用,
则返回一个稀疏 M×N 单位矩阵,具有 m 行和 n 列。
编程说明:此函数的实现比 sparse (eye (…)) 更高效,因为没有构造完整的矩阵。
r = spones (S) ¶将 S 的非零元素替换为 1。
这将创建一个与 S 具有相同结构的稀疏矩阵。
s = sprand (r, c, d) ¶s = sprandn (r, c, d) ¶生成具有均匀分布或正态分布值的随机稀疏矩阵。
注意:函数 sprandsym 可用于生成随机对称稀疏矩阵。
s = spalloc (m, n, nz) ¶创建一个 m×n 的稀疏矩阵,预分配至少 nz 个非零元素的空间。
之后可以通过索引赋值来填充该矩阵。在创建稀疏矩阵之前已知非零元素数量的情况下,预分配空间可以显著提高效率。
另请参阅: sparse, spdiags, speye, spones, sprand, sprandn, sprandsym, spfun。
S = sparse (A) ¶S = sparse (i, j, sv) ¶S = sparse (i, j, sv, m, n) ¶S = sparse (i, j, sv, m, n, nzmax) ¶S = sparse (i, j, sv, m, n, nzmax, "unique") ¶S = sparse (m, n) ¶从完整矩阵或向量的集合中创建稀疏矩阵 S。
如果给出了完整矩阵 A,则返回一个稀疏矩阵 S,它包含 A 的相同非零元素。如果 A 已经是稀疏的,则直接返回 A。
sparse (i, j, sv) 定义了 S(i(k), j(k)) = sv(k),其整体尺寸为 m 和 n。如果 i、j 或 sv 是标量,则它们会被扩展为具有相同的大小。
如果没有指定 m 或 n,则它们的值从向量 i 和 j 中的最大索引推导得出,即 m = max (i), n = max (j)。
注意: 如果在相同的 i、j 索引处指定了多个值,则 S 中相应位置的值将是这些重复位置值的总和。另请参阅 accumarray,了解如何返回不同行为(例如取最小值)的示例。
如果指定了 "unique" 选项,并且在相同的 i、j 索引处指定了多个值,则只使用最后指定的值。为了完整性,也可以指定 "sum" 选项,但该选项会被忽略,因为默认行为就是对重复位置的值求和。
sparse (m, n) 将创建一个空的 m×n 稀疏矩阵,等价于 sparse ([], [], [], m, n)。
可选的最后一个参数为稀疏数组中的 nzmax 个值预留空间。如果在数组的初始构建过程中使用的 sv 值数量小于最终的非零值数量,则此参数非常有用。有关更多信息和使用说明,请参阅 spalloc。
示例 1(将完整矩阵转换为稀疏矩阵以节省内存):
x = full (diag (1:1000)); sizeof (x) ⇒ 8000000 s = sparse (x); sizeof (s) ⇒ 24008
示例 2(重复索引处求和):
i = [1 1 2]; j = [1 1 2]; sv = [3 4 5];
sparse (i, j, sv, 3, 4)
⇒
Compressed Column Sparse (rows = 3, cols = 4, nnz = 2 [17%])
(1, 1) -> 7
(2, 2) -> 5
示例 3("unique" 选项):
i = [1 1 2]; j = [1 1 2]; sv = [3 4 5];
sparse (i, j, sv, 3, 4, "unique")
⇒
Compressed Column Sparse (rows = 3, cols = 4, nnz = 2 [17%])
(1, 1) -> 4
(2, 2) -> 5
另请参阅: full, accumarray, spalloc, spdiags, speye, spones, sprand, sprandn, sprandsym, spconvert, spfun。
x = spconvert (m) ¶将其他程序容易生成的简单稀疏矩阵格式转换为 Octave 的内部稀疏格式。
输入 m 是一个 3 列或 4 列的实数矩阵,包含稀疏矩阵元素的行、列、实部和虚部。实部和虚部为零的元素可用于强制指定特定的矩阵大小。
另请参阅: sparse。
上述内存重新分配的问题可以在 oct 文件中避免。然而,从 oct 文件构造稀疏矩阵比这里讨论的更复杂。有关所涉及技术的完整描述,请参阅 外部代码接口。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4