22.2稀疏矩阵上的线性代数

Octave包括一个稀疏矩阵的多态解算器,其中用于分解矩阵的精确解算器取决于稀疏矩阵本身的性质。通常,相对于矩阵本身的因子分解成本,确定矩阵类型的成本很小,但在任何情况下,矩阵类型在计算后都会被缓存,因此每次在线性方程中使用时都不会重新确定。

如何求解线性方程的选择树是

  1. 如果矩阵是对角的,直接求解并转到8
  2. 如果矩阵是一个排列对角线,则直接考虑排列进行求解。转到8
  3. 如果矩阵是正方形的,带状的,并且带状密度小于spparms ("bandden")继续,否则转到4。
    1. 如果矩阵是三对角的,并且右侧不是稀疏连续的,则转到3b。
      1. 如果矩阵是埃尔米特矩阵,具有正实对角线,则尝试使用Cholesky因子分解LAPACK xPTSV。
      2. 如果上述失败或矩阵不是具有正实对角线的埃尔米特矩阵,则使用带枢轴的高斯消去法LAPACK xGTSV和goto 8。
    2. 如果矩阵是具有正实对角线的埃尔米特矩阵,则尝试使用LAPACK xBTRF。
    3. 如果以上失败或矩阵不是具有正实对角线的埃尔米特矩阵,则使用带枢轴的高斯消去法LAPACK xGBTRF和goto 8。
  4. 如果矩阵是上三角或下三角,则执行稀疏前向或后向替换,并且goto 8
  5. 如果矩阵是具有列排列的上三角矩阵或具有行排列的下三角矩阵,则执行稀疏前向或后向替换,并且goto 8
  6. 如果矩阵是正方形的,则具有实正对角线的埃尔米特矩阵,尝试稀疏Cholesky因子分解使用CHOLMOD.
  7. 如果稀疏Cholesky因子分解失败,或者矩阵不是具有实正对角线的Hermitian矩阵,并且矩阵是平方的,则使用UMFPACK.
  8. 如果矩阵不是正方形的,或者之前的任何解算器都标记了奇异或接近奇异矩阵,则使用CXsparse10.

频带密度定义为频带中非零值的数量除以整个频带中值的总数。可以使用完全禁用带域矩阵解算器spparms设置bandden至1(即。,spparms ("bandden", 1)).

QR解算器使用Dulmage Mendelsohn分解将问题分解为多个块,这些块可以作为过度确定的块、多个确定良好的块和一个最终确定的块来处理。对于具有强连通节点块的矩阵,这是一个巨大的胜利,因为LU分解可以用于许多块。它还显著提高了为过度确定的问题找到解决方案的机会,而不仅仅是返回向量NaNs

上面的所有解算器都可以计算条件数的估计值。这可以用于检测解中的数值稳定性问题,并强制使用最小范数解。然而,对于窄带、三角形或对角矩阵,计算条件数的成本是巨大的,事实上可能超过分解矩阵的成本。因此,在这些情况下不计算条件数,Octave依赖于简单的技术来检测奇异矩阵或底层矩阵LAPACK 带状矩阵情况下的代码。

用户可以使用强制矩阵的类型matrix_type作用这克服了查找矩阵类型的成本。然而,需要注意的是,错误地识别矩阵类型会导致不可预测的结果,因此matrix_type应小心使用。

 
:nest= normest (A)
:nest= normest (A,tol)
:[nest,iter] = normest (…)

矩阵的2-范数的估计A使用幂级数分析。

这通常用于大型矩阵,其中计算成本norm (A)是禁止的,并且2-范数的近似是可接受的。

tol是计算2-范数的误差范围。默认情况下tol是1e-6。

可选输出iter返回所需的迭代次数normest以收敛。

详见: normest1,norm,cond,condest.

广告
 
:nest= normest1 (A)
:nest= normest1 (A,t)
:nest= normest1 (A,t,x0)
:nest= normest1 (Afcn,t,x0,p1,p2, …)
:[nest,v] = normest1 (A, …)
:[nest,v,w] = normest1 (A, …)
:[nest,v,w,iter] = normest1 (A, …)

估计矩阵的1-范数A使用块算法。

normest1对于只需要估计范数的大型稀疏矩阵是最好的。对于中小型矩阵,考虑使用norm (A, 1)此外normest1可以用于估计线性算子的1-范数A当矩阵向量乘积A * xA' * x可以计算。在这种情况下,而不是矩阵A,一个函数Afcn (flag, x)使用;它必须返回:

一个典型的案例是A从定义b ^ m,其中有结果A * x可以计算,甚至不需要明确的形式b ^ m通过

