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 应用保持稀疏性的行/列置换。即 R 是 A(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 = chol2inv (R) ¶从其 Cholesky 分解 R 求逆一个对称正定方阵。
注意 R 应该是一个对角元均为正的上三角矩阵。chol2inv (U) 提供 inv (R'*R),但比使用 inv 快得多。
[R1, info] = cholupdate (R, u, op) ¶更新或降级 Cholesky 分解。
给定一个上三角矩阵 R 和一个列向量 u,尝试确定另一个上三角矩阵 R1,使得
"+",则 R1'*R1 = R'*R + u*u'
"-",则 R1'*R1 = R'*R - u*u'
如果 op 是 "-",则 info 设置为
如果 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 设置为
如果 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)。
[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",lu 将 P 和 Q 作为向量值返回,使得对于满矩阵,A(P,:) = L * U,以及 R(P,:) * A(:,Q) = L * U。
当使用两个输出参数调用时,返回上三角矩阵和下三角矩阵的置换形式,使得 A = L * U。当使用一个输出参数 y 调用时,返回从 LAPACK 子程序返回的矩阵。如果输入矩阵是稀疏的,则矩阵 L 嵌入到 U 中,以给出类似于满矩阵情况的返回值。对于满矩阵和稀疏矩阵,lu 都会丢失置换信息。
[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 分解,其中 x 和 y 是列向量(秩 1 更新)或列数相等的矩阵(秩 k 更新)。
可选地,可以通过提供行置换(枢轴)矩阵 P 来使用行枢轴更新;在这种情况下,将返回更新后的置换矩阵。请注意,如果 L、U、P 是从 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 是稀疏的,则 P 是 A 的列的一种减少填充的排序。在这种情况下,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 是稀疏的,则使用 SPQR 或 CXSPARSE 计算稀疏 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,则 X 是 A \ B 的最小 2-范数解。如果 M >= N,则 X 是 A \ B 的最小二乘逼近。如果请求两个返回值,则 C 和 R 的含义与稠密情况相同(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 分解,其中 u 和 v 是列向量(秩 1 更新)或列数相等的矩阵(秩 k 更新)。请注意,后一种情况是通过一系列秩 1 更新实现的;因此,对于足够大的 k,从头开始重新计算分解会更快且更准确。
所提供的 QR 分解可以是完全的(Q 为方阵)或经济的(R 为方阵)。
[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",则需要完全分解。
[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",则需要完全分解。
[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。