22.1.2创建稀疏矩阵

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

Returned from a function

有许多函数直接返回稀疏矩阵。其中包括speye, sprand, diag

广告
Constructed from matrices or vectors

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

广告
Created and then filled

函数稀疏的散裂可以用于创建一个emptymatrix,然后从用户填充

广告
From a user binary program

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

广告

有几个基本函数可以返回特定的稀疏性。例如稀疏单位矩阵,就是isoften所需要的矩阵。因此,它有自己的函数将其创建为speye (n)speye (r, c),这将创建nxnrxc稀疏恒等矩阵。

经常需要的另一个典型的稀疏矩阵是随机元素的随机分布。函数sprandsprandn元素均匀和正态随机分布的性能。他们有完全相同的呼叫约定sprand (r, c, d),创建rxc实元素密度为的稀疏矩阵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.

使用单个输入参数调用,非零对角线d属于A被提取。

对于两个自变量,要提取的对角线从向量给出d.

的其他两种形式spdiags通过替换对角线来修改输入矩阵。他们使用的列v用向量代替对角线d.如果稀疏矩阵A则该矩阵的对角线被替换。否则的amatrixmxn从的列给出的对角线创建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 (m, n)
: s = speye (m)
: s = speye ([m, n])

返回大小为的稀疏单位矩阵mxn.

支持效率明显高于sparse (eye (m)) 因为没有构造完整矩阵。

当使用单个参数调用时,大小为mxm创建。如果使用单个向量参数调用,则此参数将被视为要创建的矩阵的大小。

详见: sparse, spdiags, eye.

广告
 
: r = spones (S)

替换的非零项S有一个。

这将创建一个结构体与相同的稀疏矩阵S.

详见: sparse, sprand, sprandn, sprandsym, spfun, spy.

广告
 
: s = sprand (m, n, d)
: s = sprand (m, n, d, rc)
: s = sprand (s)

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

矩阵的大小为mxn具有值的密度d. d必须介于0和1之间。值将均匀分布在区间(0,1)上。

如果使用单个矩阵参数调用,则无论矩阵在何处,都会生成具有随机值的稀疏矩阵s为非零。

如果使用标量第四个参数调用rc,一个条件数为倒数的随机稀疏矩阵rc生成。如果rcisa向量,则它指定生成的矩阵的第一个奇异值(length (rc) <= min (m, n)).

详见: sprandn, sprandsym, rand.

广告
 
: s = sprandn (m, n, d)
: s = sprandn (m, n, d, rc)
: s = sprandn (s)

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

矩阵的大小为mxn具有值的密度d. d必须介于0和1之间。值将正态分布,amean为0,方差为1。

如果使用单个矩阵参数调用,则无论矩阵在何处,都会生成具有随机值的稀疏矩阵s为非零。

如果使用标量第四个参数调用rc,一个条件数为倒数的随机稀疏矩阵rc生成。如果rcisa向量,则它指定生成的矩阵的第一个奇异值(length (rc) <= min (m, n)).

详见: sprand, sprandsym, randn.

广告
 
: S = sprandsym (n, d)
: S = sprandsym (s)

生成对称随机稀疏矩阵。

矩阵的大小为nxn,值的密度从d. d必须介于0和1之间(包括0和1)。值将是正态分布,平均值为零,方差为1。

如果用单个矩阵参数调用,则在矩阵上生成随机稀疏矩阵s在其下三角部分为非零。

详见: sprand, sprandn, spones, sparse.

广告

