18.3 矩阵分解

 
R = chol (A)
[R, p] = chol (A)
[R, p, Q] = chol (A)
[R, p, Q] = chol (A, "vector")
[L, …] = chol (…, "lower")
[R, …] = chol (…, "upper")

计算实对称或复埃尔米特正定矩阵 A 的上 Cholesky 因子 R

上 Cholesky 因子 R 通过使用矩阵 A 的上三角部分计算,定义为

R' * R = A.

使用可选参数 "upper" 调用 chol 具有相同的行为。相反,使用可选参数 "lower" 时,chol 返回使用矩阵 A 下三角部分计算的下三角分解,使得

L * L' = A.

当只使用一个输出参数调用时,如果矩阵 A 不是正定的,chol 会失败。请注意,如果矩阵 A 不是实对称或复埃尔米特矩阵,则下三角部分被视为上三角部分的(复共轭)转置,反之亦然(给定 "lower" 参数时)。

当使用两个或更多输出参数调用时,p 指示矩阵 A 是否为正定,并且 chol 不会失败。p 的值为零表示矩阵 A 是正定的,且 R 给出了分解。否则,p 将具有正值。

如果使用三个输出参数调用,矩阵 A 必须是稀疏的,并且在分解之前会对矩阵 A 应用保持稀疏性的行/列置换。即 RA(Q,Q) 的分解,使得

R' * R = Q' * A * Q.

保持稀疏性的置换通常以矩阵形式返回。然而,给定可选参数 "vector"Q 将作为向量返回,使得

R' * R = A(Q, Q).

通常,对于稀疏矩阵,下三角分解明显更快。

另请参阅: hess, lu, qr, qz, schur, svd, ichol, cholinv, chol2inv, cholupdate, cholinsert, choldelete, cholshift.

 
Ainv = cholinv (A)

使用 Cholesky 分解计算对称正定矩阵 A 的逆矩阵。

另请参阅: chol, chol2inv, inv.

 
Ainv = chol2inv (R)

从其 Cholesky 分解 R 求逆一个对称正定方阵。

注意 R 应该是一个对角元均为正的上三角矩阵。chol2inv (U) 提供 inv (R'*R),但比使用 inv 快得多。

另请参阅: chol, cholinv, inv.

 
[R1, info] = cholupdate (R, u, op)

更新或降级 Cholesky 分解。

给定一个上三角矩阵 R 和一个列向量 u,尝试确定另一个上三角矩阵 R1,使得

  • 如果 op"+",则 R1'*R1 = R'*R + u*u'
  • 如果 op"-",则 R1'*R1 = R'*R - u*u'

如果 op"-",则 info 设置为

  • 0,如果降级成功,
  • 1,如果 R'*R - u*u' 不是正定的,
  • 2,如果 R 是奇异的。

如果 info 不存在,则在情况 1 和 2 中会打印错误消息。

另请参阅: chol, cholinsert, choldelete, cholshift.

 
R1 = cholinsert (R, j, u)
[R1, info] = cholinsert (R, j, u)

在原始分解矩阵中插入一行或一列后,更新 Cholesky 分解。

给定实对称或复埃尔米特正定矩阵 A = R'*R 的 Cholesky 分解,R 为上三角,返回 A1 的 Cholesky 分解,其中 A1(p,p) = A,A1(:,j) = A1(j,:)' = u,且 p = [1:j-1, j+1:n+1]。u(j) 应为正数。

返回时,info 设置为

  • 0,如果插入成功,
  • 1,如果 A1 不是正定的,
  • 2,如果 R 是奇异的。

如果 info 不存在,则在情况 1 和 2 中会打印错误消息。

另请参阅: chol, cholupdate, choldelete, cholshift.

 
R1 = choldelete (R, j)

从原始分解矩阵中删除一行或一列后,更新 Cholesky 分解。

给定实对称或复埃尔米特正定矩阵 A = R'*R 的 Cholesky 分解,R 为上三角,返回 A(p,p) 的 Cholesky 分解,其中 p = [1:j-1, j+1:n+1]。

另请参阅: chol, cholupdate, cholinsert, cholshift.

 
R1 = cholshift (R, i, j)

在原始分解矩阵中移动一定范围的列后,更新 Cholesky 分解。

给定实对称或复埃尔米特正定矩阵 A = R'*R 的 Cholesky 分解,R 为上三角,返回 A(p,p) 的 Cholesky 分解,其中 p 是置换
p = [1:i-1, circshift(i:j, 1), j+1:n] 如果 i < j

p = [1:j-1, circshift(j:i,-1), i+1:n] 如果 j < i

另请参阅: chol, cholupdate, cholinsert, choldelete.

 
H = hess (A)
[P, H] = hess (A)

计算矩阵 A 的 Hessenberg 分解。

Hessenberg 分解为 P * H * P' = A,其中 P 是酉矩阵(P' * P = I,使用复共轭转置),H 是上 Hessenberg 矩阵(H(i, j) = 0 forall i > j+1)

