22.1.2 创建稀疏矩阵

有几种方法可以创建稀疏矩阵。

从函数返回

有许多函数直接返回稀疏矩阵。其中包括 speyespranddiag 等。

从矩阵或向量构造

函数 sparse 允许从表示行、列和数据的三个向量构建稀疏矩阵。或者,函数 spconvert 使用三列矩阵格式,便于从其他地方导入数据。

创建后填充

函数 sparsespalloc 可用于创建一个空矩阵,然后由用户填充。

从用户二进制程序

用户可以直接在 oct 文件中创建稀疏矩阵。

有几个基本函数可以返回特定的稀疏矩阵。例如,稀疏单位矩阵是一种经常需要的矩阵。因此它有自己专门的创建函数:speye (n)speye (r, c),分别用于创建 n×nr×c 的稀疏单位矩阵。

另一种经常需要的典型稀疏矩阵是随机元素的随机分布。函数 sprandsprandn 分别对均匀和正态随机分布的元素执行此操作。它们具有完全相同的调用约定,其中 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 元素向量 [mn] 调用, 则返回一个稀疏 M×N 单位矩阵,具有 m 行和 n 列。

编程说明:此函数的实现比 sparse (eye (…)) 更高效,因为没有构造完整的矩阵。

另请参阅: sparse, spdiags, eye

 
r = spones (S)

S 的非零元素替换为 1。

这将创建一个与 S 具有相同结构的稀疏矩阵。

另请参阅: sparse, sprand, sprandn, sprandsym, spfun

 
s = sprand (r, c, d)
s = sprandn (r, c, d)

生成具有均匀分布或正态分布值的随机稀疏矩阵。

注意:函数 sprandsym 可用于生成随机对称稀疏矩阵。

另请参阅: sparse, spones, 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),其整体尺寸为 mn。如果 ijsv 是标量,则它们会被扩展为具有相同的大小。

如果没有指定 mn,则它们的值从向量 ij 中的最大索引推导得出,即 m = max (i), n = max (j)

注意: 如果在相同的 ij 索引处指定了多个值,则 S 中相应位置的值将是这些重复位置值的总和。另请参阅 accumarray,了解如何返回不同行为(例如取最小值)的示例。

如果指定了 "unique" 选项,并且在相同的 ij 索引处指定了多个值,则只使用最后指定的值。为了完整性,也可以指定 "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