建议用户创建稀疏矩阵的方法是创建两个包含数据的行和列索引的向量和一个包含要存储的数据的相同大小的第三向量。例如

  ri = ci = d = [];
  for j = 1:c
    ri = [ri; randperm(r,n)'];
    ci = [ci; j*ones(n,1)];
    d = [d; rand(n,1)];
  endfor
  s = sparse (ri, ci, d, r, c);

创建rxc具有随机分布的稀疏矩阵n(<r)每个列的元素。向量的元素不需要按照任何特定的顺序进行排序,因为Octave会在存储数据之前对它们进行排序。然而,对数据进行预排序将使稀疏矩阵的创建速度更快。

函数spconvert采用三列或四列实矩阵。前两列分别表示行索引和列索引,第三列和第四列表示稀疏矩阵的实部和虚部。矩阵可以包含零个元素,元素可以按任何顺序排列。添加零元素是定义稀疏矩阵大小的一种方便方法。例如:

s = spconvert ([1 2 3 4; 1 3 4 4; 1 2 3 0]')
⇒ Compressed Column Sparse (rows=4, cols=4, nnz=3)
      (1 , 1) -> 1
      (2 , 3) -> 2
      (3 , 4) -> 3

创建和填充矩阵的示例可能是

k = 5;
nz = r * k;
s = spalloc (r, c, nz)
for j = 1:c
  idx = randperm (r);
  s (:, j) = [zeros(r - k, 1); ...
        rand(k, 1)] (idx);
endfor

应该注意的是,从于八次赋值函数的编写方式,该赋值将在上述循环的每次迭代中重新赋值稀疏矩阵使用的内存。因此散裂函数忽略nz自变量,并且不会为矩阵预先赋值内存。因此,使用上述结构体的代码应尽可能向量化,以最大限度地减少赋值次数并减少内存赋值次数,这一点至关重要。

 
: FM = full (SM)

从稀疏矩阵、对角矩阵、置换矩阵或范围中返回完整存储矩阵。

详见: sparse, issparse.

广告
 
: s = spalloc (m, n, nz)

创建mxnatmost中具有预赋值空间的稀疏矩阵nz非零元素。

这对于通过一系列索引符号增量构建矩阵非常有用。之后的后续索引赋值spalloc将重新使用预先赋值的内存,前提是它们是简单的形式之一

满足以下条件:

数据的部分移动仍可能发生,但通常情况下,在这种情况下,赋值会更节省内存和时间。特别地,可以从相邻的列块有效地构建预先赋值的稀疏矩阵。

可以使用函数查询给定矩阵的预赋值内存量nzmax.

编程注意事项:Octave总是为至少一个值保留内存,即使nz为0。

详见: nzmax, sparse.

广告
 
: S = sparse (A)
: S = sparse (m, n)
: S = sparse (i, j, sv)
: S = sparse (i, j, sv, m, n)
: S = sparse (i, j, sv, m, n, "unique")
: S = sparse (i, j, sv, m, n, nzmax)

从满秩矩阵创建稀疏矩阵A或行、列、值三元组。

如果A是一个满秩矩阵,将其转换为稀疏矩阵表示,在此过程中删除所有零值。矩阵A应该是typelogic或double。

如果有两个输入m(行)和n(列),然后创建一个具有指定维度的空稀疏矩阵。

给定整数索引向量ij,和1-by-nnz实数或复数向量sv,构造稀疏矩阵S(i(k),j(k)) = sv(k)整体尺寸mn。如果有i, jsv对于标量,它们被扩展为具有共同的大小。

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

注意:如果用相同的值指定了多个值i,j索引,中的相应值S将是重复位置的值的总和。详见accumarray,例如如何返回不同的行为,例如采取最小值。

如果参数"unique"给定,并且指定了多个相同的值i, j索引,则只使用最后指定的值。为了完整性,参数"sum"可以给定,并且将被忽略,因为默认行为是对重复位置的值求和。

sparse (m, n)将创建一个空mxn稀疏矩阵和等价于sparse (m, n)

可选的最终参数为保留空间nzmax稀疏数组中的值,如果非零值的最终数量大于sv在数组的初始构建过程中使用。详见spalloc,了解更多信息和用法说明。

示例1(将满秩矩阵转换为稀疏矩阵以节省内存):

x = full (diag (1:1000));
sizeof (x)
⇒  8000000
s = sparse (x);
sizeof (xs)
⇒  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(“唯一”参数):

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列的实数矩阵,包含稀疏矩阵元素的w、column、实数和虚数部分。实数和虚量为零的元素可用于强制特定的矩阵大小。

详见: sparse.

广告

上述内存重新赋值的问题可以在实际文件中避免。然而,从oct文件构造稀疏矩阵比这里讨论的更复杂。详见外部代码接口,以获得有关技术的完整描述。


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

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