Hessenberg 分解通常被用作特征值计算的第一步,但也有其他应用(参见 Golub、Nash 和 Van Loan,IEEE Transactions on Automatic Control,1979)。

另请参阅: eig, chol, lu, qr, qz, schur, svd.

 
[L, U] = lu (A)
[L, U, P] = lu (A)
[L, U, P, Q] = lu (S)
[L, U, P, Q, R] = lu (S)
[…] = lu (S, thresh)
y = lu (…)
[…] = lu (…, "vector")

计算 A 的 LU 分解。

如果 A 是满矩阵,则使用 LAPACK 的子程序;如果 A 是稀疏矩阵,则使用 UMFPACK

根据可选的返回值 P,结果以置换后的形式返回。例如,给定矩阵 A = [1, 2; 3, 4]

[L, U, P] = lu (A)

返回

L =

  1.00000  0.00000
  0.33333  1.00000

U =

  3.00000  4.00000
  0.00000  0.66667

P =

  0  1
  1  0

矩阵不要求是方阵。

当使用两个或三个输出参数且输入为稀疏矩阵时,lu 不会尝试执行保持稀疏性的列置换。当使用四个输出参数调用时,将返回保持稀疏性的列变换 Q,使得 P * A * Q = L * U。这是对稀疏输入矩阵调用 lu首选方式。

当使用五个输出参数且输入为稀疏矩阵时,lu 尝试在输入矩阵上使用比例因子 R,使得 P * (R \ A) * Q = L * U。这通常会产生更稀疏且更稳定的分解。

可以提供一个额外的输入参数 thresh 来定义枢轴阈值。thresh 可以是标量,在这种情况下它定义 UMFPACK 对称和非对称情况下的枢轴容限。如果 thresh 是一个 2 元素向量,则第一个元素定义非对称 UMFPACK 枢轴策略的容限,第二个元素定义对称策略的容限。默认情况下,使用 spparms 定义的值([0.1, 0.001])。

给定字符串参数 "vector"luPQ 作为向量值返回,使得对于满矩阵,A(P,:) = L * U,以及 R(P,:) * A(:,Q) = L * U

当使用两个输出参数调用时,返回上三角矩阵和下三角矩阵的置换形式,使得 A = L * U。当使用一个输出参数 y 调用时,返回从 LAPACK 子程序返回的矩阵。如果输入矩阵是稀疏的,则矩阵 L 嵌入到 U 中,以给出类似于满矩阵情况的返回值。对于满矩阵和稀疏矩阵,lu 都会丢失置换信息。

另请参阅: luupdate, ilu, chol, hess, qr, qz, schur, svd.

 
[L, U] = luupdate (L, U, x, y)
[L, U, P] = luupdate (L, U, P, x, y)

给定实矩阵或复矩阵 A = L*U 的 LU 分解,L 为单位下梯形矩阵,U 为上梯形矩阵,返回 A + x*y.' 的 LU 分解,其中 xy 是列向量(秩 1 更新)或列数相等的矩阵(秩 k 更新)。

可选地,可以通过提供行置换(枢轴)矩阵 P 来使用行枢轴更新;在这种情况下,将返回更新后的置换矩阵。请注意,如果 LUP 是从 lu 获得的枢轴 LU 分解:

[L, U, P] = lu (A);

A+x*y.' 的分解可以通过以下方式获得

[L1, U1] = lu (L, U, P*x, y)