y = x;
for i = 1:m
  y = b * y;
endfor

参数p1,p2,…是的参数Afcn (flag, x, p1, p2, …).

t的默认值是2。该算法需要具有大小的矩阵矩阵乘积nxnnxt.

初始矩阵x0应该具有单位1-范数的列。默认初始矩阵x0具有第一列ones (n, 1) / n并且,如果t>1、具有随机元素的剩余列-1 / n,-1 / n,除以n.

在输出时,nest是期望的估计,vw是这样的向量w = A * v具有norm (w, 1)=c * norm (v, 1). iter包含在iter(1)迭代次数(最大值ishardcoded为5)和iter(2)产品总数A * xA' * x从算法执行。

算法注释:normest1在评估过程中使用随机数。因此,如果需要一致的结果"state"的应在调用前修复normest1.

参考文献:N.J.Higham和F.Tisseur,A block algorithm for matrix 1-norm estimation, with and application to 1-norm pseudospectra,SIAM J.矩阵分析。Appl。,第1185-1201页,第21卷,第4期,2000年。

详见: normest,norm,cond,condest.

广告
 
:cest= condest (A)
:cest= condest (A,t)
:cest= condest (A,Ainvfcn)
:cest= condest (A,Ainvfcn,t)
:cest= condest (A,Ainvfcn,t,p1,p2, …)
:cest= condest (Afcn,Ainvfcn)
:cest= condest (Afcn,Ainvfcn,t)
:cest= condest (Afcn,Ainvfcn,t,p1,p2, …)
:[cest,v] = condest (…)

平方矩阵的1-范数条件数的估计A使用t测试向量和随机1-范数估计器。

可选输入t指定测试向量的数量(默认为5)。

输入可以是矩阵A(该算法特别适用于大型稀疏矩阵)。或者,矩阵的行为可以从函数隐式定义。当使用隐含定义时,condest需要以下函数:

任何参数p1,p2,…是的附加参数Afcn (flag, x, p1, p2, …)Ainvfcn (flag, x, p1, p2, …).

主要输出是1-范数条件数估计cest.

可选的第二个输出v是近似零向量;它满足方程norm (A*v, 1) == norm (A, 1) * norm (v, 1) / cest.

算法注释:condest使用随机化算法来近似1-范数。因此,如果需要一致的结果"state"的应在调用之前修复condest.

参考文献:

详见: cond,rcond,norm,normest1,normest.

广告
 
:spparms ()
:vals= spparms ()
:[keys,vals] = spparms ()
:val= spparms (key)
:spparms (vals)
:spparms ("default")
:spparms ("tight")
:spparms (key,val)

查询或设置稀疏解算器和因子分解函数使用的参数。

上面的前四个调用获取有关当前设置的信息,而其他调用则更改当前设置。参数存储为成对的键和值,其中值都是浮点值,键是以下字符串之一:

spumoni

打印解算器的调试信息级别(默认为0)

广告
ths_rel

包括兼容性。未使用。(默认值1)

广告
ths_abs

包括兼容性。未使用。(默认值1)

广告
exact_d

包括兼容性。未使用。(默认为0)

广告
supernd

包括兼容性。未使用。(默认值3)

广告
rreduce

包括兼容性。未使用。(默认值3)

广告
wh_frac

包括兼容性。未使用。(默认0.5)

广告
autommd

符号LU/QR以及“\”和“/”运算符是否将自动使用稀疏性保留mmd函数(默认值1)

广告
autoamd

符号LU以及“\”和“/”运算符是否将自动使用保留稀疏性的amd函数(默认值1)

广告
piv_tol

的枢轴误差范围UMFPACK解算器(默认值为0.1)

广告
sym_tol

的枢轴误差范围UMFPACK对称解算器(默认值0.001)

广告
bandden

带状矩阵中非零元素在被处理之前的密度LAPACK 带状解算器(默认值为0.5)

广告
umfpack

符号是否UMFPACK或mmd解算器用于LU、“\”和“/”操作(默认值1)

广告

可以使用设置单个关键点的值spparms (key, val)。默认值可以使用特殊关键字恢复"default".特殊关键字"tight"可用于设置mmd解算器,以尝试以较长运行时间为潜在代价的稀疏解算。

详见: chol,colamd,lu,qr,symamd.

广告
 
:p= sprank (S)

计算稀疏矩阵的结构体秩S.

注意,在这里的计算中,只有矩阵的结构体是基于Dulmage-Mentelsohn排列来块三角形的S以为界sprank (S) >= rank (S)。忽略浮点错误sprank (S) >= rank (S).

详见: dmperm.

广告
 
