有几种方法可以创建稀疏矩阵。
有许多函数直接返回稀疏矩阵。其中包括speye, sprand, diag等
函数稀疏的允许从表示行、列和数据的三个向量构建稀疏矩阵。或者,函数spconvert使用三列矩阵格式,可以方便地从其他地方导入数据。
函数稀疏的或散裂可以用于创建一个emptymatrix,然后从用户填充
用户可以直接在oct文件中创建稀疏矩阵。
有几个基本函数可以返回特定的稀疏性。例如稀疏单位矩阵,就是isoften所需要的矩阵。因此,它有自己的函数将其创建为speye(n)
或speye(r, c)
,这将创建n通过n或r通过c稀疏恒等矩阵。
经常需要的另一个典型的稀疏矩阵是随机元素的随机分布。函数sprand和sprandn元素均匀和正态随机分布的性能。他们有完全相同的呼叫约定sprand(r, c,d)
,创建r通过c实元素密度为的稀疏矩阵d.
直接创建稀疏矩阵的其他感兴趣的函数是diag或其推广spdiags,可以定义矩阵的对角线,并创建与此相对应的稀疏矩阵。例如
s=diag(稀疏(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则该矩阵的对角线被替换。否则的amatrixm通过n从的列给出的对角线创建v.
的负值d表示主对角线下方的对角线,以及的正值d主对角线上方的对角线。
例如
spdiags(整形(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.
实施效率明显高于稀疏(eye(m))
因为没有构造完整矩阵。
当使用单个参数调用时,大小为m通过m创建。如果使用单个向量参数调用,则此参数将被视为要创建的矩阵的大小。
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向量,则它指定生成的矩阵的第一个奇异值(长rc)<=最小(m, n)
).
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向量,则它指定生成的矩阵的第一个奇异值(长rc)<=最小(m, n)
).
S =
sprandsym (n, d)
¶S =
sprandsym (s)
¶生成对称随机稀疏矩阵。
矩阵的大小为nxn,值的密度从d. d必须介于0和1之间(包括0和1)。值将是正态分布,平均值为零,方差为1。
如果用单个矩阵参数调用,则在矩阵上生成随机稀疏矩阵s在其下三角部分为非零。
建议用户创建稀疏矩阵的方法是创建两个包含数据的行和列索引的向量和一个包含要存储的数据的相同大小的第三向量。例如
ri=ci=d=[];对于j=1:c ri=[ri;randperm(r,n)'];ci=[ci;j*ones(n,1)];d=[d;兰特(n,1)];endfor s=稀疏(ri,ci,d,r,c);
创建r通过c具有随机分布的稀疏矩阵n(<r)每个列的元素。向量的元素不需要按照任何特定的顺序进行排序,因为Octave会在存储数据之前对它们进行排序。然而,对数据进行预排序将使稀疏矩阵的创建速度更快。
函数spconvert采用三列或四列实矩阵。前两列分别表示行索引和列索引,第三列和第四列表示稀疏矩阵的实部和虚部。矩阵可以包含零个元素,元素可以按任何顺序排列。添加零元素是定义稀疏矩阵大小的一种方便方法。例如:
s=spconvert([1 2 3 4;1 3 4 4;1 2 3 0]')⇒ 压缩列稀疏(行=4,列=4,nnz=3)(1,1)->1(2,3)->2(3,4)->3
创建和填充矩阵的示例可能是
k=5;nz=r*k;s=散裂c(r,c,nz),其中j=1:c idx=randperm(r);s(:,j)=[零(r-k,1);…rand(k,1,1)](idx);外循环
应该注意的是,从于八次赋值函数的编写方式,该赋值将在上述循环的每次迭代中重新赋值稀疏矩阵使用的内存。因此散裂函数忽略nz自变量,并且不会为矩阵预先赋值内存。因此,使用上述结构体的代码应尽可能向量化,以最大限度地减少赋值次数并减少内存赋值次数,这一点至关重要。
s =
spalloc (m, n, nz)
¶创建m通过natmost中具有预赋值空间的稀疏矩阵nz非零元素。
这对于通过一系列索引符号增量构建矩阵非常有用。之后的后续索引赋值散裂
将重新使用预先赋值的内存,前提是它们是简单的形式之一
s(I:J)=x
s(:,I:J)=x
s(K:L,I:J)=x
和满足以下条件:
nnz(S)
.
nnz(S)
不超过nz.
数据的部分移动仍可能发生,但通常情况下,在这种情况下,赋值会更节省内存和时间。特别地,可以从相邻的列块有效地构建预先赋值的稀疏矩阵。
可以使用函数查询给定矩阵的预赋值内存量nzmax
.
编程注意事项:Octave总是为至少一个值保留内存,即使nz为0。
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(列),然后创建一个具有指定维度的空稀疏矩阵。
给定整数索引向量我和j,和1-by-nnz
实数或复数向量sv,构造稀疏矩阵S我(k),j(k)) = sv(k)
整体尺寸m和n。如果有我, j或sv对于标量,它们被扩展为具有共同的大小。
如果m或n没有指定,则它们的值是从向量中的最大索引导出的我和j从给定m=最大值(我)
, n=最大值(j)
.
笔记:如果用相同的值指定了多个值我,j索引,中的相应值S将是重复位置的值的总和。详见accumdim
,例如如何返回不同的行为,例如采取最小值。
如果参数unique
给定,并且指定了多个相同的值我, j索引,则只使用最后指定的值。为了完整性,参数@sum
可以给定,并且将被忽略,因为默认行为是对重复位置的值求和。
稀疏的m, n)
将创建一个空mxn稀疏矩阵和等价于稀疏的m, n)
可选的最终参数为保留空间nzmax稀疏数组中的值,如果非零值的最终数量大于sv在数组的初始构建过程中使用。详见散裂
,了解更多信息和用法说明。
示例1(将全矩阵转换为稀疏矩阵以节省内存):
x=满(diag(1:1000));大小(x)⇒ 8000000s=稀疏(x);大小(xs)⇒ 24008
示例2(重复索引的总和):
我= [1 1 2]; j= [1 1 2]; sv= [3 4 5];稀疏的我, j, sv, 3, 4)⇒ 压缩列稀疏(行=3,列=4,nnz=2[17%])(1,1)->7(2,2)->5
示例3(“唯一”参数):
我= [1 1 2]; j= [1 1 2]; sv= [3 4 5];稀疏的我, j, sv,3,4,“唯一”)⇒ 压缩列稀疏(行=3,列=4,nnz=2[17%])(1,1)->4(2,2)->5
详见: 满的, accumaray, 散裂, spdiags, speye, 海绵, sprand, sprandn, sprandsym, spconvert, spfun.
x =
spconvert (m)
¶将其他程序容易生成的简单稀疏矩阵格式转换为Octave的内部稀疏格式。
输入m是一个3列或4列的实数矩阵,包含稀疏矩阵元素的w、column、实数和虚数部分。实数和虚量为零的元素可用于强制特定的矩阵大小。
详见: 稀疏的.
上述内存重新赋值的问题可以在实际文件中避免。然而,从oct文件构造稀疏矩阵比这里讨论的更复杂。详见外部代码接口,以获得有关技术的完整描述。
版权所有 © 2024 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号