[L1, U1, P1] = lu (L, U, P, x, y)

第一种形式使用非枢轴算法,速度更快但稳定性较差。第二种形式使用较慢的枢轴算法,稳定性更好。

矩阵情况作为一系列秩 1 更新来实现;因此,对于足够大的 k,从头开始重新计算分解会更快且更准确。

另请参阅: lu, cholupdate, qrupdate.

 
[Q, R] = qr (A)
[Q, R, P] = qr (A)
R = qr (A)
[C, R] = qr (A, B)
[C, R, P] = qr (A, B)
X = qr (A, B) # 仅稀疏
[…] = qr (…, "econ")
[…] = qr (…, "vector")
[…] = qr (…, "matrix")
[…] = qr (…, 0)

计算 A 的 QR 分解。

QR 分解为

Q * R = A

其中 Q 是正交矩阵,R 是上三角矩阵。

例如,给定矩阵 A = [1, 2; 3, 4]

[Q, R] = qr (A)

返回

Q =

  -0.31623  -0.94868
  -0.94868   0.31623

R =

  -3.16228  -4.42719
   0.00000  -0.63246

将它们相乘后得到原始矩阵

Q * R
  ⇒
     1.0000   2.0000
     3.0000   4.0000

如果只请求一个返回值,则它是 R。(注意:与大多数命令不同,单个返回值不是请求多个值时的第一个返回值。)

如果请求第三个输出 P,则 qr 计算置换 QR 分解

Q * R = A * P

其中 Q 是正交矩阵,R 是上三角矩阵,P 是置换矩阵。

如果 A 是稠密的,则使用标准 LAPACK 子程序计算 QR 分解。在这种情况下,置换分解具有额外的属性:R 的对角元素按幅值递减排列。换句话说,abs (diag (R)) 将从大到小排序。

如果 A 是稀疏的,则 PA 的列的一种减少填充的排序。在这种情况下,R 的对角元素不是按幅值递减排序的。

例如,给定矩阵 A = [1, 2; 3, 4]

[Q, R, P] = qr (A)

返回

Q =

  -0.44721  -0.89443
  -0.89443   0.44721

R =

  -4.47214  -3.13050
   0.00000   0.44721

P =

   0  1
   1  0

