18.2 基本矩阵函数

 
AA = balance (A)
AA = balance (A, opt)
[DD, AA] = balance (A, opt)
[D, P, AA] = balance (A, opt)
[CC, DD, AA, BB] = balance (A, B, opt)

对矩阵 A 进行平衡,以减少后续计算中的数值误差。

计算 AA = DD \ A * DD,其中 AA 是一个行范数和列范数大致相等的矩阵,并且 DD = P * D,其中 P 是一个置换 矩阵,D 是一个以 2 的幂为元素的对角矩阵。这样可以 在计算均衡化时避免舍入误差。在进行特征值 计算之前先进行平衡通常可以改善结果。

如果请求两个输出值,balance 将分别以向量的形式返回 对角矩阵 D 和置换 P。 在这种情况下,DD = eye(n)(:,P) * diag (D),其中 n 是矩阵的大小。

如果请求四个输出值,则计算 AA = CC*A*DDBB = CC*B*DD, 其中 AABB 的非零元素大小大致相同, 而 CCDD 是经过置换的对角矩阵,如同 代数特征值问题中的 DD 一样。

特征值平衡选项 opt 可以是以下之一:

"noperm""S"

仅缩放,不进行置换。

"noscal""P"

仅置换,不进行缩放。

代数特征值平衡使用标准的 LAPACK 例程。

广义特征值问题的平衡使用 Ward 算法 (SIAM Journal on Scientific and Statistical Computing,1981)。

 
bw = bandwidth (A, type)
[lower, upper] = bandwidth (A)

计算 A 的带宽。

type 参数是字符串 "lower"(表示下带宽)和 "upper"(表示上带宽)。如果未指定 type, 则同时返回 A 的下带宽和上带宽。

矩阵的下/上带宽是指具有非零元素的次对角线/超对角线的数量。

另请参阅:isbandedisdiagistrilistriu

 
c = cond (A)
c = cond (A, p)

计算矩阵关于求逆的 p-范数条件数。

cond (A) 定义为 norm (A, p) * norm (inv (A), p)

默认情况下使用 p = 2,这意味着(相对较慢的) 奇异值分解。其他可能的选择是 p = 1, Inf, "fro",这些通常更快。关于可能的 p 值的完整讨论,请参见 norm

矩阵的条件数量化了当矩阵元素发生微小变化时矩阵求逆运算的敏感程度。理想情况下条件数应接近 1。当该数值很大时,表明微小的变化(如下溢或舍入误差)将导致输出结果发生巨大变化。在这种情况下,数值计算得到的解很可能不准确。

另请参阅:condestrcondcondeignormsvd

 
c = condeig (a)
[v, lambda, c] = condeig (a)

计算矩阵关于特征值的条件数。

条件数是左右特征向量之间夹角余弦的倒数;较大的值表明该矩阵具有多个互异的特征值。

输入 a 必须是一个方阵数值矩阵。

输出为:

  • ca 的特征值条件数向量。
  • va 的右特征向量矩阵。结果等同于调用 [v, lambda] = eig (a)
  • lambdaa 的特征值对角矩阵。结果等同于调用 [v, lambda] = eig (a)

示例

a = [1, 2; 3, 4];
c = condeig (a)
  ⇒  c =
       1.0150
       1.0150

另请参阅:eigcondbalance

 
d = det (A)
[d, rcond] = det (A)

计算 A 的行列式。

如果请求,则返回倒数条件数的估计值。

编程说明:对于满矩阵使用来自 LAPACK 的例程, 对于稀疏矩阵使用来自 UMFPACK 的代码。

行列式不应用于检查矩阵的奇异性。 应改用条件数函数之一:condcondestrcond

另请参阅:condcondestrcond

 
lambda = eig (A)
lambda = eig (A, B)
[V, lambda] = eig (A)
[V, lambda] = eig (A, B)
[V, lambda, W] = eig (A)
[V, lambda, W] = eig (A, B)
[…] = eig (A, balanceOption)
[…] = eig (A, B, algorithm)
[…] = eig (…, eigvalOption)

计算矩阵或矩阵对的特征值(lambda),并可选择计算右特征向量 (V)和左特征向量(W)。