:[count,h,parent,post,R] = symbfact (S)
:[…] = symbfact (S,typ)
:[…] = symbfact (S,typ,mode)

对稀疏矩阵执行符号分解分析S.

输入变量为

S

S是实数或复数稀疏矩阵。

广告
typ

是因子分解的类型,可以是

"sym" (default)

因式分解S.假设S是对称的并且使用矩阵的上三角部分。

"col"

因式分解S' * S.

"row"

因式分解S * S'.

"lo"

因式分解S'.假设S是对称的,并使用矩阵的下三角部分。

广告
mode

mode是未指定的,返回的Cholesky因子分解R如果mode"lower""L"然后返回共轭转置R'这是一个较低的三角因子。共轭转置版本更快,使用更少的内存,但仍然为所有其他输出返回相同的值:count,h,parentpost.

广告

返回变量为:

count

Cholesky因子分解的行数从typ.使用执行真因子分解的计算难度cholsum (count .^ 2).

广告
h

消除树的高度。

广告
parent

消除树本身。

广告
post

一个稀疏布尔矩阵,其结构体是从下式确定的Holesky因子分解的结构体typ.

广告

详见: chol,etree,treelayout.

广告

对于非平方矩阵,用户还可以使用spaugment函数来找到线性方程的最小二乘解。

 
:s= spaugment (A,c)

创建的增广矩阵A.

这是从给出的