如果输入矩阵 A 是稀疏的,则使用 SPQRCXSPARSE 计算稀疏 QR 分解(例如,如果 SPQR 不可用)。由于矩阵 Q 通常是满矩阵,建议只请求一个返回值 R。在这种情况下,计算避免构造 Q,并返回一个稀疏的 R,使得 R = chol (A' * A)

如果 A 是稠密的,并且提供了额外的输入矩阵 B,且请求两个返回值,则 qr 返回 C,其中 C = Q' * B。这样可以通过以下方式计算 A \ B 的最小二乘逼近:

[C, R] = qr (A, B)
X = R \ C

如果 A 是稀疏的 MxN 矩阵,并且提供了额外的矩阵 B,则可能有一个或两个返回值。如果请求一个返回值 X 且 M < N,则 XA \ B 的最小 2-范数解。如果 M >= N,则 XA \ B 的最小二乘逼近。如果请求两个返回值,则 CR 的含义与稠密情况相同(C 是稠密的,R 是稀疏的)。应优先使用一个返回参数的版本,因为它消耗更少的内存,并且能更好地处理秩亏矩阵。

如果最后一个参数是字符串 "vector",则 P 是置换向量(A 的列),而不是置换矩阵。在这种情况下,定义关系为:

Q * R = A(:, P)

然而,默认情况是返回置换矩阵,这可以通过最后一个参数 "matrix" 来明确指定。

如果可选参数是字符串 "econ",则返回经济型分解。如果原始矩阵 A 的大小为 MxN 且 M > N,则经济型分解只计算 R 中的 N 行和 Q 中的 N 列,省略 R 中的零行。如果 M ≤ N,则经济型分解与标准分解没有区别。

如果可选参数是数字 0,则 qr 的行为如同同时给出了 "econ""vector" 参数。注意:此语法仍然被接受,但不推荐使用,将来可能会被移除。请改用 "econ"

背景:QR 分解在求解最小二乘问题中有应用

min norm (A*x - b)

用于超定方程组(即 A 是高矩阵)。

置换 QR 分解 [Q, R, P] = qr (A) 可用于构造 span (A) 的一组正交基。

另请参阅: chol, hess, lu, qz, schur, svd, qrupdate, qrinsert, qrdelete, qrshift.

 
[Q1, R1] = qrupdate (Q, R, u, v)

在给定更新向量或矩阵的情况下更新 QR 分解。

给定实矩阵或复矩阵 A = Q*R 的 QR 分解,Q 为酉矩阵,R 为上梯形矩阵,返回 A + u*v' 的 QR 分解,其中 uv 是列向量(秩 1 更新)或列数相等的矩阵(秩 k 更新)。请注意,后一种情况是通过一系列秩 1 更新实现的;因此,对于足够大的 k,从头开始重新计算分解会更快且更准确。

所提供的 QR 分解可以是完全的(Q 为方阵)或经济的(R 为方阵)。

另请参阅: qr, qrinsert, qrdelete, qrshift.

 
[Q1, R1] = qrinsert (Q, R, j, x, orient)

在原始分解矩阵中插入一行或一列后,更新 QR 分解。

给定实矩阵或复矩阵 A = Q*R 的 QR 分解,Q 为酉矩阵,R 为上梯形矩阵,返回 [A(:,1:j-1), x, A(:,j:n)] 的 QR 分解(如果 orient"col",其中 x 是要插入 A 的列向量),或 [A(1:j-1,:); x; A(:,j:n)] 的 QR 分解(如果 orient"row",其中 x 是要插入 A 的行向量)。

orient 的默认值是 "col"。如果 orient"col"u 可以是矩阵,j 可以是索引向量,此时返回矩阵 B 的 QR 分解,使得 B(:,j) = u 且 B(:,j) = [] 给出 A。请注意,后一种情况是通过一系列 k 次插入实现的;因此,对于足够大的 k,从头开始计算分解会更快且更准确。

如果 orient"col",所提供的 QR 分解可以是完全的(Q 为方阵)或经济的(R 为方阵)。

如果 orient"row",则需要完全分解。

另请参阅: qr, qrupdate, qrdelete, qrshift.

 
[Q1, R1] = qrdelete (Q, R, j, orient)

从原始分解矩阵中删除一行或一列后,更新 QR 分解。

给定实矩阵或复矩阵 A = Q*R 的 QR 分解,Q 为酉矩阵,R 为上梯形矩阵,返回 [A(:,1:j-1), A(:,j+1:n)] 的 QR 分解(如果 orient"col"),或 [A(1:j-1,:); A(j+1:n,:)] 的 QR 分解(如果 orient"row")。orient 的默认值是 "col"

如果 orient"col"j 可以是索引向量,此时返回矩阵 B 的 QR 分解,使得 A(:,j) = [] 给出 B。请注意,后一种情况是通过一系列 k 次删除实现的;因此,对于足够大的 k,从头开始重新计算分解会更快且更准确。

如果 orient"col",所提供的 QR 分解可以是完全的(Q 为方阵)或经济的(R 为方阵)。

如果 orient"row",则需要完全分解。

另请参阅: qr, qrupdate, qrinsert, qrshift.

 
[Q1, R1] = qrshift (Q, R, i, j)

在原始分解矩阵中移动一定范围的列后,更新 QR 分解。

给定实矩阵或复矩阵 A = Q*R 的 QR 分解,Q 为酉矩阵,R 为上梯形矩阵,返回 A(:,p) 的 QR 分解,其中 p 是置换
p = [1:i-1, circshift(i:j, 1), j+1:n] 如果 i < j

p = [1:j-1, circshift(j:i,-1), i+1:n] 如果 j < i

另请参阅: qr, qrupdate, qrinsert, qrdelete.

 
 
[AA, BB, Q, Z, V, W] = qz (A, B)
[AA, BB, Q, Z, V, W] = qz (A, B, opt)

计算广义特征值问题的 QZ 分解。

广义特征值问题定义为

A x = lambda B x

该函数有两种调用形式:

  1. [AA, BB, Q, Z, V, W] = qz (A, B)

    计算复 QZ 分解、广义特征向量和广义特征值。

    
    AA = Q * A * Z, BB = Q * B * Z
    A * V * diag (diag (BB)) = B * V * diag (diag (AA))
    diag (diag (BB)) * W' * A = diag (diag (AA)) * W' * B
    
    

    其中 AABB 是上三角矩阵,QZ 是酉矩阵。矩阵 VW 分别包含右广义特征向量和左广义特征向量。

  2. [AA, BB, Q, Z, V, W] = qz (A, B, opt)

    opt 参数必须等于 "real""complex"。如果等于 "complex",则此调用形式与只有两个输入参数的第一种形式等价。

    如果 opt 等于 "real",则计算实 QZ 分解。特别地,AA 仅保证为准上三角矩阵,对角线上有 1x1 和 2x2 的块,而 QZ 是正交矩阵。上述右广义特征向量和左广义特征向量的等式仅在 AA 是上三角矩阵时成立(即所有广义特征值都是实数时,此时实 QZ 和复 QZ 重合)。

注意:qz 执行置换平衡,但不执行缩放(参见 balance),这可能导致结果比 eig 的精度稍差。输出参数的顺序是为与 MATLAB 兼容而选择的。

对于特征值,请使用 ordeig 函数根据得到的 AABB 矩阵计算它们。

另请参阅: eig, gsvd, balance, chol, hess, lu, qr, qzhess, schur, ordeig.

 
[aa, bb, q, z] = qzhess (A, B)

计算矩阵束 (A, B) 的 Hessenberg-三角分解,返回 aa = q * A * zbb = q * B * z,其中 qz 是正交矩阵。

例如:

[aa, bb, q, z] = qzhess ([1, 2; 3, 4], [5, 6; 7, 8])
  ⇒  aa =
      -3.02244  -4.41741
       0.92998   0.69749
  ⇒  bb =
      -8.60233  -9.99730
       0.00000  -0.23250
  ⇒  q =
      -0.58124  -0.81373
      -0.81373   0.58124
  ⇒  z =
     Diagonal Matrix
       1   0
       0   1

Hessenberg-三角分解是 Moler 和 Stewart 的 QZ 分解算法的第一步。

算法取自 Golub 和 Van Loan 的《Matrix Computations, 2nd edition》。

另请参阅: lu, chol, hess, qr, qz, schur, svd.

 
S = schur (A)
S = schur (A, "real")
S = schur (A, "complex")
S = schur (A, opt)
[U, S] = schur (…)

计算 A 的 Schur 分解。

方阵 A 的 Schur 分解定义为

S = U' * A * U

其中 U 是酉矩阵(U'* U 是单位阵),S 是上三角矩阵。A(和 S)的特征值是 S 的对角元素。如果矩阵 A 是实数,则计算实 Schur 分解,其中矩阵 U 是正交矩阵,S 是块上三角矩阵,对角线上的块大小最多为 2 x 2

实矩阵的默认行为是实 Schur 分解。可以通过传递标志 "complex" 来强制进行复分解。

特征值可选地根据 opt 的值沿对角线排序:

opt = "a"

将具有负实部的特征值移到 S 的前导块。助记符:"a" 代表代数 Riccati 方程,此排序在其中很有用。

opt = "d"

将模小于 1 的特征值移到 S 的前导块。助记符:"d" 代表离散代数 Riccati 方程,此排序在其中很有用。

opt = "u"

无序。无特定的特征值排序(默认)。

U 的前 k 列总是张成对应于 S 的前 k 个特征值的 A-不变子空间。

另请参阅: rsf2csf, ordschur, trexc, ordeig, lu, chol, hess, qr, qz, svd, eig.

 
[U, T] = rsf2csf (UR, TR)

将实准上三角 Schur 形式 TR 转换为复上三角 Schur 形式 T

注意,以下关系成立: UR * TR * UR' = U * T * U'U' * U 是单位矩阵 I。

另请注意,UT 不是唯一的。

另请参阅: schur, ordschur, trexc.

 
[UR, SR] = ordschur (U, S, select)

重新排序从 schur 函数获得的实 Schur 分解 (U,S),使得所选特征值出现在准三角 Schur 矩阵的左上角对角块中。

逻辑向量 select 指定沿 S 的对角线出现的所选特征值。

例如,给定矩阵 A = [1, 2; 3, 4] 及其 Schur 分解

[U, S] = schur (A)

返回

U =

  -0.82456  -0.56577
   0.56577  -0.82456

S =

  -0.37228  -1.00000
   0.00000   5.37228

可以通过以下方式重新排序分解,使正特征值位于左上角:

[U, S] = ordschur (U, S, [0,1])

另请参阅: schur, trexc, ordeig, ordqz.

 
[U, T] = trexc (U, T, M)

使用 LAPACK 函数 ZTREXC 重新排序 Schur 分解。

给定酉矩阵 U 和来自 Schur 分解 A = U*T*U' 的上三角 Schur 形式 T,此函数根据 M 中的交换规范重新排序 T 的对角元素。

M 的每一行包含两个索引 [IFST, ILST],指定位置 IFST 处的对角元素应移动到位置 ILST。交换按顺序执行。

另请参阅: schur, ordschur.

 
[AR, BR, QR, ZR] = ordqz (AA, BB, Q, Z, keyword)
[AR, BR, QR, ZR] = ordqz (AA, BB, Q, Z, select)

重新排序广义特征值问题的 QZ 分解。

广义特征值问题定义为

A x = lambda B x

其广义 Schur 分解使用 qz 算法计算:

[AA, BB, Q, Z] = qz (A, B)

其中 AABBQZ 满足


AA = Q * A * Z, BB = Q * B * Z

ordqz 函数计算酉变换 QRZR,使得 AABB 对角线上特征值的顺序发生改变。重新排序后的矩阵 ARBR 满足:


AR = QR * A * ZR, BR = QR * B * ZR

该函数可以用 keyword 参数调用,该参数按以下方式选择 ARBR 左上角块中的特征值:

"S", "udi"

小:前导块具有所有 |lambda| < 1

"B", "udo"

大:前导块具有所有 |lambda| ≥ 1

"-", "lhp"

负实部:前导块具有所有在开左半平面的特征值

"+", "rhp"

非负实部:前导块具有所有在闭右半平面的特征值

如果给定逻辑向量 select 而不是关键字,则 ordqz 函数将所有 select(k) 为真的特征值 k 重新排序到左块。

注意:关键字与 qr 中的关键字兼容。

另请参阅: eig, ordeig, qz, schur, ordschur.

 
lambda = ordeig (A)
lambda = ordeig (A, B)

返回准三角矩阵的特征值,按它们在矩阵 A 中出现的顺序排列。

准三角矩阵 A 通常是 Schur 分解的结果。如果使用第二个输入 B 调用,则返回对 AB 的广义特征值,按矩阵 A-lambda*B 中出现的顺序排列。对 AB 通常是 QZ 分解的结果。

另请参阅: ordschur, ordqz, eig, schur, qz.

 
angle = subspace (A, B)

确定由矩阵 AB 的列张成的两个子空间之间的最大主角。

参考文献: Andrew V. Knyazev, Merico E. Argentati, "Principal Angles between Subspaces in an A-Based Scalar Product: Algorithms and Perturbation Estimates", SIAM Journal on Scientific Computing, Vol. 23, No. 6, pp. 2008-2040.

 
s = svd (A)
[U, S, V] = svd (A)
[U, S, V] = svd (A, "econ")
[U, S, V] = svd (A, 0)

计算 A 的奇异值分解。

奇异值分解由关系式定义

A = U*S*V'

函数 svd 通常只返回奇异值向量。当使用三个返回值调用时,它计算 USV。例如,

svd (hilb (3))

返回

ans =

  1.4083189
  0.1223271
  0.0026873

[u, s, v] = svd (hilb (3))

返回

u =

  -0.82704   0.54745   0.12766
  -0.45986  -0.52829  -0.71375
  -0.32330  -0.64901   0.68867

s =

  1.40832  0.00000  0.00000
  0.00000  0.12233  0.00000
  0.00000  0.00000  0.00269

v =

  -0.82704   0.54745   0.12766
  -0.45986  -0.52829  -0.71375
  -0.32330  -0.64901   0.68867

当给定第二个参数(非 0)时,svd 返回经济型分解,消除 UV 中不必要的行或列。

如果第二个参数恰好是 0,则分解的选择基于矩阵 A。如果 A 的行数多于列数,则返回经济型分解,否则计算常规分解。

算法说明:计算完全分解(左右奇异矩阵以及奇异值)时,LAPACK 中有两个子程序可选。Octave 使用的默认子程序是 gesvd。替代方案是 gesdd,速度提升 5 倍,但可能使用更多内存,且对某些输入矩阵可能不准确。还有第三个子程序 gejsv,适用于在极端规模下获得更好的精度。有关选择驱动器的更多信息,请参见 svd_driver 的文档。

另请参阅: svd_driver, svds, eig, lu, chol, hess, qr, qz.

 
val = svd_driver ()
old_val = svd_driver (new_val)
old_val = svd_driver (new_val, "local")

查询或设置 svd 使用的底层 LAPACK 驱动器。

当前可识别的值为 "gesdd""gesvd""gejsv"。默认值为 "gesvd"

当从函数内部以 "local" 选项调用时,该变量在该函数及其调用的任何子例程中局部更改。退出函数时恢复原始变量值。

算法说明:LAPACK 库子程序 gesvdgesdd 仅在计算完全奇异值分解时有所不同(左右奇异矩阵以及奇异值)。当仅计算奇异值时,以下讨论不相关。

较新的 gesdd 子程序基于分治算法,速度比基于 QR 分解的替代方案 gesvd 快 5 倍。然而,新算法可能使用明显更多的内存。对于 MxN 输入矩阵,内存使用量为 O(min(M,N) ^ 2),而替代方案为 O(max(M,N))。

gejsv 子程序使用预处理 Jacobi SVD 算法。与 gesvdgesdd 不同,gejsv 中没有可能会污染极端情况下精度的双对角化步骤。同时,gejsv 在某种意义上已知具有最优精度。然而,速度较慢(核心是单线程)且使用更多内存(O(min(M,N) ^ 2 + M + N))。

除了速度和内存问题外,还存在某些输入矩阵无法被 gesdd 准确分解的情况。请参见当前活跃的 bug https://savannah.gnu.org/bugs/?55564。在 LAPACK 库的新版本解决这些精度问题之前,Octave 中的默认驱动器已设置为 "gesvd"

另请参阅: svd.

 
[housv, beta, zer] = housh (x, j, z)

计算 Householder 反射向量 housv,将 x 反射到单位矩阵的第 j 列,即

(I - beta*housv*housv')x =  norm (x)*e(j) if x(j) < 0,
(I - beta*housv*housv')x = -norm (x)*e(j) if x(j) >= 0

输入

x

向量

j

向量中的索引

z

零的阈值(通常应为数字 0)

输出(参见 Golub 和 Van Loan):

beta

如果 beta = 0,则无需应用反射(zer 设置为 0)

housv

Householder 向量

 
[u, h, nu] = krylov (A, V, k, eps1, pflg)

构造块 Krylov 子空间的正交基 u

块 Krylov 子空间具有以下形式:

[v a*v a^2*v ... a^(k+1)*v]

构造使用 Householder 反射来防止正交性的丧失。

如果 V 是向量,则 h 包含 Hessenberg 矩阵,使得 a*u == u*h+rk*ek',其中 rk = a*u(:,k)-u*h(:,k),而 ek' 是长度为 k 的向量 [0, 0, ..., 1]。否则,h 无意义。

如果 V 是向量且 k 大于 length (A) - 1,则 h 包含 Hessenberg 矩阵,使得 a*u == u*h

nu 的值是 Krylov 子空间张成的维数(基于 eps1)。

如果 b 是向量且 k 大于 m-1,则 h 包含 A 的 Hessenberg 分解。

可选参数 eps1 是零的阈值。默认值为 1e-12。

如果可选参数 pflg 非零,则使用行枢轴来改善数值行为。默认值为 0。

参考文献:A. Hodel, P. Misra, "Partial Pivoting in the Computation of Krylov Subspaces of Large Sparse Systems", Proceedings of the 42nd IEEE Conference on Decision and Control, December 2003.