标志 balanceOption 可以是以下之一:

"balance"(默认)

启用预平衡。

"nobalance"

禁用预平衡。

标志 eigvalOption 可以是以下之一:

"matrix"

以对角矩阵形式返回特征值。(请求 2 或 3 个输出时的默认行为)

"vector"

以列向量形式返回特征值。(仅请求 1 个输出时的默认行为, 例如 lambda = eig (A)

标志 algorithm 可以是以下之一:

"chol"

使用 B 的 Cholesky 分解。(如果 A 是对称(Hermitian)且 B 是对称(Hermitian)正定时的默认行为)

"qz"

使用 QZ 算法。(当 AB 不对称时使用)

使用的算法由下表总结:

A 和 B无标志cholqz
两者都对称"chol""chol""qz"
至少一个不对称"qz""qz""qz"

eig 返回的特征值是无序的。

另请参阅:eigssvd

 
G = givens (x, y)
[c, s] = givens (x, y)

计算 Givens 旋转矩阵 G。 Givens 矩阵是一个 2 乘 2 的正交矩阵

G = [ c , s
     -s', c]

使得

G * [x; y] = [*; 0]

其中 xy 是标量。

如果请求两个输出参数,则返回因子 cs 而不是 Givens 旋转矩阵。

例如:

givens (1, 1)
   ⇒    0.70711   0.70711
       -0.70711   0.70711

注:Givens 矩阵表示二维平面的逆时针旋转, 可用于在完全分解之前将零引入矩阵。

另请参阅:planerotqr

 
S = gsvd (A, B)
[U, V, X, C, S] = gsvd (A, B)
[U, V, X, C, S] = gsvd (A, B, 0)

计算(AB)的广义奇异值分解。

广义奇异值分解由以下关系定义:

A = U*C*X'
B = V*S*X'
C'*C + S'*S = eye (columns (A))

函数 gsvd 通常只返回广义奇异值的向量 sqrt (diag (C'*C) ./ diag (S'*S))。 如果请求五个返回值,它还会计算 U、V、X 和 C。

如果存在可选的第三个输入,gsvd 构造 "经济尺寸"分解,其中 UV 的列数 以及 CS 的行数小于或等于 A 的列数。 此选项尚未实现。

编程说明:该代码是对应的 LAPACK dggsvd 和 zggsvd 例程的封装。如果矩阵 AB 秩 亏损,则 LAPACK 将返回不正确的分解。程序员 应避免这种组合。

另请参阅:svd

 
[G, y] = planerot (x)

计算二元素列向量 x 的 Givens 旋转矩阵。 Givens 矩阵是一个 2 乘 2 的正交矩阵

G = [ c , s
     -s', c]

使得

y = G * [x(1); x(2)] ≡ [*; 0]

注:Givens 矩阵表示二维平面的逆时针旋转, 可用于在完全分解之前将零引入矩阵。

另请参阅:givensqr

 
x = inv (A)
[x, rcond] = inv (A)
[…] = inverse (…)

计算方阵 A 的逆矩阵。

如果请求,则返回倒数条件数的估计值, 否则如果倒数条件数很小,则会警告矩阵病态。

一般来说,最好避免直接计算矩阵的逆。 例如,求解方程组(A*x = b)使用 y = A \ b 比使用 y = inv (A) * b 更快且更精确。

如果使用稀疏矩阵调用,则通常 x 将是一个满 矩阵,需要显著更多的存储空间。如果可能,请避免形成稀疏矩阵的逆。

编程说明:inverseinv 的别名,可以互换使用。

另请参阅:ldividerdividepinv

 
x = linsolve (A, b)
x = linsolve (A, b, opts)
[x, R] = linsolve (…)

求解线性系统 A*x = b

在没有选项的情况下,此函数等同于左除运算符 (x = A \ b)或矩阵左除函数 (x = mldivide (A, b))。

Octave 通常检查矩阵 A 的属性并选择 与矩阵最匹配的求解器。通过传递结构体 optslinsolve,您可以直接告知 Octave 关于矩阵 A 的信息。 在这种情况下,Octave 将跳过矩阵检查并直接 进行线性系统的求解。

警告:如果矩阵 A 不具有 opts 结构体中列出的属性, 则结果将不准确,并且不会给出任何警告。 如有疑问,请让 Octave 检查矩阵并选择适当的求解器, 因为此步骤耗时很少,并且结果会被缓存, 因此每个线性系统只执行一次。

可能的 opts 字段(将值设置为 true/false):

LT

A 是下三角矩阵

UT

A 是上三角矩阵

UHESS

A 是上海森堡矩阵(目前无区别)

SYM

A 是对称或复埃尔米特矩阵(目前无区别)

POSDEF

A 是正定矩阵

RECT

A 是普通矩形矩阵(目前无区别)

TRANSA

如果为 true,求解 A'*x = b 而不是 A*x = b

可选的第二个输出 RA 的逆条件数 (如果矩阵是奇异的则为零)。

另请参阅:mldividematrix_typercond

 
type = matrix_type (A)
type = matrix_type (A, "nocompute")
A = matrix_type (A, type)
A = matrix_type (A, "upper", perm)
A = matrix_type (A, "lower", perm)
A = matrix_type (A, "banded", nl, nu)

识别矩阵类型或将矩阵标记为特定类型。

这样可以更快速地求解涉及 A 的线性方程组。

使用单个参数调用时,matrix_type 返回矩阵的类型 并将其缓存以供将来使用。

使用多个参数调用时,matrix_type 允许定义 矩阵的类型。

如果给出选项 "nocompute",则该函数不会尝试 在类型未知时猜测类型。这用于调试 目的。

可能的矩阵类型取决于矩阵是满矩阵还是稀疏矩阵, 可以是以下之一:

"unknown"

移除任何先前缓存的矩阵类型,并将类型标记为未知。

"full"

将矩阵标记为满矩阵。

"positive definite"

可能是满正定矩阵。

"diagonal"

对角矩阵。(仅限稀疏矩阵)

"permuted diagonal"

置换对角矩阵。无需特别指定置换, 因为矩阵的结构已明确给出这一点。(仅限稀疏矩阵)

"upper"

上三角矩阵。如果给出了可选的第三个参数 perm, 则假定矩阵是经过置换的上三角矩阵,置换 由向量 perm 定义。

"lower"

下三角矩阵。如果给出了可选的第三个参数 perm, 则假定矩阵是经过置换的下三角矩阵,置换 由向量 perm 定义。

"banded"
"banded positive definite"

带状矩阵,对角线以下带宽为 nl,对角线以上带宽为 nu。 如果 nlnu 为 1,则矩阵是三对角的 并使用专门的代码处理。此外,矩阵可以被标记为 可能是正定的。(仅限稀疏矩阵)

"singular"

假定矩阵是奇异的,并将使用最小范数 解来处理。

请注意,矩阵类型将在首次尝试求解涉及 A 的线性方程时自动发现。因此 matrix_type 仅用于给 Octave 提供矩阵类型的提示。 错误地定义矩阵类型将导致线性方程组的解产生错误结果;正确定义矩阵类型完全 由用户负责

此外,正定性的测试是一种低成本的测试,用于检查具有实正对角的埃尔米特 矩阵。这并不能保证矩阵是正定的,只能说明它是一个可能的候选。当 这样的矩阵被分解时,会首先尝试 Cholesky 分解, 如果失败,则使用 LU 分解处理该矩阵。一旦矩阵被分解, matrix_type 将返回矩阵的正确分类。

 
n = norm (A)
n = norm (A, p)
n = norm (A, p, opt)

计算矩阵 A 的 p-范数。

如果未给出第二个参数,则使用 p = 2

如果 A 是矩阵(或稀疏矩阵):

p = 1

1-范数,即 A 的绝对值的最大列和。

p = 2

A 的最大奇异值。

p = Inf"inf"

无穷范数,即 A 的绝对值的最大行和。

p = "fro"

A 的 Frobenius 范数, sqrt (sum (diag (A' * A)))

其他 pp > 1

使得 norm (x, p) == 1 时的最大 norm (A*x, p)

如果 A 是向量或标量:

p = Inf"inf"

max (abs (A))

p = -Inf

min (abs (A))

p = "fro"

A 的 Frobenius 范数,sqrt (sumsq (abs (A)))

p = 0

汉明范数——非零元素的数量。

其他 pp > 1

A 的 p-范数,(sum (abs (A) .^ p)) ^ (1/p)

其他 pp < 1

如上定义的 p-伪范数。

如果 opt 是值 "rows",则将每一行视为向量并 计算其范数。结果以列向量形式返回。 类似地,如果 opt"columns""cols", 则计算每列的范数并返回行向量。

另请参阅:normestnormest1vecnormcondsvd

 
Z = null (A)
Z = null (A, tol)

返回 A 的零空间的标准正交基 Z

零空间 Z 的维度取为 A 的奇异值中不大于 tol 的数量。如果参数 tol 缺失,则计算为

max (size (A)) * max (svd (A, 0)) * eps

另请参阅:orthsvd

 
B = orth (A)
B = orth (A, tol)

返回 A 的值空间的标准正交基。

值空间的维度取为 A 的奇异值中大于 tol 的数量。如果参数 tol 缺失,则计算为

max (size (A)) * max (svd (A)) * eps

另请参阅:null

 
[y, h] = mgorth (x, v)

使用修正的 Gram-Schmidt 方法,将给定的列向量 x 相对于 由 v 的列构成的一组标准正交向量进行正交化。

退出时,y 是一个单位向量,满足:

  norm (y) = 1
  v' * y = 0
  x = [v, y]*h'
 
B = pinv (A)
B = pinv (A, tol)

返回 A 的 Moore-Penrose 伪逆。

小于 tol 的奇异值被忽略。

如果省略第二个参数,则取为

tol = max ([rows(x), columns(x)]) * norm (x) * eps

另请参阅:invldivide

 
k = rank (A)
k = rank (A, tol)

使用奇异值分解计算矩阵 A 的秩。

秩取为 A 的奇异值中大于指定容差 tol 的数量。如果省略第二个参数,则取为

tol = max (size (A)) * sigma(1) * eps;

其中 eps 是机器精度,sigma(1)A 的最大奇异值。

矩阵的秩是线性无关的行或列的数量,等于行空间和列空间的维度。函数 orth 可用于计算列空间的标准正交基。

要测试线性方程组 A*x = b 是否可解,可以使用

rank (A) == rank ([A b])

在这种情况下,x = A \ b 求得一个特解 x。通解是 x 加上矩阵 A 的零空间。函数 null 可用于计算零空间的一组基。

示例:

A = [1 2 3
     4 5 6
     7 8 9];
rank (A)
  ⇒  2

在此示例中,线性无关的行数仅为 2,因为最后一行是前两行的线性组合:

A(3,:) == -A(1,:) + 2 * A(2,:)

另请参阅:nullorthspranksvdeps

 
c = rcond (A)

计算由 LAPACK 返回的倒数条件数的 1-范数估计值。

如果矩阵是良态的,则 c 将接近 1;如果矩阵是病态的,则接近 0。

矩阵 A 不能是稀疏的。如果矩阵是稀疏的,则应改用 condest (A)rcond (full (A))

另请参阅:condcondest

 
t = trace (A)

计算 A 的迹,即主对角线元素之和。

实现很简单:sum (diag (A))

另请参阅:eig

 
r = rref (A)
r = rref (A, tol)
[r, k] = rref (…)

返回 A 的简化行阶梯形。

tol 默认为 eps * max (size (A)) * norm (A, inf)

可选的返回参数 k 包含“绑定变量”的向量,即已执行消元的那些列。

 
n = vecnorm (A)
n = vecnorm (A, p)
n = vecnorm (A, p, dim)

返回数组 A 的元素沿维度 dim 的向量 p-范数。

向量的 p-范数定义为

p-norm (A, p) = (sum (abs (A) .^ p)) ^ (1/p)

输入 p 必须是正标量。如果省略,则默认为 2(欧几里得范数或距离)。p 的其他特殊值有 1(曼哈顿范数,绝对值的和)和 Inf(最大元素的绝对值)。

输入 dim 指定函数操作的数组维度,并且必须是正整数。如果省略,则使用第一个非单一维度。

另请参阅:norm