# orth
适用于矩阵范围的标准正交基
函数库: TyMath
# 语法
Q = orth(A)
Q = orth(A,tol)
# 说明
Q = orth(A) 返回适用于 A 的范围的一个标准正交基。矩阵 Q 的列是涵盖了 A 范围的向量。Q 中列的数量等于 A 的秩。示例
Q = orth(A,tol) 也指定容差。小于 tol 的 A 的奇异值被视为零,这会影响 Q 中的列数。
# 示例
适用于满秩矩阵的基向量
计算并验证适用于满秩矩阵范围的标准正交基向量。
定义一个矩阵并计算它的秩。
using TyMath
using TyBase
A = [1 0 1;-1 -2 0; 0 1 -1]
r = rank(A)
r = 3
由于 A 是一个满秩方阵,orth(A) 计算出的标准正交基与奇异值分解 U,S = svd(A) 中计算出的矩阵 U 一致。原因是 A 的奇异值均为非零值。
使用 orth 计算适用于 A 的范围的标准正交基。
Q = orth(A)
Q = 3×3 Matrix{Float64}:
-0.12 -0.809712 0.574427
0.901753 0.153123 0.404222
-0.415261 0.566498 0.711785
Q 中的列数等于 rank(A)。由于 A 为满秩矩阵,Q 和 A 具有相同的大小。
在合理误差界限内验证基向量 Q 是正交、归一化向量。
E = norm(eye(r)-Q'*Q)
E = 9.230554736292468e-16
误差与 eps() 的量级相当。
秩亏矩阵的基向量
计算并验证适用于秩亏矩阵范围的标准正交基向量。
定义一个奇异矩阵并计算它的秩。
using TyMath
A = [1 0 1; 0 1 0; 1 0 1]
r = rank(A)
r = 2
由于 A 是一个秩亏矩阵,orth(A) 计算出的标准正交基仅与奇异值分解 U,S = svd(A) 中计算出的矩阵 U 的前 r = 2 列一致。原因是 A 的奇异值并不全是非零值。
使用 orth 计算适用于 A 的范围的标准正交基。
Q = orth(A)
Q = 3×2 Matrix{Float64}:
-0.707107 -1.57009e-16
0.0 1.0
-0.707107 1.57009e-16
由于 A 为秩亏矩阵,Q 包含的列比 A 少一个。
指定基向量的容差
当矩阵具有较小的奇异值时,通过指定容差可更改将哪些奇异值视为零。
创建一个 7×7 Hilbert 矩阵。此矩阵为满秩矩阵,但有一些小的奇异值。
using TyMath
H = hilb(7)
H = 7×7 Matrix{Float64}:
1.0 0.5 0.333333 0.25 0.2 0.166667 0.142857
0.5 0.333333 0.25 0.2 0.166667 0.142857 0.125
0.333333 0.25 0.2 0.166667 0.142857 0.125 0.111111
0.25 0.2 0.166667 0.142857 0.125 0.111111 0.1
0.2 0.166667 0.142857 0.125 0.111111 0.1 0.0909091
0.166667 0.142857 0.125 0.111111 0.1 0.0909091 0.0833333
0.142857 0.125 0.111111 0.1 0.0909091 0.0833333 0.0769231
计算适用于 H 的范围的一个标准正交基。由于 H 为满秩矩阵,Q 和 H 具有相同的大小。
Q = orth(H)
Q = 7×7 Matrix{Float64}:
-0.733226 0.623239 0.260843 -0.0751873 0.0159939 -0.00246873 0.000245096
-0.436359 -0.163072 -0.670558 0.526778 -0.227902 0.0617968 -0.00983864
-0.319779 -0.321514 -0.29533 -0.425656 0.628753 -0.348675 0.0951956
-0.254886 -0.357367 0.0230466 -0.461676 -0.200366 0.644687 -0.37132
-0.212844 -0.357068 0.233688 -0.171196 -0.497015 -0.174388 0.68253
-0.183143 -0.34457 0.367876 0.182664 -0.184871 -0.543628 -0.591035
-0.16094 -0.328135 0.452349 0.509755 0.480756 0.364742 0.194406
现在,再次计算标准正交基向量,但指定容差为 1e-4。此容差使 orth 将三个奇异值视为零,因此标准正交基只有四列。
Qtol = orth(H,1e-4)
Qtol = 7×4 Matrix{Float64}:
-0.733226 0.623239 0.260843 -0.0751873
-0.436359 -0.163072 -0.670558 0.526778
-0.319779 -0.321514 -0.29533 -0.425656
-0.254886 -0.357367 0.0230466 -0.461676
-0.212844 -0.357068 0.233688 -0.171196
-0.183143 -0.34457 0.367876 0.182664
-0.16094 -0.328135 0.452349 0.509755
# 输入参数
A — 输入矩阵矩阵
输入矩阵。
复数支持: 是
tol — 奇异值容差标量
奇异值容差,指定为实数标量。小于容差的 A 的奇异值被视为零,这会影响 orth 返回的列空间向量的数目。默认容差是 max(size(A)...) * eps()。
# 输出参数
Q - 正交基向量矩阵
正交基向量,以矩形形式返回。
# 局限性
ARM 架构
如果处理器(CPU)为 ARM 架构,可能会观察到输出矩阵 Q 中的某些列向量与预期的方向相反。这种情况是由于正交化过程中,对于每个向量 v,其反向量 −v 同样满足单位长度和与其他向量正交的条件,这些向量仍然正确地表示了原始矩阵的列空间的一组标准正交基,所以不会影响最终生成的基向量集合所张成的空间。
如果确实需要控制向量的方向,可以检查输出并根据具体需求手动调整向量的符号。
# 详细信息
范围
矩阵 A 的列空间,或范围,是 A 中各列的所有线性组合的集合。作为线性方程 A*x = b 的解,任何向量 b 均包含在 A 的范围内,因为您还可以将它写作 A 中各列的线性组合。
秩
矩阵的 rank 等于范围的维数,也等于非零奇异值的个数。
# 算法
根据奇异值分解 U,S = svd(A) 中的 U 获得 A 的范围的标准正交基。如果 r = rank(A,tol),则 U 的前 r 列构成一个适用于 A 的范围的标准正交基。