[c * eye(m, m), A;
            A', zeros(n, n)]

这与的最小二乘解有关A \ b通过

s * [ r / c; x] = [ b, zeros(n, columns(b)) ]

这里的r是残差

r = b - A * x

作为矩阵s是对称不定的,可以用分解lu,因此可以在不需要的情况下找到最小范数解qr因子分解。因为残余误差zeros (m, m)对于不确定的问题,例如

m = 11; n = 10; mn = max (m, n);
A = spdiags ([ones(mn,1), 10*ones(mn,1), -ones(mn,1)],
             [-1, 0, 1], m, n);
x0 = A \ ones (m,1);
s = spaugment (A);
[L, U, P, Q] = lu (s);
x1 = Q * (U \ (L \ (P  * [ones(m,1); zeros(n,1)])));
x1 = x1(end - n + 1 : end);

要找到一个超定问题的解,需要估计剩余误差r因此,使用spaugment作用

通常,左除法运算符比使用spaugment作用

详见: mldivide.

广告

最后,函数eigs可以用于基于选择标准来计算有限数量的特征值和特征向量,对于svds其计算有限数量的奇异值和向量。

 
:d= eigs (A)
:d= eigs (A,k)
:d= eigs (A,k,sigma)
:d= eigs (A,k,sigma,opts)
:d= eigs (A,B)
:d= eigs (A,B,k)
:d= eigs (A,B,k,sigma)
:d= eigs (A,B,k,sigma,opts)
:d= eigs (Af,n)
:d= eigs (Af,n,k)
:d= eigs (Af,n,k,sigma)
:d= eigs (Af,n,k,sigma,opts)
:d= eigs (Af,n,B)
:d= eigs (Af,n,B,k)
:d= eigs (Af,n,B,k,sigma)
:d= eigs (Af,n,B,k,sigma,opts)
:[V,D] = eigs (…)
:[V,D,flag] = eigs (…)

根据选择标准计算有限数量的特征值和特征向量。

默认情况下,eigs求解相应的特征向量所在的方程。如果给定正定矩阵B然后eigs求解一般特征值方程

输入A是维度的平方矩阵nxn典型的A也是大而稀疏的。

输入B对于广义特征值问题,是一个大小与A(nxn). 典型的B也是大而稀疏的。

要计算的特征值和特征向量的数量从下式给出k并且默认为6。

参数sigma确定返回哪些特征值。sigma可以是标量或字符串。当sigma是向量k最接近的特征值sigma返回。如果sigma是字符串,它必须是以下值之一。

"lm"

最大幅值(默认值)。

广告
"sm"

最小幅值。

广告
"la"

最大代数(仅适用于实对称问题)。

广告
"sa"

最小代数(仅适用于实对称问题)。

广告
"be"

两端,如果k是奇数(仅对真正的对称问题有效)。

广告
"lr"

最大实部(仅适用于复数或不对称问题)。

广告
"sr"

最小实部(仅适用于复数或不对称问题)。

广告
"li"

最大的想象部分(仅适用于复数或不对称问题)。

广告
"si"

最小的想象部分(仅适用于复数或不对称问题)。

广告

如果opts是一个定义可能参数的结构体eigs应该使用。的字段opts结构体为:

issym

如果Af则该标志(真/假)确定函数是否Af定义了一个对称问题。如果矩阵A给出了。默认值为false。

广告
isreal

如果Af则该标志(真/假)确定函数是否Af定义了一个真正的问题。如果矩阵A给出了。默认值为true。

广告
tol

定义所需的收敛误差范围,计算为tol * norm (A)。默认为eps.

广告
maxit

最大迭代次数。默认值为300。

广告
p

要使用的Lanczos基向量的数量。更多的向量将导致更快的收敛,但会更多地使用内存。的最佳值p取决于问题,应在范围内k + 1n。默认值为2 * k.

广告
v0

算法的起始向量。接近最终解算器的初始向量将加快收敛速度。默认值为ARPACK随机生成一个起始向量。如果指定,v0必豆n-by-1向量,其中n = rows (A).

广告
disp

diag打印输出的级别(0|1|2)。如果disp为0,则禁用diag。默认值为0。

广告
cholB

如果正在计算广义特征值问题,则此标志(真/假)指定B输入表示chol (B)或者只是矩阵B。默认值为false。

广告
permB

的Cholesky因子分解的置换向量B如果cholB为真。它是通过[R, ~, permB] = chol (B, "vector")。默认为-1 / n.

广告

也可以表示A通过表示为Af. Af必须后跟标量参数n定义接受的向量自变量的长度Af. Af可以是functionhandle、内联函数或字符串。当Af是一个没有要使用的函数名称的字符串。

Af是形式的函数y = Af (x)其中的要求返回值Af从的值决定sigma。四种可能的形式是

A * x

如果sigma不是给定的,或者是除“sm”之外的字符串。

广告
A \ x

如果sigma是0或“sm”。

广告
(A - sigma * I) \ x

如果sigma是不等于0的标量;I身份矩阵的大小是否与A.

广告
(A - sigma * B) \ x

对于一般的特征值问题。

广告

返回参数及其形式取决于指定的返回参数的数量。对于单个返回参数,列向量d的长度k返回时包含k已经查找的特征值。对于两个返回自变量,V是一个nxkmatrix其列为k与返回的特征值相对应的特征向量。特征值本身返回D以的形式kxk矩阵,其中对角线上的元素是本征值。

第三个返回参数flag返回收敛的状态。如果flag如果为0,则所有特征值都已收敛。任何其他值都表示无法收敛。

编程注意事项:对于小问题,n<500,考虑使用eig (full (A)).

如果ARPACK无法收敛,请考虑增加Lanczos向量的数量(opt-p),增加迭代次数(opt.maxiter),或减小误差范围(opt.tol)。

参考:此函数基于ARPACK包,从R编写。Lehoucq、K.Maschhoff、D.Sorensen和C.Yang。有关更多信息,详见http://www.caam.rice.edu/software/ARPACK/.

详见: eig,svds.

广告
 
:s= svds (A)
:s= svds (A,k)
:s= svds (A,k,sigma)
:s= svds (A,k,sigma,opts)
:[u,s,v] = svds (…)
:[u,s,v,flag] = svds (…)

求矩阵的几个奇异值A.

奇异值的计算使用

[m, n] = size (A);
s = eigs ([sparse(m, m), A;
                     A', sparse(n, n)])

返回的特征值eigs对应于的奇异值A。要计算的奇异值的数量从k并且默认为6。

参数sigma指定要查找的奇异值。当sigma是字符串'L',默认情况下,的最大奇异值A找到。否则sigma必须是实数标量并且奇异值最接近sigma找到。作为推论,sigma = 0找到最小的奇异值。请注意,对于相对较小的值sigma,则有可能找不到所要求的奇异值的数目。那样的话sigma应该增加。

opts是一个定义参数的结构体svds将传递给eigs。该结构体的可能字段详见eigs默认情况下,svds设置以下三个字段:

tol

奇异值所需的收敛误差。默认值为1e-10。eigs已通过tol / sqrt (2).

广告
maxit

最大迭代次数。默认值为300。

广告
disp

diag打印输出的级别(0|1|2)。如果disp为0,则禁用diag。默认值为0。

广告

如果指定多个输出,则svds将返回的奇异值分解的近似A

A_approx = u*s*v'

这里的A_近似是一个大小矩阵A但只有等级k.

flag如果算法已成功收敛,则返回0,否则返回1。收敛性的测试是

norm (A*v - u*s, 1) <= tol * norm (A, 1)

svds最好是从一个大的稀疏矩阵中只找到几个奇异值。否则,svd (full (A))可能会更有效率。

详见: svd,eigs.

广告

脚注

(10)

这里的CHOLMOD,UMFPACKCXsparse包从Tim Davis编写,可在http://faculty.cse.tamu.edu/davis/suitesparse.html


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

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