Linear Algebra
除了(并作为)对多维数组的支持,Julia 提供了许多常见且有用的线性代数操作的原生实现,可以通过 using LinearAlgebra
加载。基本操作,如 tr
、det
和 inv
都得到了支持:
julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
1 2 3
4 1 6
7 8 1
julia> tr(A)
3
julia> det(A)
104.0
julia> inv(A)
3×3 Matrix{Float64}:
-0.451923 0.211538 0.0865385
0.365385 -0.192308 0.0576923
0.240385 0.0576923 -0.0673077
以及其他有用的操作,例如寻找特征值或特征向量:
julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
-4.0 -17.0
2.0 2.0
julia> eigvals(A)
2-element Vector{ComplexF64}:
-1.0 - 5.0im
-1.0 + 5.0im
julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
0.945905-0.0im 0.945905+0.0im
-0.166924+0.278207im -0.166924-0.278207im
此外,Julia 提供了许多 factorizations,可以用来加速线性求解或矩阵指数运算等问题,通过将矩阵预先因式分解为更适合(出于性能或内存原因)该问题的形式。有关更多信息,请参见 factorize
的文档。作为一个例子:
julia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
3.0 -1.0 -6.0
-10.0 2.3 4.0
julia> factorize(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.15 1.0 0.0
-0.3 -0.132196 1.0
U factor:
3×3 Matrix{Float64}:
-10.0 2.3 4.0
0.0 2.345 -3.4
0.0 0.0 -5.24947
由于 A
不是厄米的、对称的、三角形的、三对角的或双对角的,LU 分解可能是我们能做的最好的选择。与之比较:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> factorize(B)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
3×3 Tridiagonal{Float64, Vector{Float64}}:
-1.64286 0.0 ⋅
0.0 -2.8 0.0
⋅ 0.0 5.0
U factor:
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.142857 -0.8
⋅ 1.0 -0.6
⋅ ⋅ 1.0
permutation:
3-element Vector{Int64}:
1
2
3
在这里,Julia 能够检测到 B
实际上是对称的,并使用了更合适的分解。通常,对于已知具有某些属性的矩阵,例如它是对称的或三对角的,可以编写更高效的代码。Julia 提供了一些特殊类型,以便您可以“标记”矩阵具有这些属性。例如:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
sB
已被标记为一个(实)对称矩阵,因此在我们可能对其执行的后续操作中,例如特征分解或计算矩阵-向量乘积,通过仅引用其一半可以找到效率。例如:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> x = [1; 2; 3]
3-element Vector{Int64}:
1
2
3
julia> sB\x
3-element Vector{Float64}:
-1.7391304347826084
-1.1086956521739126
-1.4565217391304346
\
操作在这里执行线性解。左除法运算符非常强大,编写紧凑、可读的代码很容易,这些代码足够灵活,可以解决各种线性方程组。
Special matrices
Matrices with special symmetries and structures 在线性代数中经常出现,并且通常与各种矩阵分解相关。Julia 具有丰富的特殊矩阵类型集合,这些类型允许使用专门为特定矩阵类型开发的专用例程进行快速计算。
以下表格总结了在Julia中实现的特殊矩阵类型,以及是否提供了对LAPACK中各种优化方法的钩子。
Type | Description |
---|---|
Symmetric | Symmetric matrix |
Hermitian | Hermitian matrix |
UpperTriangular | Upper triangular matrix |
UnitUpperTriangular | Upper triangular matrix with unit diagonal |
LowerTriangular | Lower triangular matrix |
UnitLowerTriangular | Lower triangular matrix with unit diagonal |
UpperHessenberg | Upper Hessenberg matrix |
Tridiagonal | Tridiagonal matrix |
SymTridiagonal | Symmetric tridiagonal matrix |
Bidiagonal | Upper/lower bidiagonal matrix |
Diagonal | Diagonal matrix |
UniformScaling | Uniform scaling operator |
Elementary operations
Matrix type | + | - | * | \ | Other functions with optimized methods |
---|---|---|---|---|---|
Symmetric | MV | inv , sqrt , cbrt , exp | |||
Hermitian | MV | inv , sqrt , cbrt , exp | |||
UpperTriangular | MV | MV | inv , det , logdet | ||
UnitUpperTriangular | MV | MV | inv , det , logdet | ||
LowerTriangular | MV | MV | inv , det , logdet | ||
UnitLowerTriangular | MV | MV | inv , det , logdet | ||
UpperHessenberg | MM | inv , det | |||
SymTridiagonal | M | M | MS | MV | eigmax , eigmin |
Tridiagonal | M | M | MS | MV | |
Bidiagonal | M | M | MS | MV | |
Diagonal | M | M | MV | MV | inv , det , logdet , / |
UniformScaling | M | M | MVS | MVS | / |
传奇:
Key | Description |
---|---|
M (matrix) | An optimized method for matrix-matrix operations is available |
V (vector) | An optimized method for matrix-vector operations is available |
S (scalar) | An optimized method for matrix-scalar operations is available |
Matrix factorizations
Matrix type | LAPACK | eigen | eigvals | eigvecs | svd | svdvals |
---|---|---|---|---|---|---|
Symmetric | SY | ARI | ||||
Hermitian | HE | ARI | ||||
UpperTriangular | TR | A | A | A | ||
UnitUpperTriangular | TR | A | A | A | ||
LowerTriangular | TR | A | A | A | ||
UnitLowerTriangular | TR | A | A | A | ||
SymTridiagonal | ST | A | ARI | AV | ||
Tridiagonal | GT | |||||
Bidiagonal | BD | A | A | |||
Diagonal | DI | A |
传奇:
Key | Description | Example |
---|---|---|
A (all) | An optimized method to find all the characteristic values and/or vectors is available | e.g. eigvals(M) |
R (range) | An optimized method to find the il th through the ih th characteristic values are available | eigvals(M, il, ih) |
I (interval) | An optimized method to find the characteristic values in the interval [vl , vh ] is available | eigvals(M, vl, vh) |
V (vectors) | An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is available | eigvecs(M, x) |
The uniform scaling operator
一个 UniformScaling
运算符表示一个标量乘以单位运算符,λ*I
。单位运算符 I
被定义为一个常量,并且是 UniformScaling
的一个实例。这些运算符的大小是通用的,并且与二元运算中的其他矩阵匹配 +
,-
,*
和 \
。对于 A+I
和 A-I
来说,这意味着 A
必须是方阵。与单位运算符 I
的乘法是一个无操作(除了检查缩放因子是否为一),因此几乎没有开销。
要查看 UniformScaling
运算符的实际效果:
julia> U = UniformScaling(2);
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> a + U
2×2 Matrix{Int64}:
3 2
3 6
julia> a * U
2×2 Matrix{Int64}:
2 4
6 8
julia> [a U]
2×4 Matrix{Int64}:
1 2 2 0
3 4 0 2
julia> b = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> b - U
ERROR: DimensionMismatch: matrix is not square: dimensions are (2, 3)
Stacktrace:
[...]
如果您需要解决许多形式为 (A+μI)x = b
的系统,其中 A
相同而 μ
不同,首先通过 hessenberg
函数计算 A
的 Hessenberg 分解 F
可能是有益的。给定 F
,Julia 使用一种高效的算法来计算 (F+μ*I) \ b
(等价于 (A+μ*I)x \ b
)以及相关操作,如行列式。
Matrix factorizations
Matrix factorizations (a.k.a. matrix decompositions) 计算矩阵的因式分解为矩阵的乘积,是(数值)线性代数中的核心概念之一。
以下表格总结了在 Julia 中实现的矩阵分解类型。有关其相关方法的详细信息,请参阅线性代数文档中的 Standard functions 部分。
Type | Description |
---|---|
BunchKaufman | Bunch-Kaufman factorization |
Cholesky | Cholesky factorization |
CholeskyPivoted | Pivoted Cholesky factorization |
LDLt | LDL(T) factorization |
LU | LU factorization |
QR | QR factorization |
QRCompactWY | Compact WY form of the QR factorization |
QRPivoted | Pivoted QR factorization |
LQ | QR factorization of transpose(A) |
Hessenberg | Hessenberg decomposition |
Eigen | Spectral decomposition |
GeneralizedEigen | Generalized spectral decomposition |
SVD | Singular value decomposition |
GeneralizedSVD | Generalized SVD |
Schur | Schur decomposition |
GeneralizedSchur | Generalized Schur decomposition |
Factorization
对象的伴随和转置被懒惰地封装在 AdjointFactorization
和 TransposeFactorization
对象中。一般来说,实数 Factorization
的转置被封装为 AdjointFactorization
。
Orthogonal matrices (AbstractQ
)
某些矩阵分解生成正交/单位“矩阵”因子。这些分解包括从调用 qr
获得的与 QR 相关的分解,即 QR
、QRCompactWY
和 QRPivoted
,从调用 hessenberg
获得的 Hessenberg 分解,以及从 lq
获得的 LQ 分解。虽然这些正交/单位因子可以有矩阵表示,但出于性能和内存原因,它们的内部表示是不同的。因此,它们应该被视为基于矩阵的、基于函数的线性算子。特别是,读取其矩阵表示的某一列需要运行“矩阵”-向量乘法代码,而不是简单地从内存中读取数据(可能会用结构零填充向量的部分)。与其他非三角矩阵类型的另一个明显区别是,底层乘法代码允许在乘法过程中进行就地修改。此外,特定 AbstractQ
子类型的对象,如通过 4d61726b646f776e2e436f64652822222c202271722229_40726566
、4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566
和 4d61726b646f776e2e436f64652822222c20226c712229_40726566
创建的对象,可以根据上下文表现得像一个方阵或一个矩形矩阵:
julia> using LinearAlgebra
julia> Q = qr(rand(3,2)).Q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
julia> Matrix(Q)
3×2 Matrix{Float64}:
-0.320597 0.865734
-0.765834 -0.475694
-0.557419 0.155628
julia> Q*I
3×3 Matrix{Float64}:
-0.320597 0.865734 -0.384346
-0.765834 -0.475694 -0.432683
-0.557419 0.155628 0.815514
julia> Q*ones(2)
3-element Vector{Float64}:
0.5451367118802273
-1.241527373086654
-0.40179067589600226
julia> Q*ones(3)
3-element Vector{Float64}:
0.16079054743832022
-1.674209978965636
0.41372375588835797
julia> ones(1,2) * Q'
1×3 Matrix{Float64}:
0.545137 -1.24153 -0.401791
julia> ones(1,3) * Q'
1×3 Matrix{Float64}:
0.160791 -1.67421 0.413724
由于与稠密或结构化矩阵的区别,抽象类型 AbstractQ
并不属于 AbstractMatrix
的子类型,而是有其自己的类型层次结构。子类型化 AbstractQ
的自定义类型可以依赖于通用的后备选项,只要满足以下接口。例如,对于
struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
# required fields
end
提供重载以便于
Base.size(Q::MyQ) # size of corresponding square matrix representation
Base.convert(::Type{AbstractQ{T}}, Q::MyQ) # eltype promotion [optional]
LinearAlgebra.lmul!(Q::MyQ, x::AbstractVecOrMat) # left-multiplication
LinearAlgebra.rmul!(A::AbstractMatrix, Q::MyQ) # right-multiplication
如果 eltype
提升不是重点,那么 convert
方法就是不必要的,因为默认情况下 convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})
返回的就是 Q
本身。AbstractQ
类型对象的伴随是懒惰地包装在 AdjointQ
包装类型中,这需要其自己的 LinearAlgebra.lmul!
和 LinearAlgebra.rmul!
方法。考虑到这一组方法,任何 Q::MyQ
都可以像矩阵一样使用,最好是在乘法上下文中:通过 *
与标量、向量和矩阵进行左右乘法,通过 Matrix(Q)
(或 Q*I
)获取 Q
的矩阵表示,并对矩阵表示进行索引等操作都可以正常工作。相比之下,矩阵表示中的加法和减法以及更一般的元素广播会失败,因为那样效率极低。对于这种用例,考虑提前计算矩阵表示并缓存以供将来重用。
Pivoting Strategies
朱莉亚的几个 matrix factorizations 支持 pivoting,这可以用来提高它们的数值稳定性。事实上,一些矩阵分解,例如 LU 分解,可能在没有主元的情况下失败。
In pivoting, first, a pivot element with good numerical properties is chosen based on a pivoting strategy. Next, the rows and columns of the original matrix are permuted to bring the chosen element in place for subsequent computation. Furthermore, the process is repeated for each stage of the factorization.
因此,除了常规的矩阵因子外,枢轴分解方案的输出还包括置换矩阵。
在下面,简要描述了在 Julia 中实现的主元策略。请注意,并非所有矩阵分解都可能支持它们。有关支持的主元策略的详细信息,请查阅相应的 matrix factorization 文档。
另请参见 LinearAlgebra.ZeroPivotException
。
LinearAlgebra.NoPivot
— TypeNoPivot
不进行主元选择。没有主元选择的矩阵分解,例如 LU 分解,可能会失败,并且在浮点矩阵面临舍入误差时可能也会在数值上不稳定。这个主元策略主要用于教学目的。
LinearAlgebra.RowNonZero
— TypeRowNonZero
剩余行中的第一个非零元素被选为主元。
请注意,对于浮点矩阵,结果 LU 算法在数值上是不稳定的——这种策略主要用于与手动计算(通常使用这种策略)进行比较,或用于其他不易受到舍入误差影响的代数类型(例如有理数)。否则,在高斯消元中通常应优先使用默认的 RowMaximum
主元策略。
请注意,矩阵的 element type 必须支持 iszero
方法。
LinearAlgebra.RowMaximum
— TypeLinearAlgebra.ColumnNorm
— TypeStandard functions
线性代数函数在 Julia 中主要通过调用 LAPACK 的函数来实现。稀疏矩阵分解调用来自 SuiteSparse 的函数。其他稀疏求解器作为 Julia 包可用。
Base.:*
— Method*(A::AbstractMatrix, B::AbstractMatrix)
矩阵乘法。
示例
julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
2 1
1 1
Base.:*
— Method*(A, B::AbstractMatrix, C)
A * B * C * D
3个或4个矩阵的链式乘法是根据数组的大小以最有效的顺序进行的。也就是说,比较(A * B) * C
(使用3个稠密矩阵)所需的标量乘法次数与A * (B * C)
所需的次数,以选择执行其中的一个。
如果最后一个因子是一个向量,或者第一个是一个转置向量,那么优先处理这些是高效的。特别是x' * B * y
意味着对于普通的列主序B::Matrix
,它表示(x' * B) * y
。与dot(x, B, y)
不同,这会分配一个中间数组。
如果第一个或最后一个因子是一个数字,这将与矩阵乘法融合,使用5个参数的mul!
。
这些优化至少需要Julia 1.7。
Base.:\
— Method\(A, B)
使用多算法进行矩阵除法。对于输入矩阵 A
和 B
,结果 X
满足 A*X == B
当 A
为方阵时。所使用的求解器取决于 A
的结构。如果 A
是上三角或下三角(或对角)矩阵,则不需要对 A
进行因式分解,系统通过前向或后向替代法求解。对于非三角形的方阵,使用 LU 因式分解。
对于矩形的 A
,结果是通过对 A
进行带主元的 QR 因式分解和基于 R 因子的 A
的秩估计计算的最小范数最小二乘解。
当 A
是稀疏矩阵时,使用类似的多算法。对于不定矩阵,LDLt
因式分解在数值因式分解过程中不使用主元,因此即使对于可逆矩阵,该过程也可能失败。
示例
julia> A = [1 0; 1 -2]; B = [32; -4];
julia> X = A \ B
2-element Vector{Float64}:
32.0
18.0
julia> A * X == B
true
Base.:/
— MethodA / B
矩阵右除法:A / B
等价于 (B' \ A')'
,其中 \
是左除法运算符。对于方阵,结果 X
满足 A == X*B
。
另见:rdiv!
。
示例
julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];
julia> X = A / B
2×3 Matrix{Float64}:
-0.65 3.75 -1.2
3.25 -2.75 1.0
julia> isapprox(A, X*B)
true
julia> isapprox(X, A*pinv(B))
true
LinearAlgebra.SingularException
— TypeSingularException
当输入矩阵具有一个或多个零值特征值且不可逆时抛出异常。涉及此类矩阵的线性求解无法计算。info
字段指示(其中一个)奇异值的位置。
LinearAlgebra.PosDefException
— TypePosDefException
当输入矩阵不是正定时抛出异常。一些线性代数函数和分解仅适用于正定矩阵。info
字段指示小于或等于0的特征值之一的位置。
LinearAlgebra.ZeroPivotException
— TypeZeroPivotException <: Exception
当矩阵分解/求解在主元(对角线)位置遇到零并无法继续时,会抛出此异常。这可能并不意味着矩阵是奇异的:切换到其他分解方法(例如可以重新排序变量以消除虚假零主元的带主元的LU分解)可能是有益的。info
字段指示(一个)零主元的位置。
LinearAlgebra.RankDeficientException
— TypeRankDeficientException
当输入矩阵是 秩缺陷 时抛出异常。一些线性代数函数,例如 Cholesky 分解,仅适用于非秩缺陷的矩阵。info
字段指示矩阵的计算秩。
LinearAlgebra.LAPACKException
— TypeLAPACK异常
在直接调用LAPACK函数或调用其他内部使用LAPACK函数但缺乏专门错误处理的函数时抛出的通用LAPACK异常。info
字段包含有关基础错误的附加信息,并取决于被调用的LAPACK函数。
LinearAlgebra.dot
— Functiondot(x, y)
x ⋅ y
计算两个向量之间的点积。对于复向量,第一个向量是共轭的。
dot
也适用于任意可迭代对象,包括任何维度的数组,只要在元素上定义了 dot
。
dot
在语义上等价于 sum(dot(vx,vy) for (vx,vy) in zip(x, y))
,但增加了参数必须具有相等长度的限制。
x ⋅ y
(其中 ⋅
可以通过在 REPL 中输入 \cdot
后按 Tab 键来输入)是 dot(x, y)
的同义词。
示例
julia> dot([1; 1], [2; 3])
5
julia> dot([im; im], [1; 1])
0 - 2im
julia> dot(1:5, 2:6)
70
julia> x = fill(2., (5,5));
julia> y = fill(3., (5,5));
julia> dot(x, y)
150.0
LinearAlgebra.dot
— Methoddot(x, A, y)
计算两个向量 x
和 y
之间的广义点积 dot(x, A*y)
,而不存储中间结果 A*y
。与两个参数的 dot(_,_)
一样,这个操作是递归的。此外,对于复数向量,第一个向量会被共轭。
三个参数的 dot
至少需要 Julia 1.4。
示例
julia> dot([1; 1], [1 2; 3 4], [2; 3])
26
julia> dot(1:5, reshape(1:25, 5, 5), 2:6)
4850
julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6)
true
LinearAlgebra.cross
— Functioncross(x, y)
×(x,y)
计算两个三维向量的叉积。
示例
julia> a = [0;1;0]
3-element Vector{Int64}:
0
1
0
julia> b = [0;0;1]
3-element Vector{Int64}:
0
0
1
julia> cross(a,b)
3-element Vector{Int64}:
1
0
0
LinearAlgebra.axpy!
— Functionaxpy!(α, x::AbstractArray, y::AbstractArray)
用 x * α + y
覆盖 y
并返回 y
。如果 x
和 y
具有相同的轴,则等价于 y .+= x .* a
。
示例
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpy!(2, x, y)
3-element Vector{Int64}:
6
9
12
LinearAlgebra.axpby!
— Functionaxpby!(α, x::AbstractArray, β, y::AbstractArray)
用 x * α + y * β
覆盖 y
并返回 y
。如果 x
和 y
具有相同的轴,则等价于 y .= x .* a .+ y .* β
。
示例
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
10
14
18
LinearAlgebra.rotate!
— Functionrotate!(x, y, c, s)
用 c*x + s*y
覆盖 x
,用 -conj(s)*x + c*y
覆盖 y
。返回 x
和 y
。
rotate!
至少需要 Julia 1.5。
LinearAlgebra.reflect!
— Functionreflect!(x, y, c, s)
用 c*x + s*y
覆盖 x
,用 conj(s)*x - c*y
覆盖 y
。返回 x
和 y
。
reflect!
至少需要 Julia 1.5。
LinearAlgebra.factorize
— Functionfactorize(A)
计算 A
的一个方便的分解,基于输入矩阵的类型。factorize
检查 A
以确定它是否是对称/三角形等,如果 A
作为通用矩阵传递。factorize
检查 A
的每个元素以验证/排除每个属性。它会在能够排除对称性/三角形结构时立即短路。返回值可以重复使用,以高效地解决多个系统。例如:A=factorize(A); x=A\b; y=A\C
。
A 的属性 | 分解类型 |
---|---|
正定 | Cholesky (见 cholesky ) |
密集对称/厄米 | Bunch-Kaufman (见 bunchkaufman ) |
稀疏对称/厄米 | LDLt (见 ldlt ) |
三角形 | 三角形 |
对角形 | 对角形 |
双对角 | 双对角 |
三对角 | LU (见 lu ) |
对称实三对角 | LDLt (见 ldlt ) |
一般方形 | LU (见 lu ) |
一般非方形 | QR (见 qr ) |
例如,如果在一个厄米正定矩阵上调用 factorize
,那么 factorize
将返回一个 Cholesky 分解。
示例
julia> A = Array(Bidiagonal(fill(1.0, (5, 5)), :U))
5×5 Matrix{Float64}:
1.0 1.0 0.0 0.0 0.0
0.0 1.0 1.0 0.0 0.0
0.0 0.0 1.0 1.0 0.0
0.0 0.0 0.0 1.0 1.0
0.0 0.0 0.0 0.0 1.0
julia> factorize(A) # factorize 将检查 A 是否已经被分解
5×5 Bidiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅ ⋅ ⋅
⋅ 1.0 1.0 ⋅ ⋅
⋅ ⋅ 1.0 1.0 ⋅
⋅ ⋅ ⋅ 1.0 1.0
⋅ ⋅ ⋅ ⋅ 1.0
这返回一个 5×5 Bidiagonal{Float64}
,现在可以传递给其他线性代数函数(例如特征求解器),这些函数将使用针对 Bidiagonal
类型的专门方法。
LinearAlgebra.Diagonal
— TypeDiagonal(V::AbstractVector)
构造一个以 V
为对角线的惰性矩阵。
另请参见 UniformScaling
用于惰性单位矩阵 I
,diagm
用于创建稠密矩阵,以及 diag
用于提取对角元素。
示例
julia> d = Diagonal([1, 10, 100])
3×3 Diagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅
⋅ 10 ⋅
⋅ ⋅ 100
julia> diagm([7, 13])
2×2 Matrix{Int64}:
7 0
0 13
julia> ans + I
2×2 Matrix{Int64}:
8 0
0 14
julia> I(2)
2×2 Diagonal{Bool, Vector{Bool}}:
1 ⋅
⋅ 1
!!! 注意 一列矩阵不会被视为向量,而是调用方法 Diagonal(A::AbstractMatrix)
,该方法提取 1 元素 diag(A)
:
julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) with eltype Float64:
7.0
13.0
julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
7.0
对角线(A::AbstractMatrix)
从 A
的主对角线构造一个矩阵。输入矩阵 A
可以是矩形的,但输出将是方形的。
示例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> D = Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 4
julia> A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 5
Diagonal{T}(undef, n)
构造一个未初始化的长度为 n
的 Diagonal{T}
。请参见 undef
。
LinearAlgebra.Bidiagonal
— TypeBidiagonal(dv::V, ev::V, uplo::Symbol) where V <: AbstractVector
使用给定的对角线 (dv
) 和副对角线 (ev
) 向量构造一个上三角 (uplo=:U
) 或下三角 (uplo=:L
) 的双对角矩阵。结果是 Bidiagonal
类型,并提供高效的专用线性求解器,但可以通过 convert(Array, _)
(或简写为 Array(_)
)转换为常规矩阵。ev
的长度必须比 dv
的长度少一个。
示例
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> Bu = Bidiagonal(dv, ev, :U) # ev 在第一个超对角线上
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev 在第一个下对角线上
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
7 2 ⋅ ⋅
⋅ 8 3 ⋅
⋅ ⋅ 9 4
Bidiagonal(A, uplo::Symbol)
从 A
的主对角线及其第一个超对角线(如果 uplo=:U
)或下对角线(如果 uplo=:L
)构造一个 Bidiagonal
矩阵。
示例
julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
4×4 Matrix{Int64}:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
julia> Bidiagonal(A, :U) # 包含 A 的主对角线和第一个超对角线
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # 包含 A 的主对角线和第一个下对角线
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonal
— TypeSymTridiagonal(dv::V, ev::V) where V <: AbstractVector
从对角线(dv
)和第一条下/上对角线(ev
)构造一个对称三对角矩阵。结果是 SymTridiagonal
类型,并提供高效的专用特征值求解器,但可以通过 convert(Array, _)
(或简写为 Array(_)
)转换为常规矩阵。
对于 SymTridiagonal
块矩阵,dv
的元素被对称化。参数 ev
被解释为上对角线。下对角线的块是相应上对角线块的(物化)转置。
示例
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> SymTridiagonal(dv, ev)
4×4 SymTridiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
7 2 8 ⋅
⋅ 8 3 9
⋅ ⋅ 9 4
julia> A = SymTridiagonal(fill([1 2; 3 4], 3), fill([1 2; 3 4], 2));
julia> A[1,1]
2×2 Symmetric{Int64, Matrix{Int64}}:
1 2
2 4
julia> A[1,2]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[2,1]
2×2 Matrix{Int64}:
1 3
2 4
SymTridiagonal(A::AbstractMatrix)
从对称矩阵 A
的对角线和第一个超对角线构造一个对称三对角矩阵。
示例
julia> A = [1 2 3; 2 4 5; 3 5 6]
3×3 Matrix{Int64}:
1 2 3
2 4 5
3 5 6
julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
1 2 ⋅
2 4 5
⋅ 5 6
julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);
julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
[1 2; 2 3] [1 3; 2 4]
[1 2; 3 4] [1 2; 2 3]
LinearAlgebra.Tridiagonal
— TypeTridiagonal(dl::V, d::V, du::V) where V <: AbstractVector
从第一个下对角线、对角线和第一个上对角线分别构造一个三对角矩阵。结果是 Tridiagonal
类型,并提供高效的专用线性求解器,但可以通过 convert(Array, _)
(或简写为 Array(_)
)转换为常规矩阵。dl
和 du
的长度必须比 d
的长度少一。
下对角线 dl
和上对角线 du
不能相互别名。如果检测到别名,构造函数将使用 du
的副本作为其参数。
示例
julia> dl = [1, 2, 3];
julia> du = [4, 5, 6];
julia> d = [7, 8, 9, 0];
julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
7 4 ⋅ ⋅
1 8 5 ⋅
⋅ 2 9 6
⋅ ⋅ 3 0
Tridiagonal(A)
从矩阵 A
的第一个下对角线、对角线和第一个上对角线构造一个三对角矩阵。
示例
julia> A = [1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
4×4 Matrix{Int64}:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
1 2 ⋅ ⋅
1 2 3 ⋅
⋅ 2 3 4
⋅ ⋅ 3 4
LinearAlgebra.Symmetric
— TypeSymmetric(A::AbstractMatrix, uplo::Symbol=:U)
构造矩阵 A
的上三角(如果 uplo = :U
)或下三角(如果 uplo = :L
)的 Symmetric
视图。
Symmetric
视图主要用于实对称矩阵,对于这些矩阵,专门的算法(例如特征问题)可以为 Symmetric
类型启用。更一般地,参见 Hermitian(A)
用于厄米矩阵 A == A'
,这在实矩阵中实际上等同于 Symmetric
,但对于复矩阵也很有用。(而复 Symmetric
矩阵受到支持,但几乎没有任何专门的算法。)
要计算实矩阵的对称部分,或更一般地,实或复矩阵 A
的厄米部分 (A + A') / 2
,请使用 hermitianpart
。
示例
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> Supper = Symmetric(A)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 2 3
2 5 6
3 6 9
julia> Slower = Symmetric(A, :L)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 4 7
4 5 8
7 8 9
julia> hermitianpart(A)
3×3 Hermitian{Float64, Matrix{Float64}}:
1.0 3.0 5.0
3.0 5.0 7.0
5.0 7.0 9.0
请注意,除非 A
本身是对称的(例如,如果 A == transpose(A)
),否则 Supper
将不等于 Slower
。
LinearAlgebra.Hermitian
— TypeHermitian(A::AbstractMatrix, uplo::Symbol=:U)
构造一个 Hermitian
视图,表示矩阵 A
的上三角(如果 uplo = :U
)或下三角(如果 uplo = :L
)。
要计算 A
的 Hermitian 部分,请使用 hermitianpart
。
示例
julia> A = [1 2+2im 3-3im; 4 5 6-6im; 7 8+8im 9]
3×3 Matrix{Complex{Int64}}:
1+0im 2+2im 3-3im
4+0im 5+0im 6-6im
7+0im 8+8im 9+0im
julia> Hupper = Hermitian(A)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
1+0im 2+2im 3-3im
2-2im 5+0im 6-6im
3+3im 6+6im 9+0im
julia> Hlower = Hermitian(A, :L)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
1+0im 4+0im 7+0im
4+0im 5+0im 8-8im
7+0im 8+8im 9+0im
julia> hermitianpart(A)
3×3 Hermitian{ComplexF64, Matrix{ComplexF64}}:
1.0+0.0im 3.0+1.0im 5.0-1.5im
3.0-1.0im 5.0+0.0im 7.0-7.0im
5.0+1.5im 7.0+7.0im 9.0+0.0im
请注意,除非 A
本身是 Hermitian(例如,如果 A == adjoint(A)
),否则 Hupper
将不等于 Hlower
。
对角线的所有非实部将被忽略。
Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular
— TypeLowerTriangular(A::AbstractMatrix)
构造矩阵 A
的 LowerTriangular
视图。
示例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 5.0 ⋅
7.0 8.0 9.0
LinearAlgebra.UpperTriangular
— TypeUpperTriangular(A::AbstractMatrix)
构造矩阵 A
的 UpperTriangular
视图。
示例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 5.0 6.0
⋅ ⋅ 9.0
LinearAlgebra.UnitLowerTriangular
— TypeUnitLowerTriangular(A::AbstractMatrix)
构造矩阵 A
的 UnitLowerTriangular
视图。这样的视图在其对角线上具有 A
的 eltype
的 oneunit
。
示例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 1.0 ⋅
7.0 8.0 1.0
LinearAlgebra.UnitUpperTriangular
— TypeUnitUpperTriangular(A::AbstractMatrix)
构造矩阵 A
的 UnitUpperTriangular
视图。这样的视图在其对角线上具有 A
的 eltype
的 oneunit
。
示例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 1.0 6.0
⋅ ⋅ 1.0
LinearAlgebra.UpperHessenberg
— TypeUpperHessenberg(A::AbstractMatrix)
构造矩阵 A
的 UpperHessenberg
视图。A
中第一副对角线以下的条目将被忽略。
此类型在 Julia 1.3 中添加。
为 H \ b
、det(H)
和类似操作实现了高效算法。
另请参见 hessenberg
函数,以将任何矩阵分解为类似的上Hessenberg矩阵。
如果 F::Hessenberg
是分解对象,则可以通过 F.Q
访问单位矩阵,通过 F.H
访问Hessenberg矩阵。当提取 Q
时,结果类型为 HessenbergQ
对象,并且可以通过 convert(Array, _)
(或简写为 Array(_)
)转换为常规矩阵。
迭代分解会产生因子 F.Q
和 F.H
。
示例
julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
1 2 3 4
5 6 7 8
⋅ 10 11 12
⋅ ⋅ 15 16
LinearAlgebra.UniformScaling
— TypeUniformScaling{T<:Number}
定义为标量乘以单位算子的通用大小均匀缩放算子,λ*I
。尽管没有明确的 size
,在许多情况下它的行为类似于矩阵,并且支持某些索引。另见 I
。
从 Julia 1.6 开始,支持使用范围进行索引。
示例
julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> J*A
2×2 Matrix{Float64}:
2.0 4.0
6.0 8.0
julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
LinearAlgebra.I
— ConstantI
一个类型为 UniformScaling
的对象,表示任意大小的单位矩阵。
示例
julia> fill(1, (5,6)) * I == fill(1, (5,6))
true
julia> [1 2im 3; 1im 2 3] * I
2×3 矩阵{复数{Int64}}:
1+0im 0+2im 3+0im
0+1im 2+0im 3+0im
LinearAlgebra.UniformScaling
— Method(I::UniformScaling)(n::Integer)
从 UniformScaling
构造一个 Diagonal
矩阵。
此方法自 Julia 1.2 起可用。
示例
julia> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
1 ⋅ ⋅
⋅ 1 ⋅
⋅ ⋅ 1
julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
0.7 ⋅ ⋅
⋅ 0.7 ⋅
⋅ ⋅ 0.7
LinearAlgebra.Factorization
— TypeLinearAlgebra.LU
— TypeLU <: Factorization
矩阵分解类型的 LU
分解一个方阵 A
。这是 lu
的返回类型,对应的矩阵分解函数。
可以通过 getproperty
访问分解 F::LU
的各个组成部分:
组件 | 描述 |
---|---|
F.L | L (单位下三角)部分的 LU |
F.U | U (上三角)部分的 LU |
F.p | (右)置换 Vector |
F.P | (右)置换 Matrix |
迭代分解会产生组件 F.L
、F.U
和 F.p
。
示例
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # 通过迭代解构
julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.lu
— Functionlu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU
计算稀疏矩阵 A
的 LU 分解。
对于元素类型为实数或复数的稀疏 A
,返回类型 F
为 UmfpackLU{Tv, Ti}
,其中 Tv
= Float64
或 ComplexF64
,而 Ti
是整数类型(Int32
或 Int64
)。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
置换 q
可以是一个置换向量或 nothing
。如果未提供置换向量或 q
为 nothing
,则使用 UMFPACK 的默认值。如果置换不是零基的,则会制作一个零基的副本。
control
向量默认为 Julia SparseArrays 包的 UMFPACK 默认配置(注意:这已从 UMFPACK 默认值修改,以禁用迭代精炼),但可以通过传递长度为 UMFPACK_CONTROL
的向量进行更改,具体配置请参见 UMFPACK 手册。例如,要重新启用迭代精炼:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # 读取 Float64 稀疏矩阵的 Julia 默认配置
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # 可选 - 显示值
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # 重新启用迭代精炼(2 是 UMFPACK 默认的最大迭代精炼步骤)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # 解 Ax = b,包括 UMFPACK 迭代精炼
可以通过索引访问分解 F
的各个组件:
组件 | 描述 |
---|---|
L | LU 的 L (下三角)部分 |
U | LU 的 U (上三角)部分 |
p | 右置换 Vector |
q | 左置换 Vector |
Rs | 缩放因子的 Vector |
: | (L,U,p,q,Rs) 组件 |
F
和 A
之间的关系为
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
进一步支持以下函数:
另见 lu!
lu(A::AbstractSparseMatrixCSC)
使用的是 UMFPACK[ACM832] 库,该库是 SuiteSparse 的一部分。由于该库仅支持元素为 Float64
或 ComplexF64
的稀疏矩阵,lu
会将 A
转换为类型为 SparseMatrixCSC{Float64}
或 SparseMatrixCSC{ComplexF64}
的副本。
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
计算 A
的 LU 分解。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
默认情况下,当 check = true
时,如果分解产生有效因子,但上三角因子 U
的秩不足,也会抛出错误。可以通过传递 allowsingular = true
来更改此行为。
在大多数情况下,如果 A
是 AbstractMatrix{T}
的子类型 S
,且元素类型 T
支持 +
、-
、*
和 /
,则返回类型为 LU{T,S{T}}
。
一般来说,LU 分解涉及对矩阵行的排列(对应于下面描述的 F.p
输出),称为“主元选择”(因为它对应于选择哪个行包含“主元”,即 F.U
的对角元素)。可以通过可选的 pivot
参数选择以下主元选择策略:
RowMaximum()
(默认):标准主元选择策略;主元对应于剩余待分解行中绝对值最大的元素。此主元选择策略要求元素类型也支持abs
和<
。 (这通常是浮点矩阵的唯一数值稳定选项。)RowNonZero()
:主元对应于剩余待分解行中第一个非零元素。 (这对应于手动计算中的典型选择,对于支持iszero
但不支持abs
或<
的更一般的代数数类型也很有用。)NoPivot()
:关闭主元选择(如果在主元位置遇到零条目,将失败,即使allowsingular = true
)。
可以通过 getproperty
访问分解 F
的各个组成部分:
组件 | 描述 |
---|---|
F.L | L (下三角)部分的 LU |
F.U | U (上三角)部分的 LU |
F.p | (右)排列 Vector |
F.P | (右)排列 Matrix |
迭代分解会产生组件 F.L
、F.U
和 F.p
。
F
和 A
之间的关系是
F.L*F.U == A[F.p, :]
F
进一步支持以下函数:
支持的函数 | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
allowsingular
关键字参数是在 Julia 1.11 中添加的。
示例
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # 通过迭代解构
julia> l == F.L && u == F.U && p == F.p
true
julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U factor (rank-deficient):
2×2 Matrix{Float64}:
1.0 2.0
0.0 0.0
LinearAlgebra.lu!
— Functionlu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU
计算稀疏矩阵 A
的 LU 分解,重用已存在的 LU 分解中存储的符号分解 F
。除非将 reuse_symbolic
设置为 false,否则稀疏矩阵 A
必须具有与用于创建 LU 分解 F
的矩阵相同的非零模式,否则会抛出错误。如果 A
和 F
的大小不同,则所有向量将相应地调整大小。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
置换 q
可以是一个置换向量或 nothing
。如果未提供置换向量或 q
为 nothing
,则使用 UMFPACK 的默认值。如果置换不是基于零的,则会制作一个基于零的副本。
另见 lu
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
使用的是 SuiteSparse 中的 UMFPACK 库。由于该库仅支持具有 Float64
或 ComplexF64
元素的稀疏矩阵,因此 lu!
将自动将类型转换为 LU 分解所设置的类型或适当的 SparseMatrixCSC{ComplexF64}
。
UmfpackLU
的 lu!
至少需要 Julia 1.5。
示例
julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);
julia> F = lu(A);
julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);
julia> lu!(F, B);
julia> F \ ones(2)
2-element Vector{Float64}:
0.0
1.0
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU
lu!
与 lu
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。如果因因式分解产生一个无法由 A
的元素类型表示的数字,例如对于整数类型,将抛出 InexactError
异常。
allowsingular
关键字参数是在 Julia 1.11 中添加的。
示例
julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
4.0 3.0
6.0 3.0
julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
LinearAlgebra.Cholesky
— TypeCholesky <: Factorization
稠密对称/厄米正定矩阵 A
的 Cholesky 分解的矩阵分解类型。这是 cholesky
的返回类型,对应的矩阵分解函数。
可以通过 F::Cholesky
的分解获得三角形 Cholesky 因子,方法是使用 F.L
和 F.U
,其中 A ≈ F.U' * F.U ≈ F.L * F.L'
。
以下函数可用于 Cholesky
对象:size
、\
、inv
、det
、logdet
和 isposdef
。
迭代分解会产生组件 L
和 U
。
示例
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
julia> l, u = C; # 通过迭代解构
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted
— TypeCholeskyPivoted
矩阵分解类型,适用于稠密对称/厄米正半定矩阵 A
的带主元的 Cholesky 分解。这是 cholesky(_, ::RowMaximum)
的返回类型,对应的矩阵分解函数。
可以通过 F.L
和 F.U
从分解 F::CholeskyPivoted
中获得三角形 Cholesky 因子,通过 F.p
获得置换,其中 A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
,其中 Ur = F.U[1:F.rank, :]
和 Lr = F.L[:, 1:F.rank]
,或者替代地 A ≈ Up' * Up ≈ Lp * Lp'
,其中 Up = F.U[1:F.rank, invperm(F.p)]
和 Lp = F.L[invperm(F.p), 1:F.rank]
。
以下函数可用于 CholeskyPivoted
对象:size
、\
、inv
、det
和 rank
。
迭代分解会产生组件 L
和 U
。
示例
julia> X = [1.0, 2.0, 3.0, 4.0];
julia> A = X * X';
julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U 因子,秩为 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
置换:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # 通过迭代解构
julia> l == C.L && u == C.U
true
LinearAlgebra.cholesky
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
计算稠密对称正定矩阵 A
的 Cholesky 分解,并返回一个 Cholesky
分解。矩阵 A
可以是一个 Symmetric
或 Hermitian
AbstractMatrix
,或者是一个 完全 对称或 Hermitian 的 AbstractMatrix
。
可以通过 F.L
和 F.U
从分解 F
中获得三角形 Cholesky 因子,其中 A ≈ F.U' * F.U ≈ F.L * F.L'
。
对于 Cholesky
对象,提供以下函数:size
、\
、inv
、det
、logdet
和 isposdef
。
如果你有一个由于构造中的舍入误差而稍微非 Hermitian 的矩阵 A
,请在将其传递给 cholesky
之前用 Hermitian(A)
将其包装,以便将其视为完全 Hermitian。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)在于用户。
示例
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
计算稠密对称半正定矩阵 A
的带主元的 Cholesky 分解,并返回一个 CholeskyPivoted
分解。矩阵 A
可以是 Symmetric
或 Hermitian
AbstractMatrix
,或者是 完全 对称或 Hermitian 的 AbstractMatrix
。
可以通过 F.L
和 F.U
从分解 F
中获得三角 Cholesky 因子,以及通过 F.p
获得置换,其中 A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
,其中 Ur = F.U[1:F.rank, :]
和 Lr = F.L[:, 1:F.rank]
,或者替代地 A ≈ Up' * Up ≈ Lp * Lp'
,其中 Up = F.U[1:F.rank, invperm(F.p)]
和 Lp = F.L[invperm(F.p), 1:F.rank]
。
以下函数可用于 CholeskyPivoted
对象:size
、\
、inv
、det
和 rank
。
参数 tol
决定了确定秩的容差。对于负值,容差为机器精度。
如果您有一个由于构造中的舍入误差而略微非 Hermitian 的矩阵 A
,请在将其传递给 cholesky
之前用 Hermitian(A)
将其包装,以便将其视为完全 Hermitian。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)在于用户。
示例
julia> X = [1.0, 2.0, 3.0, 4.0];
julia> A = X * X';
julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
permutation:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
计算稀疏正定矩阵 A
的 Cholesky 分解。A
必须是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/Hermitian
视图。请注意,即使 A
没有类型标签,它仍然必须是对称的或厄米的。如果未给出 perm
,则使用填充减少的置换。F = cholesky(A)
最常用于通过 F\b
求解方程组,但方法 diag
、det
和 logdet
也为 F
定义。您还可以使用 F.L
提取单个因子。然而,由于默认情况下启用了主元,因子分解在内部表示为 A == P'*L*L'*P
,其中 P
是置换矩阵;仅使用 L
而不考虑 P
将给出不正确的答案。为了包括置换的影响,通常更可取的是提取“组合”因子,如 PtL = F.PtL
(相当于 P'*L
)和 LtP = F.UP
(相当于 L'*P
)。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
设置可选的 shift
关键字参数将计算 A+shift*I
的分解,而不是 A
。如果提供了 perm
参数,它应该是 1:size(A,1)
的一个置换,给出要使用的顺序(而不是 CHOLMOD 的默认 AMD 顺序)。
示例
在以下示例中,使用的填充减少置换是 [3, 2, 1]
。如果将 perm
设置为 1:3
以强制不进行置换,则因子中的非零元素数量为 6。
julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
2 1 1
1 2 0
1 0 2
julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 5
nnz: 5
success: true
julia> C.p
3-element Vector{Int64}:
3
2
1
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.0 1.41421 0.0
0.707107 0.707107 1.0
julia> L * L' ≈ A[C.p, C.p]
true
julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
⋅ ⋅ 1.0
⋅ 1.0 ⋅
1.0 ⋅ ⋅
julia> P' * L * L' * P ≈ A
true
julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 6
nnz: 6
success: true
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.707107 1.22474 0.0
0.707107 -0.408248 1.1547
julia> L * L' ≈ A
true
此方法使用来自 SuiteSparse 的 CHOLMOD[ACM887][DavisHager2009] 库。CHOLMOD 仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将适当地转换为这些类型。
CHOLMOD 的许多其他函数被封装但未从 Base.SparseArrays.CHOLMOD
模块导出。
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
与 cholesky
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。如果因分解产生的数字无法用 A
的元素类型表示,例如对于整数类型,将抛出 InexactError
异常。
示例
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> cholesky!(A)
ERROR: InexactError: Int64(6.782329983125268)
Stacktrace:
[...]
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
与 cholesky
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。如果因子分解产生的数字无法由 A
的元素类型表示,例如对于整数类型,将抛出 InexactError
异常。
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
计算 A
的 Cholesky ($LL'$) 分解,重用符号分解 F
。A
必须是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/ Hermitian
视图。请注意,即使 A
没有类型标签,它仍然必须是对称的或厄米的。
另请参见 cholesky
。
此方法使用来自 SuiteSparse 的 CHOLMOD 库,仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将会适当地转换为这些类型。
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
使用向量 v
更新 Cholesky 分解 C
。如果 A = C.U'C.U
,则 CC = cholesky(C.U'C.U + v*v')
,但 CC
的计算仅使用 O(n^2)
操作。
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
获取给定 A
的 LDLt
或 LLt
分解 F
的 A + C*C'
的 LDLt
分解。
返回的因子始终是 LDLt
分解。
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
使用向量 v
对 Cholesky 分解 C
进行降维。如果 A = C.U'C.U
,则 CC = cholesky(C.U'C.U - v*v')
,但 CC
的计算仅使用 O(n^2)
的操作。
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
给定 A
的 LDLt
或 LLt
分解 F
,获取 A + C*C'
的 LDLt
分解。
返回的因子始终是 LDLt
分解。
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
使用向量 v
更新 Cholesky 分解 C
。如果 A = C.U'C.U
,则 CC = cholesky(C.U'C.U + v*v')
,但 CC
的计算仅使用 O(n^2)
操作。输入的分解 C
会就地更新,以便在退出时 C == CC
。在计算过程中,向量 v
会被销毁。
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
将 A
的 LDLt
或 LLt
分解 F
更新为 A + C*C'
的分解。
LLt
分解会转换为 LDLt
。
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
使用向量 v
对 Cholesky 分解 C
进行降维。如果 A = C.U'C.U
,则 CC = cholesky(C.U'C.U - v*v')
,但 CC
的计算仅使用 O(n^2)
操作。输入的分解 C
会就地更新,以便在退出时 C == CC
。在计算过程中,向量 v
会被销毁。
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
将 A
的 LDLt
或 LLt
分解 F
更新为 A - C*C'
的分解。
LLt
分解会转换为 LDLt
。
LinearAlgebra.LDLt
— TypeLDLt <: Factorization
LDLt
分解的矩阵分解类型,适用于实数 SymTridiagonal
矩阵 S
,使得 S = L*Diagonal(d)*L'
,其中 L
是一个 UnitLowerTriangular
矩阵,d
是一个向量。LDLt
分解 F = ldlt(S)
的主要用途是求解线性方程组 Sx = b
,使用 F\b
。这是 ldlt
的返回类型,对应的矩阵分解函数。
可以通过 getproperty
访问分解 F::LDLt
的各个组成部分:
组件 | 描述 |
---|---|
F.L | L (单位下三角)部分的 LDLt |
F.D | D (对角)部分的 LDLt |
F.Lt | Lt (单位上三角)部分的 LDLt |
F.d | D 的对角值作为 Vector |
示例
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
L factor:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
D factor:
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldlt
— Functionldlt(S::SymTridiagonal) -> LDLt
计算实对称三对角矩阵 S
的 LDLt
(即 $LDL^T$)分解,使得 S = L*Diagonal(d)*L'
,其中 L
是单位下三角矩阵,d
是一个向量。LDLt
分解 F = ldlt(S)
的主要用途是求解线性方程组 Sx = b
,使用 F\b
。
另请参见 bunchkaufman
,它是任意对称或厄米矩阵的类似但带有主元的分解。
示例
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt(S);
julia> b = [6., 7., 8.];
julia> ldltS \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
julia> S \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor
计算稀疏矩阵 A
的 $LDL'$ 分解。A
必须是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/Hermitian
视图。请注意,即使 A
没有类型标签,它仍然必须是对称或厄米的。使用填充减少的置换。F = ldlt(A)
最常用于求解方程组 A*x = b
,使用 F\b
。返回的分解对象 F
还支持方法 diag
、det
、logdet
和 inv
。您可以使用 F.L
从 F
中提取单个因子。然而,由于默认情况下启用了主元,分解在内部表示为 A == P'*L*D*L'*P
,其中 P
是置换矩阵;仅使用 L
而不考虑 P
将给出不正确的答案。为了包括置换的影响,通常更好地提取“组合”因子,如 PtL = F.PtL
(相当于 P'*L
)和 LtP = F.UP
(相当于 L'*P
)。支持的因子完整列表为 :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
设置可选的 shift
关键字参数计算 A+shift*I
的分解,而不是 A
。如果提供了 perm
参数,它应该是 1:size(A,1)
的一个置换,给出要使用的顺序(而不是 CHOLMOD 的默认 AMD 顺序)。
此方法使用来自 SuiteSparse 的 CHOLMOD[ACM887][DavisHager2009] 库。CHOLMOD 仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将根据需要转换为这些类型。
CHOLMOD 的许多其他函数被封装但未从 Base.SparseArrays.CHOLMOD
模块导出。
LinearAlgebra.ldlt!
— Functionldlt!(S::SymTridiagonal) -> LDLt
与 ldlt
相同,但通过覆盖输入 S
来节省空间,而不是创建副本。
示例
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt!(S);
julia> ldltS === S
false
julia> S
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 0.333333 ⋅
0.333333 3.66667 0.545455
⋅ 0.545455 3.90909
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
计算 A
的 $LDL'$ 分解,重用符号分解 F
。A
必须是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/Hermitian
视图。请注意,即使 A
没有类型标签,它仍必须是对称的或厄米的。
另请参见 ldlt
。
此方法使用来自 SuiteSparse 的 CHOLMOD 库,仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将会被适当地转换为这些类型。
LinearAlgebra.QR
— TypeQR <: Factorization
以压缩格式存储的 QR 矩阵分解,通常通过 qr
获得。如果 $A$ 是一个 m
×n
矩阵,则
\[A = Q R\]
其中 $Q$ 是一个正交/单位矩阵,$R$ 是上三角矩阵。矩阵 $Q$ 作为一系列 Householder 反射器 $v_i$ 和系数 $\tau_i$ 存储,其中:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
迭代分解产生组件 Q
和 R
。
该对象有两个字段:
factors
是一个m
×n
矩阵。- 上三角部分包含 $R$ 的元素,即
R = triu(F.factors)
对于一个QR
对象F
。 - 次对角部分包含以压缩格式存储的反射器 $v_i$,其中 $v_i$ 是矩阵
V = I + tril(F.factors, -1)
的第 $i$ 列。
- 上三角部分包含 $R$ 的元素,即
τ
是一个长度为min(m,n)
的向量,包含系数 $au_i$。
LinearAlgebra.QRCompactWY
— TypeQRCompactWY <: Factorization
一种以紧凑块格式存储的 QR 矩阵分解,通常通过 qr
获得。如果 $A$ 是一个 m
×n
矩阵,则
\[A = Q R\]
其中 $Q$ 是一个正交/单位矩阵,$R$ 是上三角矩阵。它与 QR
格式类似,除了正交/单位矩阵 $Q$ 以 Compact WY 格式存储 [Schreiber1989]。对于块大小 $n_b$,它被存储为一个 m
×n
的下梯形矩阵 $V$ 和一个矩阵 $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$,由 $b = \lceil \min(m,n) / n_b \rceil$ 个大小为 $n_b$×$n_b$ 的上三角矩阵 $T_j$ ($j = 1, ..., b-1$) 和一个上梯形的 $n_b$×$\min(m,n) - (b-1) n_b$ 矩阵 $T_b'$ ($j=b$) 组成,其上方的平方部分用 $T_b$ 表示,满足
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T) = \prod_{j=1}^{b} (I - V_j T_j V_j^T)\]
其中 $v_i$ 是 $V$ 的第 $i$ 列,$\tau_i$ 是 [diag(T_1); diag(T_2); …; diag(T_b)]
的第 $i$ 个元素,$(V_1 \; V_2 \; ... \; V_b)$ 是 $V$ 的左 m
×min(m, n)
块。当使用 qr
构造时,块大小由 $n_b = \min(m, n, 36)$ 给出。
迭代分解产生组件 Q
和 R
。
该对象有两个字段:
factors
,如同QR
类型,是一个m
×n
矩阵。- 上三角部分包含 $R$ 的元素,即
R = triu(F.factors)
对于一个QR
对象F
。 - 次对角部分包含反射器 $v_i$,以打包格式存储,使得
V = I + tril(F.factors, -1)
。
- 上三角部分包含 $R$ 的元素,即
T
是一个 $n_b$×$\min(m,n)$ 矩阵,如上所述。每个三角矩阵 $T_j$ 的次对角元素被忽略。
此格式不应与较旧的 WY 表示法混淆 [Bischof1987]。
LinearAlgebra.QRPivoted
— TypeQRPivoted <: Factorization
带列主元的 QR 矩阵分解,采用压缩格式,通常从 qr
获得。如果 $A$ 是一个 m
×n
矩阵,则
\[A P = Q R\]
其中 $P$ 是一个置换矩阵,$Q$ 是一个正交/单位矩阵,$R$ 是上三角矩阵。矩阵 $Q$ 作为一系列 Householder 反射器存储:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
迭代分解产生组件 Q
、R
和 p
。
该对象有三个字段:
factors
是一个m
×n
矩阵。- 上三角部分包含 $R$ 的元素,即
R = triu(F.factors)
对于一个QR
对象F
。 - 次对角部分包含反射器 $v_i$,以压缩格式存储,其中 $v_i$ 是矩阵
V = I + tril(F.factors, -1)
的第 $i$ 列。
- 上三角部分包含 $R$ 的元素,即
τ
是一个长度为min(m,n)
的向量,包含系数 $au_i$。jpvt
是一个长度为n
的整数向量,对应于置换 $P$。
LinearAlgebra.qr
— Functionqr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse
计算稀疏矩阵 A
的 QR
分解。使用填充减少的行和列置换,使得 F.R = F.Q'*A[F.prow,F.pcol]
。这种类型的主要应用是解决最小二乘或欠定问题,使用 \
。该函数调用 C 库 SPQR[ACM933]。
qr(A::SparseMatrixCSC)
使用的是 SuiteSparse 中的 SPQR 库。由于该库仅支持具有 Float64
或 ComplexF64
元素的稀疏矩阵,因此从 Julia v1.4 开始,qr
将 A
转换为适当类型的 SparseMatrixCSC{Float64}
或 SparseMatrixCSC{ComplexF64}
的副本。
示例
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
-1.41421 ⋅
⋅ -1.41421
Row permutation:
4-element Vector{Int64}:
1
3
4
2
Column permutation:
2-element Vector{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
计算矩阵 A
的 QR 分解:一个正交(或如果 A
是复值则为单位)矩阵 Q
,以及一个上三角矩阵 R
,使得
\[A = Q R\]
返回的对象 F
以打包格式存储分解:
- 如果
pivot == ColumnNorm()
,则F
是一个QRPivoted
对象, - 否则如果
A
的元素类型是 BLAS 类型(Float32
,Float64
,ComplexF32
或ComplexF64
),则F
是一个QRCompactWY
对象, - 否则
F
是一个QR
对象。
可以通过属性访问器检索分解 F
的各个组成部分:
每次通过 F.R
引用上三角因子都会分配一个新数组。因此,建议缓存该数组,例如,通过 R = F.R
并继续使用 R
。
迭代分解会产生组件 Q
、R
,以及如果存在则为 p
。
以下函数可用于 QR
对象:inv
、size
和 \
。当 A
是矩形时,\
将返回一个最小二乘解,如果解不是唯一的,则返回范数最小的解。当 A
不是满秩时,需要进行(列)置换的分解以获得最小范数解。
允许与全/方形或非全/方形 Q
进行乘法,即支持 F.Q*F.R
和 F.Q*A
。可以使用 Matrix
将 Q
矩阵转换为常规矩阵。此操作返回“薄” Q 因子,即,如果 A
是 m
×n
且 m>=n
,则 Matrix(F.Q)
产生一个具有正交列的 m
×n
矩阵。要检索“完整” Q 因子,即一个 m
×m
的正交矩阵,请使用 F.Q*I
或 collect(F.Q)
。如果 m<=n
,则 Matrix(F.Q)
产生一个 m
×m
的正交矩阵。
QR 分解的块大小可以通过关键字参数 blocksize :: Integer
指定,当 pivot == NoPivot()
且 A isa StridedMatrix{<:BlasFloat}
时。如果 blocksize > minimum(size(A))
,则会被忽略。请参见 QRCompactWY
。
blocksize
关键字参数需要 Julia 1.4 或更高版本。
示例
julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
3.0 -6.0
4.0 -8.0
0.0 1.0
julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 因子:3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R 因子:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
返回多种类型,因为 LAPACK 使用几种表示法来最小化 Householder 基本反射器的乘积的内存存储需求,以便 Q
和 R
矩阵可以紧凑地存储,而不是作为两个单独的密集矩阵。
LinearAlgebra.qr!
— Functionqr!(A, pivot = NoPivot(); blocksize)
qr!
与 qr
相同,当 A
是 AbstractMatrix
的子类型时,但通过覆盖输入 A
来节省空间,而不是创建副本。如果因因式分解产生一个无法由 A
的元素类型表示的数字,例如对于整数类型,将抛出 InexactError
异常。
blocksize
关键字参数需要 Julia 1.4 或更高版本。
示例
julia> a = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> qr!(a)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 因子: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R 因子:
2×2 Matrix{Float64}:
-3.16228 -4.42719
0.0 -0.632456
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
LinearAlgebra.LQ
— TypeLQ <: 因式分解
矩阵 A
的 LQ
因式分解类型。LQ
分解是 transpose(A)
的 QR
分解。这是 lq
的返回类型,对应的矩阵因式分解函数。
如果 S::LQ
是因式分解对象,则可以通过 S.L
获取下三角组件,通过 S.Q
获取正交/单位组件,使得 A ≈ S.L*S.Q
。
迭代分解会产生组件 S.L
和 S.Q
。
示例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 因子:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q 因子: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # 通过迭代解构
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq
— Functionlq(A) -> S::LQ
计算 A
的 LQ 分解。分解的下三角成分可以通过 LQ
对象 S
的 S.L
获得,正交/单位成分可以通过 S.Q
获得,从而有 A ≈ S.L*S.Q
。
迭代分解会产生成分 S.L
和 S.Q
。
LQ 分解是 transpose(A)
的 QR 分解,它在计算欠定方程组的最小范数解 lq(A) \ b
时非常有用(A
的列数大于行数,但具有满行秩)。
示例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 因子:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q 因子: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # 通过迭代解构
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!
— FunctionLinearAlgebra.BunchKaufman
— TypeBunchKaufman <: Factorization
矩阵分解类型的 Bunch-Kaufman 分解用于对称或厄米矩阵 A
,表示为 P'UDU'P
或 P'LDL'P
,具体取决于 A
中存储的是上三角(默认)还是下三角。如果 A
是复对称的,则 U'
和 L'
表示非共轭转置,即分别为 transpose(U)
和 transpose(L)
。这是 bunchkaufman
的返回类型,对应的矩阵分解函数。
如果 S::BunchKaufman
是分解对象,则可以通过 S.D
、S.U
或 S.L
获取组件,具体取决于 S.uplo
和 S.p
。
迭代分解会生成组件 S.D
、S.U
或 S.L
,具体取决于 S.uplo
和 S.p
。
示例
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A 在内部被 Symmetric(A) 包装
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U 因子:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
置换:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # 通过迭代解构
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L 因子:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
置换:
2-element Vector{Int64}:
2
1
LinearAlgebra.bunchkaufman
— Functionbunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman
计算对称或厄米矩阵 A
的 Bunch-Kaufman [Bunch1977] 分解为 P'*U*D*U'*P
或 P'*L*D*L'*P
,具体取决于 A
中存储的是哪个三角形,并返回一个 BunchKaufman
对象。请注意,如果 A
是复对称的,则 U'
和 L'
表示未共轭的转置,即 transpose(U)
和 transpose(L)
。
迭代分解会产生组件 S.D
、S.U
或 S.L
,具体取决于 S.uplo
和 S.p
。
如果 rook
为 true
,则使用 rook 选主元。如果 rook
为 false,则不使用 rook 选主元。
当 check = true
时,如果分解失败,将抛出错误。当 check = false
时,检查分解有效性的责任(通过 issuccess
)由用户承担。
以下函数可用于 BunchKaufman
对象:size
、\
、inv
、issymmetric
、ishermitian
、getindex
。
示例
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A 在内部被 Symmetric(A) 包装
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U 因子:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
置换:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # 通过迭代解构
julia> d == S.D && u == S.U && p == S.p
true
julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L 因子:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
置换:
2-element Vector{Int64}:
2
1
julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
LinearAlgebra.bunchkaufman!
— Functionbunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman
bunchkaufman!
与 bunchkaufman
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。
LinearAlgebra.Eigen
— TypeEigen <: Factorization
矩阵分解类型,表示方阵 A
的特征值/谱分解。这是 eigen
的返回类型,对应的矩阵分解函数。
如果 F::Eigen
是分解对象,可以通过 F.values
获取特征值,通过矩阵 F.vectors
的列获取特征向量。(第 k
个特征向量可以通过切片 F.vectors[:, k]
获取。)
迭代分解会产生组件 F.values
和 F.vectors
。
示例
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # 通过迭代解构
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen
— TypeGeneralizedEigen <: Factorization
广义特征值/谱分解的矩阵分解类型,适用于 A
和 B
。这是调用带有两个矩阵参数的 eigen
时返回的相应矩阵分解函数的返回类型。
如果 F::GeneralizedEigen
是分解对象,则可以通过 F.values
获取特征值,通过矩阵 F.vectors
的列获取特征向量。(第 k
个特征向量可以通过切片 F.vectors[:, k]
获取。)
迭代分解会产生组件 F.values
和 F.vectors
。
示例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B)
GeneralizedEigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
vectors:
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvals
— Functioneigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
返回 A
的特征值。
对于一般的非对称矩阵,可以在特征值计算之前指定如何平衡矩阵。permute
、scale
和 sortby
关键字与 eigen
相同。
示例
julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
1 0
0 4
julia> eigvals(diag_matrix)
2-element Vector{Float64}:
1.0
4.0
对于标量输入,eigvals
将返回一个标量。
示例
julia> eigvals(-2)
-2
eigvals(A, B) -> values
计算 A
和 B
的广义特征值。
示例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> eigvals(A,B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
返回 A
的特征值。可以通过指定一个覆盖排序特征值索引的 UnitRange
irange
来计算特征值的子集,例如第 2 到第 8 个特征值。
示例
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, 2:2)
1-element Vector{Float64}:
0.9999999999999996
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
返回 A
的特征值。可以通过指定一对 vl
和 vu
来计算特征值的子集,分别表示特征值的下界和上界。
示例
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
1.0000000000000009
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
LinearAlgebra.eigvals!
— Functioneigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values
与 eigvals
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。permute
、scale
和 sortby
关键字与 eigen
相同。
在对输入矩阵 A
调用 eigvals!
后,A
将不包含其特征值 - A
被用作工作空间。
示例
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> eigvals!(A)
2-element Vector{Float64}:
-0.3722813232690143
5.372281323269014
julia> A
2×2 Matrix{Float64}:
-0.372281 -1.0
0.0 5.37228
eigvals!(A, B; sortby) -> values
与 eigvals
相同,但通过覆盖输入 A
(和 B
)来节省空间,而不是创建副本。
在调用 eigvals!
后,输入矩阵 A
和 B
将不再包含它们的特征值。它们被用作工作空间。
示例
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> A
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 -0.0
julia> B
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
与 eigvals
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。irange
是要搜索的特征值 索引 的范围 - 例如,从第 2 个到第 8 个特征值。
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
与 eigvals
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。vl
是搜索特征值的区间下界,vu
是上界。
LinearAlgebra.eigmax
— Functioneigmax(A; permute::Bool=true, scale::Bool=true)
返回 A
的最大特征值。选项 permute=true
会对矩阵进行排列,使其更接近上三角形状,而 scale=true
会通过其对角元素对矩阵进行缩放,以使行和列的范数更为相等。请注意,如果 A
的特征值是复数,则此方法将失败,因为复数无法排序。
示例
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmax(A)
1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmax(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` 不能有复数特征值。
Stacktrace:
[...]
LinearAlgebra.eigmin
— Functioneigmin(A; permute::Bool=true, scale::Bool=true)
返回 A
的最小特征值。选项 permute=true
会对矩阵进行排列,使其更接近上三角形,scale=true
会通过其对角元素对矩阵进行缩放,以使行和列的范数更相等。请注意,如果 A
的特征值是复数,则此方法将失败,因为复数无法排序。
示例
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmin(A)
-1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmin(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` 不能有复特征值。
Stacktrace:
[...]
LinearAlgebra.eigvecs
— Functioneigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
返回一个矩阵 M
,其列是 A
的特征向量。(第 k
个特征向量可以通过切片 M[:, k]
获得。)
如果指定了可选的特征值向量 eigvals
,eigvecs
将返回相应的特征向量。
示例
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
julia> eigvecs(A)
3×3 Matrix{Float64}:
0.418304 -0.83205 0.364299
-0.656749 -7.39009e-16 0.754109
0.627457 0.5547 0.546448
julia> eigvecs(A, [1.])
3×1 Matrix{Float64}:
0.8320502943378438
4.263514128092366e-17
-0.5547001962252291
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix
返回一个矩阵 M
,其列是 A
的特征向量。(k
th 特征向量可以通过切片 M[:, k]
获得。) permute
、scale
和 sortby
关键字与 eigen
相同。
示例
julia> eigvecs([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
eigvecs(A, B) -> 矩阵
返回一个矩阵 M
,其列是 A
和 B
的广义特征向量。(k
th 特征向量可以通过切片 M[:, k]
获得。)
示例
julia> A = [1 0; 0 -1]
2×2 矩阵{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 矩阵{Int64}:
0 1
1 0
julia> eigvecs(A, B)
2×2 矩阵{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
LinearAlgebra.eigen
— Functioneigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen
计算 A
的特征值分解,返回一个 Eigen
分解对象 F
,该对象包含特征值在 F.values
中,特征向量在矩阵 F.vectors
的列中。这对应于求解形式为 Ax = λx
的特征值问题,其中 A
是一个矩阵,x
是一个特征向量,λ
是一个特征值。(k
th 特征向量可以通过切片 F.vectors[:, k]
获得。)
迭代分解会产生组件 F.values
和 F.vectors
。
以下函数可用于 Eigen
对象:inv
、det
和 isposdef
。
对于一般的非对称矩阵,可以指定在特征向量计算之前如何平衡矩阵。选项 permute=true
会对矩阵进行置换,使其更接近上三角形,scale=true
会通过其对角元素缩放矩阵,使行和列在范数上更为相等。默认情况下,这两个选项均为 true
。
默认情况下,特征值和特征向量按 (real(λ),imag(λ))
进行字典序排序。可以将不同的比较函数 by(λ)
传递给 sortby
,或者可以传递 sortby=nothing
以保持特征值的任意顺序。一些特殊的矩阵类型(例如 Diagonal
或 SymTridiagonal
)可能会实现自己的排序约定,并不接受 sortby
关键字。
示例
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # 通过迭代解构
julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen
计算 A
和 B
的广义特征值分解,返回一个 GeneralizedEigen
分解对象 F
,其中包含广义特征值在 F.values
中,广义特征向量在矩阵 F.vectors
的列中。这对应于求解形式为 Ax = λBx
的广义特征值问题,其中 A, B
是矩阵,x
是特征向量,λ
是特征值。(k
th 广义特征向量可以通过切片 F.vectors[:, k]
获得。)
迭代分解会产生组件 F.values
和 F.vectors
。
默认情况下,特征值和特征向量按 (real(λ),imag(λ))
进行字典序排序。可以将不同的比较函数 by(λ)
传递给 sortby
,或者可以传递 sortby=nothing
以保持特征值的任意顺序。
示例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B);
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # 通过迭代解构
julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen
计算 A
的特征值分解,返回一个 Eigen
分解对象 F
,该对象包含特征值在 F.values
中,特征向量在矩阵 F.vectors
的列中。(第 k
个特征向量可以通过切片 F.vectors[:, k]
获得。)
迭代分解会产生组件 F.values
和 F.vectors
。
以下函数可用于 Eigen
对象:inv
、det
和 isposdef
。
UnitRange
irange
指定要搜索的排序特征值的索引。
如果 irange
不是 1:n
,其中 n
是 A
的维度,则返回的分解将是一个 截断 分解。
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen
计算 A
的特征值分解,返回一个 Eigen
分解对象 F
,其中包含特征值在 F.values
中,特征向量在矩阵 F.vectors
的列中。(第 k
个特征向量可以通过切片 F.vectors[:, k]
获得。)
迭代分解会产生组件 F.values
和 F.vectors
。
以下函数可用于 Eigen
对象:inv
、det
和 isposdef
。
vl
是要搜索的特征值窗口的下界,vu
是上界。
如果 [vl
, vu
] 不包含 A
的所有特征值,则返回的分解将是 截断 分解。
LinearAlgebra.eigen!
— Functioneigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)
与 eigen
相同,但通过覆盖输入 A
(和 B
)来节省空间,而不是创建副本。
LinearAlgebra.Hessenberg
— TypeHessenberg <: 因式分解
Hessenberg
对象表示方阵的 Hessenberg 因式分解 QHQ'
,或其移位 Q(H+μI)Q'
,该因式分解由 hessenberg
函数生成。
LinearAlgebra.hessenberg
— Functionhessenberg(A) -> Hessenberg
计算 A
的 Hessenberg 分解并返回一个 Hessenberg
对象。如果 F
是因式分解对象,则可以通过 F.Q
(类型为 LinearAlgebra.HessenbergQ
)访问单位矩阵,通过 F.H
(类型为 UpperHessenberg
)访问 Hessenberg 矩阵,任一矩阵都可以通过 Matrix(F.H)
或 Matrix(F.Q)
转换为常规矩阵。
如果 A
是 Hermitian
或实 Symmetric
,则 Hessenberg 分解会产生一个实对称三对角矩阵,F.H
的类型为 SymTridiagonal
。
请注意, shifted factorization A+μI = Q (H+μI) Q'
可以通过 F + μ*I
使用 UniformScaling
对象 I
高效构造,该对象创建一个具有共享存储和修改过的移位的新 Hessenberg
对象。给定 F
的移位可以通过 F.μ
获得。这是有用的,因为一旦创建了 F
,可以高效地执行多个移位求解 (F + μ*I) \ b
(对于不同的 μ
和/或 b
)。
迭代分解会产生因子 F.Q, F.H, F.μ
。
示例
julia> A = [4. 9. 7.; 4. 4. 1.; 4. 3. 2.]
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> F = hessenberg(A)
Hessenberg{Float64, UpperHessenberg{Float64, Matrix{Float64}}, Matrix{Float64}, Vector{Float64}, Bool}
Q factor: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
4.0 -11.3137 -1.41421
-5.65685 5.0 2.0
⋅ -8.88178e-16 1.0
julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> q, h = F; # 通过迭代解构
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!
— Functionhessenberg!(A) -> Hessenberg
hessenberg!
与 hessenberg
相同,但通过覆盖输入 A
来节省空间,而不是创建副本。
LinearAlgebra.Schur
— TypeSchur <: Factorization
矩阵 A
的 Schur 分解的矩阵分解类型。这是 schur(_)
的返回类型,对应的矩阵分解函数。
如果 F::Schur
是分解对象,则 (准) 三角形 Schur 因子可以通过 F.Schur
或 F.T
获得,正交/单位 Schur 向量可以通过 F.vectors
或 F.Z
获得,使得 A = F.vectors * F.Schur * F.vectors'
。矩阵 A
的特征值可以通过 F.values
获得。
迭代分解会产生组件 F.T
、F.Z
和 F.values
。
示例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
eigenvalues:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # destructuring via iteration
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— TypeGeneralizedSchur <: Factorization
广义 Schur 分解的矩阵分解类型,适用于两个矩阵 A
和 B
。这是 schur(_, _)
的返回类型,对应的矩阵分解函数。
如果 F::GeneralizedSchur
是分解对象,则可以通过 F.S
和 F.T
获取(准)三角 Schur 因子,通过 F.left
或 F.Q
获取左侧单位/正交 Schur 向量,通过 F.right
或 F.Z
获取右侧单位/正交 Schur 向量,使得 A=F.left*F.S*F.right'
和 B=F.left*F.T*F.right'
。A
和 B
的广义特征值可以通过 F.α./F.β
获取。
迭代分解会产生组件 F.S
、F.T
、F.Q
、F.Z
、F.α
和 F.β
。
LinearAlgebra.schur
— Functionschur(A) -> F::Schur
计算矩阵 A
的 Schur 分解。可以通过 F.Schur
或 F.T
从 Schur
对象 F
中获得(准)三角 Schur 因子,正交/单位 Schur 向量可以通过 F.vectors
或 F.Z
获得,从而满足 A = F.vectors * F.Schur * F.vectors'
。可以通过 F.values
获得 A
的特征值。
对于实数矩阵 A
,Schur 分解是“准三角形”的,这意味着它是上三角的,除了对于任何共轭复特征值的 2×2 对角块;这使得即使存在复特征值,分解也可以完全是实数的。要从实数准三角分解中获得(复数)纯上三角的 Schur 分解,可以使用 Schur{Complex}(schur(A))
。
迭代分解会产生组件 F.T
、F.Z
和 F.values
。
示例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T 因子:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z 因子:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
特征值:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # 通过迭代解构
julia> t == F.T && z == F.Z && vals == F.values
true
schur(A, B) -> F::GeneralizedSchur
计算矩阵 A
和 B
的广义 Schur(或 QZ)分解。可以通过 F.S
和 F.T
从 Schur
对象 F
中获得(准)三角形 Schur 因子,左单位/正交 Schur 向量可以通过 F.left
或 F.Q
获得,右单位/正交 Schur 向量可以通过 F.right
或 F.Z
获得,使得 A=F.left*F.S*F.right'
和 B=F.left*F.T*F.right'
。广义特征值 A
和 B
可以通过 F.α./F.β
获得。
迭代分解会产生组件 F.S
、F.T
、F.Q
、F.Z
、F.α
和 F.β
。
LinearAlgebra.schur!
— Functionschur!(A) -> F::Schur
与 schur
相同,但使用输入参数 A
作为工作空间。
示例
julia> A = [5. 7.; -2. -4.]
2×2 矩阵{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur!(A)
Schur{Float64, 矩阵{Float64}, 向量{Float64}}
T 因子:
2×2 矩阵{Float64}:
3.0 9.0
0.0 -2.0
Z 因子:
2×2 矩阵{Float64}:
0.961524 0.274721
-0.274721 0.961524
特征值:
2 元素 向量{Float64}:
3.0
-2.0
julia> A
2×2 矩阵{Float64}:
3.0 9.0
0.0 -2.0
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur
与 schur
相同,但使用输入矩阵 A
和 B
作为工作区。
LinearAlgebra.ordschur
— Functionordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
根据逻辑数组 select
重新排序矩阵 A = Z*T*Z'
的 Schur 分解 F
,返回重新排序的分解 F
对象。所选的特征值出现在 F.Schur
的主对角线上,F.vectors
的相应主列形成对应右不变子空间的正交/单位基。在实数情况下,复共轭特征值对必须通过 select
要么全部包含,要么全部排除。
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
根据逻辑数组 select
重新排序矩阵对 (A, B) = (Q*S*Z', Q*T*Z')
的广义 Schur 分解 F
,并返回一个广义 Schur 对象 F
。所选的特征值出现在 F.S
和 F.T
的主对角线上,左侧和右侧的正交/单位 Schur 向量也被重新排序,以便仍然满足 (A, B) = F.Q*(F.S, F.T)*F.Z'
,并且仍然可以通过 F.α./F.β
获取 A
和 B
的广义特征值。
LinearAlgebra.ordschur!
— Functionordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
与 ordschur
相同,但会覆盖分解 F
。
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
与 ordschur
相同,但会覆盖分解 F
。
LinearAlgebra.SVD
— TypeSVD <: Factorization
矩阵 A
的奇异值分解(SVD)的矩阵分解类型。这是 svd(_)
的返回类型,对应的矩阵分解函数。
如果 F::SVD
是分解对象,则可以通过 F.U
、F.S
、F.V
和 F.Vt
获取 U
、S
、V
和 Vt
,使得 A = U * Diagonal(S) * Vt
。S
中的奇异值按降序排列。
迭代分解会产生组件 U
、S
和 V
。
示例
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> F = svd(A)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×4 Matrix{Float64}:
0.0 1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0
0.0 0.0 -1.0 0.0
singular values:
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
Vt factor:
4×5 Matrix{Float64}:
-0.0 0.0 1.0 -0.0 0.0
0.447214 0.0 0.0 0.0 0.894427
0.0 -1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
julia> F.U * Diagonal(F.S) * F.Vt
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> u, s, v = F; # 通过迭代解构
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD
— TypeGeneralizedSVD <: Factorization
广义奇异值分解(SVD)两矩阵 A
和 B
的矩阵分解类型,使得 A = F.U*F.D1*F.R0*F.Q'
和 B = F.V*F.D2*F.R0*F.Q'
。这是 svd(_, _)
的返回类型,对应的矩阵分解函数。
对于一个 M 行 N 列的矩阵 A
和一个 P 行 N 列的矩阵 B
,
U
是一个 M 行 M 列的正交矩阵,V
是一个 P 行 P 列的正交矩阵,Q
是一个 N 行 N 列的正交矩阵,D1
是一个 M 行 (K+L) 列的对角矩阵,前 K 个条目为 1,D2
是一个 P 行 (K+L) 列的矩阵,其右上角的 L 行 L 列块为对角矩阵,R0
是一个 (K+L) 行 N 列的矩阵,其最右侧的 (K+L) 行 (K+L) 列块是非奇异的上三角块,
K+L
是矩阵 [A; B]
的有效数值秩。
迭代分解产生组件 U
、V
、Q
、D1
、D2
和 R0
。
F.D1
和 F.D2
的条目是相关的,具体说明见 LAPACK 文档中的 广义 SVD 和底层调用的 xGGSVD3 例程(在 LAPACK 3.6.0 及更新版本中)。
示例
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
V factor:
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 0.0
Q factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
D1 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
D2 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
R0 factor:
2×2 Matrix{Float64}:
1.41421 0.0
0.0 -1.41421
julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
-0.0 1.0
1.0 0.0
LinearAlgebra.svd
— Functionsvd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
计算 A
的奇异值分解(SVD)并返回一个 SVD
对象。
U
、S
、V
和 Vt
可以通过因式分解 F
获取,使用 F.U
、F.S
、F.V
和 F.Vt
,使得 A = U * Diagonal(S) * Vt
。该算法生成 Vt
,因此提取 Vt
比提取 V
更高效。S
中的奇异值按降序排列。
迭代分解会产生组件 U
、S
和 V
。
如果 full = false
(默认),则返回“瘦”SVD。对于一个 $M \times N$ 矩阵 A
,在完整因式分解中 U
是 $M \times M$,而 V
是 $N \times N$,而在瘦因式分解中 U
是 $M \times K$,V
是 $N \times K$,其中 $K = \min(M,N)$ 是奇异值的数量。
如果 alg = DivideAndConquer()
,则使用分治算法来计算 SVD。另一个(通常较慢但更准确)选项是 alg = QRIteration()
。
alg
关键字参数需要 Julia 1.3 或更高版本。
示例
julia> A = rand(4,3);
julia> F = svd(A); # 存储因式分解对象
julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true
julia> U, S, V = F; # 通过迭代解构
julia> A ≈ U * Diagonal(S) * V'
true
julia> Uonly, = svd(A); # 仅存储 U
julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD
计算 A
和 B
的广义 SVD,返回一个 GeneralizedSVD
分解对象 F
,使得 [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'
U
是一个 M-by-M 的正交矩阵,V
是一个 P-by-P 的正交矩阵,Q
是一个 N-by-N 的正交矩阵,D1
是一个 M-by-(K+L) 的对角矩阵,前 K 个元素为 1,D2
是一个 P-by-(K+L) 的矩阵,其右上角的 L-by-L 块是对角的,R0
是一个 (K+L)-by-N 的矩阵,其最右侧的 (K+L)-by-(K+L) 块是非奇异的上三角块,
K+L
是矩阵 [A; B]
的有效数值秩。
迭代分解产生组件 U
、V
、Q
、D1
、D2
和 R0
。
广义 SVD 用于应用场景,例如当人们想比较 A
和 B
各自的贡献时,如人类与酵母基因组,或信号与噪声,或聚类之间与聚类内部的比较。(参见 Edelman 和 Wang 的讨论:https://arxiv.org/abs/1901.00485)
它将 [A; B]
分解为 [UC; VS]H
,其中 [UC; VS]
是 [A; B]
列空间的自然正交基,H = RQ'
是 [A;B]
行空间的自然非正交基,其中顶部行最密切归因于 A
矩阵,底部行归因于 B
矩阵。多余弦/正弦矩阵 C
和 S
提供了 A
与 B
的多重度量,而 U
和 V
提供了这些度量的方向。
示例
julia> A = randn(3,2); B=randn(4,2);
julia> F = svd(A, B);
julia> U,V,Q,C,S,R = F;
julia> H = R*Q';
julia> [A; B] ≈ [U*C; V*S]*H
true
julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true
julia> Uonly, = svd(A,B);
julia> U == Uonly
true
LinearAlgebra.svd!
— Functionsvd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
LinearAlgebra.svdvals
— Functionsvdvals(A)
返回 A
的奇异值,按降序排列。
示例
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> svdvals(A)
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
svdvals(A, B)
返回 A
和 B
的广义奇异值,来自广义奇异值分解。另见 svd
。
示例
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> svdvals(A, B)
2-element Vector{Float64}:
1.0
1.0
LinearAlgebra.svdvals!
— FunctionLinearAlgebra.Givens
— TypeLinearAlgebra.Givens(i1,i2,c,s) -> G
一个 Givens 旋转线性算子。字段 c
和 s
分别表示旋转角度的余弦和正弦。Givens
类型支持左乘 G*A
和共轭转置右乘 A*G'
。该类型没有 size
,因此可以与任意大小的矩阵相乘,只要 i2<=size(A,2)
对于 G*A
或 i2<=size(A,1)
对于 A*G'
。
另见 givens
。
LinearAlgebra.givens
— Functiongivens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)
计算 Givens 旋转 G
和标量 r
,使得对于任何向量 x
,其中
x[i1] = f
x[i2] = g
乘法的结果
y = G*x
具有以下性质
y[i1] = r
y[i2] = 0
givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)
计算 Givens 旋转 G
和标量 r
,使得乘法的结果
B = G*A
具有以下属性:
B[i1,j] = r
B[i2,j] = 0
另见 LinearAlgebra.Givens
. ```
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)
计算 Givens 旋转 G
和标量 r
,使得乘法的结果
B = G*x
具有以下属性:
B[i1] = r
B[i2] = 0
另见 LinearAlgebra.Givens
. ```
LinearAlgebra.triu
— Functiontriu(M)
矩阵的上三角部分。
示例
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
0.0 1.0 1.0 1.0
0.0 0.0 1.0 1.0
0.0 0.0 0.0 1.0
triu(M, k::Integer)
返回从第 k
条超对角线开始的 M
的上三角部分。
示例
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a,3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
julia> triu(a,-3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
LinearAlgebra.triu!
— Functiontriu!(M)
矩阵的上三角,过程中覆盖 M
。另见 triu
。
triu!(M, k::Integer)
返回从第 k
个超对角线开始的 M
的上三角形,同时覆盖 M
。
示例
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> triu!(M, 1)
5×5 Matrix{Int64}:
0 2 3 4 5
0 0 3 4 5
0 0 0 4 5
0 0 0 0 5
0 0 0 0 0
LinearAlgebra.tril
— Functiontril(M)
矩阵的下三角部分。
示例
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a)
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
1.0 1.0 0.0 0.0
1.0 1.0 1.0 0.0
1.0 1.0 1.0 1.0
tril(M, k::Integer)
返回从第 k
条超对角线开始的 M
的下三角。
示例
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,-3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
1.0 0.0 0.0 0.0
LinearAlgebra.tril!
— Functiontril!(M)
矩阵的下三角,过程中覆盖 M
。另见 tril
。
tril!(M, k::Integer)
返回从第 k
条超对角线开始的 M
的下三角,过程中覆盖 M
。
示例
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> tril!(M, 2)
5×5 Matrix{Int64}:
1 2 3 0 0
1 2 3 4 0
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
LinearAlgebra.diagind
— Functiondiagind(M::AbstractMatrix, k::Integer = 0, indstyle::IndexStyle = IndexLinear())
diagind(M::AbstractMatrix, indstyle::IndexStyle = IndexLinear())
一个 AbstractRange
,给出矩阵 M
的第 k
条对角线的索引。可以选择性地指定索引样式,以确定返回的范围类型。如果 indstyle isa IndexLinear
(默认),则返回 AbstractRange{Integer}
。另一方面,如果 indstyle isa IndexCartesian
,则返回 AbstractRange{CartesianIndex{2}}
。
如果未提供 k
,则假定为 0
(对应主对角线)。
示例
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diagind(A, -1)
2:4:6
julia> diagind(A, IndexCartesian())
StepRangeLen(CartesianIndex(1, 1), CartesianIndex(1, 1), 3)
指定 IndexStyle
至少需要 Julia 1.11。
LinearAlgebra.diag
— Functiondiag(M, k::Integer=0)
矩阵的第 k
条对角线,作为一个向量。
另见 diagm
, diagind
, Diagonal
, isdiag
。
示例
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diag(A,1)
2-element Vector{Int64}:
2
6
LinearAlgebra.diagm
— Functiondiagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
从对角线和向量的 Pair
构造一个矩阵。向量 kv.second
将被放置在 kv.first
对角线上。默认情况下,矩阵是方形的,其大小由 kv
推断,但可以通过将 m,n
作为第一个参数传递来指定非方形大小 m
×n
(根据需要用零填充)。对于重复的对角线索引 kv.first
,对应向量 kv.second
中的值将被相加。
diagm
构造一个完整的矩阵;如果您想要存储效率高且运算快速的版本,请参见 Diagonal
、Bidiagonal
Tridiagonal
和 SymTridiagonal
。
示例
julia> diagm(1 => [1,2,3])
4×4 Matrix{Int64}:
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
julia> diagm(1 => [1,2,3], -1 => [4,5])
4×4 Matrix{Int64}:
0 1 0 0
4 0 2 0
0 5 0 3
0 0 0 0
julia> diagm(1 => [1,2,3], 1 => [1,2,3])
4×4 Matrix{Int64}:
0 2 0 0
0 0 4 0
0 0 0 6
0 0 0 0
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)
构造一个以向量元素为对角线元素的矩阵。默认情况下,矩阵是方形的,其大小由 length(v)
给出,但可以通过将 m,n
作为第一个参数传递来指定非方形大小 m
×n
。
示例
julia> diagm([1,2,3])
3×3 Matrix{Int64}:
1 0 0
0 2 0
0 0 3
LinearAlgebra.rank
— Functionrank(::QRSparse{Tv,Ti}) -> Ti
返回QR分解的秩
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
通过计算 S
的 QR 分解来计算秩。小于 tol
的值被视为零。请参阅 SPQR 的手册。
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)
通过计算 svdvals(A)
的输出中有多少个大于 max(atol, rtol*σ₁)
来计算矩阵的数值秩,其中 σ₁
是 A
的最大计算奇异值。atol
和 rtol
分别是绝对和相对容差。默认的相对容差是 n*ϵ
,其中 n
是 A
最小维度的大小,ϵ
是 A
元素类型的 eps
。
数值秩可能是对病态矩阵的敏感和不精确的表征,这些矩阵的奇异值接近阈值容差 max(atol, rtol*σ₁)
。在这种情况下,对奇异值计算或矩阵的轻微扰动可能会通过推动一个或多个奇异值跨越阈值而改变 rank
的结果。这些变化甚至可能由于不同 Julia 版本、架构、编译器或操作系统之间的浮点错误变化而发生。
atol
和 rtol
关键字参数需要至少 Julia 1.1。在 Julia 1.0 中,rtol
作为位置参数可用,但在 Julia 2.0 中将被弃用。
示例
julia> rank(Matrix(I, 3, 3))
3
julia> rank(diagm(0 => [1, 0, 2]))
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3
julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5)
1
LinearAlgebra.norm
— Functionnorm(A, p::Real=2)
对于任何可迭代容器 A
(包括任意维度的数组)中的数字(或任何定义了 norm
的元素类型),计算 p
-范数(默认为 p=2
),就好像 A
是一个对应长度的向量。
p
-范数定义为
\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]
其中 $a_i$ 是 A
的条目,$| a_i |$ 是 norm
的 a_i
,$n$ 是 A
的长度。由于 p
-范数是使用 A
的条目的 norm
计算的,因此当 p != 2
时,向量的向量的 p
-范数通常与其作为块向量的解释不兼容。
p
可以取任何数值(尽管并非所有值都产生数学上有效的向量范数)。特别地,norm(A, Inf)
返回 abs.(A)
中的最大值,而 norm(A, -Inf)
返回最小值。如果 A
是一个矩阵且 p=2
,那么这等同于 Frobenius 范数。
第二个参数 p
不一定是 norm
接口的一部分,即自定义类型可能只实现 norm(A)
而没有第二个参数。
使用 opnorm
计算矩阵的算子范数。
示例
julia> v = [3, -2, 6]
3-element Vector{Int64}:
3
-2
6
julia> norm(v)
7.0
julia> norm(v, 1)
11.0
julia> norm(v, Inf)
6.0
julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134
julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134
julia> norm(1:9)
16.881943016134134
julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true
julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true
julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
norm(x::Number, p::Real=2)
对于数字,返回 $\left( |x|^p \right)^{1/p}$。
示例
julia> norm(2, 1)
2.0
julia> norm(-2, 1)
2.0
julia> norm(2, 2)
2.0
julia> norm(-2, 2)
2.0
julia> norm(2, Inf)
2.0
julia> norm(-2, Inf)
2.0
LinearAlgebra.opnorm
— Functionopnorm(A::AbstractMatrix, p::Real=2)
计算由向量 p
-范数诱导的算子范数(或矩阵范数),其中有效的 p
值为 1
、2
或 Inf
。(请注意,对于稀疏矩阵,当前未实现 p=2
。)使用 norm
计算 Frobenius 范数。
当 p=1
时,算子范数是矩阵 A
的最大绝对列和:
\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]
其中 $a_{ij}$ 是矩阵 A
的元素,$m$ 和 $n$ 是其维度。
当 p=2
时,算子范数是谱范数,等于矩阵 A
的最大奇异值。
当 p=Inf
时,算子范数是矩阵 A
的最大绝对行和:
\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]
示例
julia> A = [1 -2 -3; 2 3 -1]
2×3 Matrix{Int64}:
1 -2 -3
2 3 -1
julia> opnorm(A, Inf)
6.0
julia> opnorm(A, 1)
5.0
opnorm(x::Number, p::Real=2)
对于数字,返回 $\left( |x|^p \right)^{1/p}$。这等同于 norm
。
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)
对于 Adjoint/Transpose 包装的向量,返回 A
的算子 $q$-范数,这等同于值为 p = q/(q-1)
的 p
-范数。在 p = q = 2
时它们是一致的。使用 norm
计算 A
作为向量的 p
范数。
向量空间与其对偶之间的范数差异是为了保持对偶性与点积之间的关系,结果与 1 × n
矩阵的算子 p
-范数一致。
示例
julia> v = [1; im];
julia> vc = v';
julia> opnorm(vc, 1)
1.0
julia> norm(vc, 1)
2.0
julia> norm(v, 1)
2.0
julia> opnorm(vc, 2)
1.4142135623730951
julia> norm(vc, 2)
1.4142135623730951
julia> norm(v, 2)
1.4142135623730951
julia> opnorm(vc, Inf)
2.0
julia> norm(vc, Inf)
1.0
julia> norm(v, Inf)
1.0
LinearAlgebra.normalize!
— FunctionLinearAlgebra.normalize
— Functionnormalize(a, p::Real=2)
归一化 a
使其 p
-范数等于 1,即 norm(a, p) == 1
。对于标量,这类似于 sign(a),但 normalize(0) = NaN。另请参见 normalize!
、norm
和 sign
。
示例
julia> a = [1,2,4];
julia> b = normalize(a)
3-element Vector{Float64}:
0.2182178902359924
0.4364357804719848
0.8728715609439696
julia> norm(b)
1.0
julia> c = normalize(a, 1)
3-element Vector{Float64}:
0.14285714285714285
0.2857142857142857
0.5714285714285714
julia> norm(c, 1)
1.0
julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
1 2 4
1 2 4
julia> norm(a)
6.48074069840786
julia> normalize(a)
2×3 Matrix{Float64}:
0.154303 0.308607 0.617213
0.154303 0.308607 0.617213
julia> normalize(3, 1)
1.0
julia> normalize(-8, 1)
-1.0
julia> normalize(0, 1)
NaN
LinearAlgebra.cond
— Functioncond(M, p::Real=2)
矩阵 M
的条件数,使用算子 p
-范数计算。有效的 p
值为 1
、2
(默认)或 Inf
。
LinearAlgebra.condskeel
— Functioncondskeel(M, [x, p::Real=Inf])
\[\kappa_S(M, p) = \left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \right\Vert_p \\ \kappa_S(M, x, p) = \frac{\left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \left\vert x \right\vert \right\Vert_p}{\left \Vert x \right \Vert_p}\]
矩阵 M
的 Skeel 条件数 $\kappa_S$,可选地与向量 x
相关,使用算子 p
-范数计算。$\left\vert M \right\vert$ 表示矩阵 $M$ 的(逐元素)绝对值矩阵;$\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$。p
的有效值为 1
、2
和 Inf
(默认)。
这个量在文献中也被称为 Bauer 条件数、相对条件数或逐分量相对条件数。
LinearAlgebra.tr
— Functiontr(M)
矩阵迹。对 M
的对角元素求和。
示例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.det
— Functiondet(M)
矩阵行列式。
示例
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdet
— Functionlogdet(M)
矩阵行列式的对数。等同于 log(det(M))
,但可能提供更高的精度,并避免溢出/下溢。
示例
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> logdet(M)
0.6931471805599453
julia> logdet(Matrix(I, 3, 3))
0.0
LinearAlgebra.logabsdet
— Functionlogabsdet(M)
矩阵行列式绝对值的对数。等价于 (log(abs(det(M))), sign(det(M)))
,但可能提供更高的精度和/或速度。
示例
julia> A = [-1. 0.; 0. 1.]
2×2 Matrix{Float64}:
-1.0 0.0
0.0 1.0
julia> det(A)
-1.0
julia> logabsdet(A)
(0.0, -1.0)
julia> B = [2. 0.; 0. 1.]
2×2 Matrix{Float64}:
2.0 0.0
0.0 1.0
julia> det(B)
2.0
julia> logabsdet(B)
(0.6931471805599453, 1.0)
Base.inv
— Methodinv(M)
矩阵的逆。计算矩阵 N
使得 M * N = I
,其中 I
是单位矩阵。通过求解左除 N = M \ I
来计算。
示例
julia> M = [2 5; 1 3]
2×2 Matrix{Int64}:
2 5
1 3
julia> N = inv(M)
2×2 Matrix{Float64}:
3.0 -5.0
-1.0 2.0
julia> M*N == N*M == Matrix(I, 2, 2)
true
LinearAlgebra.pinv
— Functionpinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # 在 Julia 2.0 中将被弃用
计算摩尔-彭若斯伪逆。
对于具有浮点元素的矩阵 M
,通过仅反转大于 max(atol, rtol*σ₁)
的奇异值来计算伪逆是方便的,其中 σ₁
是 M
的最大奇异值。
绝对容忍度(atol
)和相对容忍度(rtol
)的最佳选择因 M
的值和伪逆的预期应用而异。默认的相对容忍度是 n*ϵ
,其中 n
是 M
最小维度的大小,ϵ
是 M
元素类型的 eps
。
对于以最小二乘意义反转稠密病态矩阵,建议使用 rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
。
有关更多信息,请参见 [issue8859], [B96], [S84], [KY88]。
示例
julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
1.5 1.3
1.2 1.9
julia> N = pinv(M)
2×2 Matrix{Float64}:
1.47287 -1.00775
-0.930233 1.16279
julia> M * N
2×2 Matrix{Float64}:
1.0 -2.22045e-16
4.44089e-16 1.0
LinearAlgebra.nullspace
— Functionnullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # 在 Julia 2.0 中将被弃用
通过包括 `M` 的奇异向量来计算 `M` 的零空间的基,这些奇异向量的奇异值的绝对值小于 `max(atol, rtol*σ₁)`,其中 `σ₁` 是 `M` 的最大奇异值。
默认情况下,相对容忍度 `rtol` 是 `n*ϵ`,其中 `n` 是 `M` 最小维度的大小,`ϵ` 是 `M` 的元素类型的 [`eps`](@ref)。
# 示例
jldoctest julia> M = [1 0 0; 0 1 0; 0 0 0] 3×3 Matrix{Int64}: 1 0 0 0 1 0 0 0 0
julia> nullspace(M) 3×1 Matrix{Float64}: 0.0 0.0 1.0
julia> nullspace(M, rtol=3) 3×3 Matrix{Float64}: 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
julia> nullspace(M, atol=0.95) 3×1 Matrix{Float64}: 0.0 0.0 1.0 ```
Base.kron
— Functionkron(A, B)
计算两个向量、矩阵或数字的克罗内克积。
对于实向量 v
和 w
,克罗内克积与外积相关,通过 kron(v,w) == vec(w * transpose(v))
或 w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
。注意 v
和 w
在这些表达式的左右两侧的顺序不同(由于列主存储)。对于复向量,外积 w * v'
也因 v
的共轭而有所不同。
示例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 1+0im
1+0im 0-1im
julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
0+1im 1+0im 0+2im 2+0im
1+0im 0-1im 2+0im 0-2im
0+3im 3+0im 0+4im 4+0im
3+0im 0-3im 4+0im 0-4im
julia> v = [1, 2]; w = [3, 4, 5];
julia> w*transpose(v)
3×2 Matrix{Int64}:
3 6
4 8
5 10
julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
3 6
4 8
5 10
Base.kron!
— FunctionBase.exp
— Methodexp(A::AbstractMatrix)
计算矩阵 A
的指数,定义为
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
对于对称或厄米 A
,使用特征分解 (eigen
),否则选择缩放和平方算法(参见 [H05])。
示例
julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
julia> exp(A)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
Base.cis
— Methodcis(A::AbstractMatrix)
更高效的方法用于平方矩阵 A
的 exp(im*A)
(特别是当 A
是 Hermitian
或实对称矩阵时)。
在 Julia 1.7 中添加了对使用 cis
处理矩阵的支持。
示例
julia> cis([π 0; 0 π]) ≈ -I
true
Base.:^
— Method^(A::AbstractMatrix, p::Number)
矩阵幂,相当于 $\exp(p\log(A))$
示例
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^
— Method^(b::Number, A::AbstractMatrix)
矩阵指数,等价于 $\exp(\log(b)A)$。
在 Julia 1.1 中添加了对将 Irrational
数字(如 ℯ
)提升到矩阵的支持。
示例
julia> 2^[1 2; 0 3]
2×2 Matrix{Float64}:
2.0 6.0
0.0 8.0
julia> ℯ^[1 2; 0 3]
2×2 Matrix{Float64}:
2.71828 17.3673
0.0 20.0855
Base.log
— Methodlog(A::AbstractMatrix)
如果 A
没有负实特征值,计算 A
的主矩阵对数,即唯一的矩阵 $X$ 使得 $e^X = A$ 且对于所有特征值 $\lambda$,满足 $-\pi < Im(\lambda) < \pi$。如果 A
有非正特征值,则在可能的情况下返回非主矩阵函数。
如果 A
是对称或厄米的,则使用其特征分解(eigen
),如果 A
是三角形的,则采用改进的逆缩放和平方方法(见 [AH12] 和 [AHR13])。如果 A
是实数且没有负特征值,则计算实施尔形式。否则,计算复施尔形式。然后在上三角(准)三角因子上使用 [AHR13] 中的上(准)三角算法。
示例
julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
julia> log(A)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
Base.sqrt
— Methodsqrt(x)
返回 $\sqrt{x}$。
对于负的 Real
参数会抛出 DomainError
。请改用复数负参数。请注意,sqrt
在负实轴上有一个分支切割。
前缀运算符 √
等同于 sqrt
。
另请参见: hypot
。
示例
julia> sqrt(big(81))
9.0
julia> sqrt(big(-81))
ERROR: DomainError with -81.0:
NaN result for non-NaN input.
Stacktrace:
[1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]
julia> sqrt(big(complex(-81)))
0.0 + 9.0im
julia> sqrt(-81 - 0.0im) # -0.0im 在分支切割下方
0.0 - 9.0im
julia> .√(1:4)
4-element Vector{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
sqrt(A::AbstractMatrix)
如果 A
没有负的实特征值,计算 A
的主矩阵平方根,即唯一的矩阵 $X$,其特征值具有正实部,使得 $X^2 = A$。否则,将返回非主平方根。
如果 A
是实对称或厄米矩阵,则使用其特征分解 (eigen
) 来计算平方根。对于这样的矩阵,由于舍入误差而略微负的特征值 λ 被视为零。更准确地说,所有特征值 ≥ -rtol*(max |λ|)
的矩阵被视为半正定(产生一个厄米平方根),负特征值被视为零。rtol
是 sqrt
的一个关键字参数(仅在厄米/实对称情况下),默认为机器精度乘以 size(A,1)
。
否则,平方根通过 Björck-Hammarling 方法 [BH83] 确定,该方法计算复 Schur 形式 (schur
),然后计算三角因子的复平方根。如果存在实平方根,则使用该方法的扩展 [H87],该扩展计算实 Schur 形式,然后计算准三角因子的实平方根。
示例
julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
4 0
0 4
julia> sqrt(A)
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
Base.Math.cbrt
— Methodcbrt(A::AbstractMatrix{<:Real})
计算实值矩阵 A
的实值立方根。如果 T = cbrt(A)
,则我们有 T*T*T ≈ A
,请参见下面给出的示例。
如果 A
是对称的,即类型为 HermOrSym{<:Real}
,则使用 (eigen
) 来找到立方根。否则,利用专门的 p 次根算法 [S03],该算法利用实值 Schur 分解 (schur
) 来计算立方根。
示例
julia> A = [0.927524 -0.15857; -1.3677 -1.01172]
2×2 Matrix{Float64}:
0.927524 -0.15857
-1.3677 -1.01172
julia> T = cbrt(A)
2×2 Matrix{Float64}:
0.910077 -0.151019
-1.30257 -0.936818
julia> T*T*T ≈ A
true
Base.cos
— Methodcos(A::AbstractMatrix)
计算方阵 A
的矩阵余弦。
如果 A
是对称的或厄米的,则使用其特征分解 (eigen
) 来计算余弦。否则,通过调用 exp
来确定余弦。
示例
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sin
— Methodsin(A::AbstractMatrix)
计算方阵 A
的矩阵正弦。
如果 A
是对称的或厄米的,则使用其特征分解 (eigen
) 来计算正弦。否则,通过调用 exp
来确定正弦。
示例
julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
Base.Math.sincos
— Methodsincos(A::AbstractMatrix)
计算方阵 A
的矩阵正弦和余弦。
示例
julia> S, C = sincos(fill(1.0, (2,2)));
julia> S
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
julia> C
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.tan
— Methodtan(A::AbstractMatrix)
计算方阵 A
的矩阵切线。
如果 A
是对称的或厄米的,则使用其特征分解 (eigen
) 来计算切线。否则,通过调用 exp
来确定切线。
示例
julia> tan(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
-1.09252 -1.09252
-1.09252 -1.09252
Base.Math.sec
— Methodsec(A::AbstractMatrix)
计算方阵 A
的矩阵正割。
Base.Math.csc
— Methodcsc(A::AbstractMatrix)
计算方阵 A
的矩阵余割。
Base.Math.cot
— Methodcot(A::AbstractMatrix)
计算方阵 A
的矩阵余切。
Base.cosh
— Methodcosh(A::AbstractMatrix)
计算方阵 A
的矩阵双曲余弦。
Base.sinh
— Methodsinh(A::AbstractMatrix)
计算方阵 A
的矩阵双曲正弦。
Base.tanh
— Methodtanh(A::AbstractMatrix)
计算方阵 A
的矩阵双曲正切。
Base.Math.sech
— Methodsech(A::AbstractMatrix)
计算方阵 A
的矩阵双曲余割。
Base.Math.csch
— Methodcsch(A::AbstractMatrix)
计算方阵 A
的矩阵双曲余割。
Base.Math.coth
— Methodcoth(A::AbstractMatrix)
计算方阵 A
的矩阵双曲余切。
Base.acos
— Methodacos(A::AbstractMatrix)
计算方阵 A
的逆矩阵余弦。
如果 A
是对称的或厄米的,则使用其特征分解 (eigen
) 来计算逆余弦。否则,逆余弦是通过使用 log
和 sqrt
来确定的。有关用于计算此函数的理论和对数公式,请参见 [AH16_1]。
示例
julia> acos(cos([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-8.32667e-17im 0.1+0.0im
-0.2+2.63678e-16im 0.3-3.46945e-16im
Base.asin
— Methodasin(A::AbstractMatrix)
计算方阵 A
的逆矩阵正弦。
如果 A
是对称的或厄米的,则使用其特征分解 (eigen
) 来计算逆正弦。否则,逆正弦是通过使用 log
和 sqrt
来确定的。有关用于计算此函数的理论和对数公式,请参见 [AH16_2]。
示例
julia> asin(sin([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-4.16334e-17im 0.1-5.55112e-17im
-0.2+9.71445e-17im 0.3-1.249e-16im
Base.atan
— Methodatan(A::AbstractMatrix)
计算方阵 A
的逆矩阵正切。
如果 A
是对称或厄米矩阵,则使用其特征分解 (eigen
) 来计算逆正切。否则,逆正切通过使用 log
来确定。有关用于计算此函数的理论和对数公式,请参见 [AH16_3]。
示例
julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5+1.38778e-17im 0.1-2.77556e-17im
-0.2+6.93889e-17im 0.3-4.16334e-17im
Base.Math.asec
— Methodasec(A::AbstractMatrix)
计算矩阵 A
的逆割线。
Base.Math.acsc
— Methodacsc(A::AbstractMatrix)
计算 A
的逆矩阵余弦。
Base.Math.acot
— Methodacot(A::AbstractMatrix)
计算 A
的逆矩阵余切。
Base.acosh
— Methodacosh(A::AbstractMatrix)
计算方阵 A
的反双曲余弦矩阵。有关用于计算此函数的理论和对数公式,请参见 [AH16_4]。
Base.asinh
— Methodasinh(A::AbstractMatrix)
计算方阵 A
的反双曲正弦矩阵。有关用于计算此函数的理论和对数公式,请参见 [AH16_5]。
Base.atanh
— Methodatanh(A::AbstractMatrix)
计算方阵 A
的逆双曲矩阵切线。有关用于计算此函数的理论和对数公式,请参见 [AH16_6]。
Base.Math.asech
— Methodasech(A::AbstractMatrix)
计算 A
的逆矩阵双曲正割。
Base.Math.acsch
— Methodacsch(A::AbstractMatrix)
计算 A
的逆矩阵双曲余割。
Base.Math.acoth
— Methodacoth(A::AbstractMatrix)
计算 A
的逆矩阵双曲余切。
LinearAlgebra.lyap
— Functionlyap(A, C)
计算连续李雅普诺夫方程 AX + XA' + C = 0
的解 X
,其中 A
的特征值没有零实部,并且没有两个特征值是负的共轭复数。
示例
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> X = lyap(A, B)
2×2 Matrix{Float64}:
0.5 -0.5
-0.5 0.25
julia> A*X + X*A' ≈ -B
true
LinearAlgebra.sylvester
— Functionsylvester(A, B, C)
计算Sylvester方程AX + XB + C = 0
的解X
,其中A
、B
和C
具有兼容的维度,并且A
和-B
没有具有相等实部的特征值。
示例
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
1.0 2.0
-2.0 1.0
julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
-4.46667 1.93333
3.73333 -1.8
julia> A*X + X*B ≈ -C
true
LinearAlgebra.issuccess
— Functionissuccess(F::Factorization)
测试矩阵的因式分解是否成功。
issuccess(::CholeskyPivoted)
需要 Julia 1.6 或更高版本。
示例
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
true
issuccess(F::LU; allowsingular = false)
测试矩阵的 LU 分解是否成功。默认情况下,产生有效但秩不足的 U 因子的分解被视为失败。通过传递 allowsingular = true
可以更改此行为。
allowsingular
关键字参数是在 Julia 1.11 中添加的。
示例
julia> F = lu([1 2; 1 2], check = false);
julia> issuccess(F)
false
julia> issuccess(F, allowsingular = true)
true
LinearAlgebra.issymmetric
— Functionissymmetric(A) -> Bool
测试一个矩阵是否是对称的。
示例
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> issymmetric(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> issymmetric(b)
false
LinearAlgebra.isposdef
— Functionisposdef(A) -> Bool
测试一个矩阵是否是正定的(和厄米的),通过尝试对 A
进行 Cholesky 分解。
示例
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!
— Functionisposdef!(A) -> Bool
测试一个矩阵是否为正定(和厄米)通过尝试对 A
进行 Cholesky 分解,并在此过程中覆盖 A
。另见 isposdef
。
示例
julia> A = [1. 2.; 2. 50.];
julia> isposdef!(A)
true
julia> A
2×2 Matrix{Float64}:
1.0 2.0
2.0 6.78233
LinearAlgebra.istril
— Functionistril(A::AbstractMatrix, k::Integer = 0) -> Bool
测试 A
是否是从第 k
个超对角线开始的下三角矩阵。
示例
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istril(a)
false
julia> istril(a, 1)
true
julia> c = [1 1 0; 1 1 1; 1 1 1]
3×3 Matrix{Int64}:
1 1 0
1 1 1
1 1 1
julia> istril(c)
false
julia> istril(c, 1)
true
LinearAlgebra.istriu
— Functionistriu(A::AbstractMatrix, k::Integer = 0) -> Bool
测试 A
是否是从第 k
个超对角线开始的上三角矩阵。
示例
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istriu(a)
false
julia> istriu(a, -1)
true
julia> c = [1 1 1; 1 1 1; 0 1 1]
3×3 Matrix{Int64}:
1 1 1
1 1 1
0 1 1
julia> istriu(c)
false
julia> istriu(c, -1)
true
LinearAlgebra.isdiag
— Functionisdiag(A) -> Bool
测试一个矩阵是否是对角矩阵,意思是除非 i == j
,否则 iszero(A[i,j])
为真。请注意,A
不必是方阵;如果您还想检查这一点,您需要检查 size(A, 1) == size(A, 2)
。
示例
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> isdiag(a)
false
julia> b = [im 0; 0 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 0+0im
0+0im 0-1im
julia> isdiag(b)
true
julia> c = [1 0 0; 0 2 0]
2×3 Matrix{Int64}:
1 0 0
0 2 0
julia> isdiag(c)
true
julia> d = [1 0 0; 0 2 3]
2×3 Matrix{Int64}:
1 0 0
0 2 3
julia> isdiag(d)
false
LinearAlgebra.ishermitian
— Functionishermitian(A) -> Bool
测试一个矩阵是否是厄米矩阵。
示例
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> ishermitian(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> ishermitian(b)
true
Base.transpose
— Functiontranspose(A)
懒转置。修改返回的对象应适当地修改 A
。通常,但并不总是,返回 Transpose(A)
,其中 Transpose
是一个懒转置包装器。请注意,此操作是递归的。
此操作旨在用于线性代数 - 有关一般数据操作,请参见 permutedims
,该操作是非递归的。
示例
julia> A = [3 2; 0 0]
2×2 Matrix{Int64}:
3 2
0 0
julia> B = transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
3 0
2 0
julia> B isa Transpose
true
julia> transpose(B) === A # 转置的转置解包父对象
true
julia> Transpose(B) # 然而,构造函数始终包装其参数
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # 修改 B 将自动修改 A
julia> A
2×2 Matrix{Int64}:
3 2
4 0
对于复数矩阵,adjoint
操作等同于共轭转置。
julia> A = reshape([Complex(x, x) for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
1+1im 3+3im
2+2im 4+4im
julia> adjoint(A) == conj(transpose(A))
true
AbstractVector
的 transpose
是一个行向量:
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # 返回一个行向量
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # 计算点积
14
对于矩阵的矩阵,单个块是递归操作的:
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # 构造一个块矩阵
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # 块被递归转置
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
[1 2; 3 4] [2 4; 6 8]
[3 6; 9 12] [4 8; 12 16]
transpose(F::Factorization)
因式分解 F
的惰性转置。默认情况下,返回一个 TransposeFactorization
,但对于具有实数 eltype
的 Factorization
,则返回一个 AdjointFactorization
。
LinearAlgebra.transpose!
— Functiontranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
转置矩阵 A
并将其存储在矩阵 X
中。size(X)
必须等于 size(transpose(A))
。除非需要调整 X
的 rowval
和 nzval
,否则不分配额外的内存。
请参见 halfperm!
transpose!(dest,src)
转置数组 src
并将结果存储在预分配的数组 dest
中,dest
的大小应对应于 (size(src,2),size(src,1))
。不支持就地转置,如果 src
和 dest
有重叠的内存区域,将会发生意外结果。
示例
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> transpose!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3+2im 8+7im
9+2im 4+6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Transpose
— Type转置
用于底层线性代数对象的转置视图的惰性包装类型,通常是 AbstractVector
/AbstractMatrix
。通常不应直接调用 Transpose
构造函数,而应使用 transpose
代替。要实现视图,请使用 copy
。
此类型旨在用于线性代数使用 - 有关一般数据操作,请参见 permutedims
。
示例
julia> A = [2 3; 0 0]
2×2 Matrix{Int64}:
2 3
0 0
julia> Transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
2 0
3 0
LinearAlgebra.TransposeFactorization
— TypeTransposeFactorization
用于底层 Factorization
对象的转置的惰性包装类型。通常,不应直接调用 TransposeFactorization
构造函数,而应使用 transpose(:: Factorization)
代替。
Base.adjoint
— FunctionA'
adjoint(A)
惰性伴随(共轭转置)。请注意,adjoint
是递归地应用于元素的。
对于数字类型,adjoint
返回复共轭,因此对于实数来说,它等同于恒等函数。
此操作旨在用于线性代数 - 有关一般数据操作,请参见 permutedims
。
示例
julia> A = [3+2im 9+2im; 0 0]
2×2 矩阵{复数{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> B = A' # 等同于 adjoint(A)
2×2 adjoint(::矩阵{复数{Int64}}) 具有元素类型 复数{Int64}:
3-2im 0+0im
9-2im 0+0im
julia> B isa Adjoint
true
julia> adjoint(B) === A # 伴随的伴随解开父级
true
julia> Adjoint(B) # 然而,构造函数总是包装其参数
2×2 adjoint(adjoint(::矩阵{复数{Int64}})) 具有元素类型 复数{Int64}:
3+2im 9+2im
0+0im 0+0im
julia> B[1,2] = 4 + 5im; # 修改 B 将自动修改 A
julia> A
2×2 矩阵{复数{Int64}}:
3+2im 9+2im
4-5im 0+0im
对于实矩阵,adjoint
操作等同于 transpose
。
julia> A = reshape([x for x in 1:4], 2, 2)
2×2 矩阵{Int64}:
1 3
2 4
julia> A'
2×2 adjoint(::矩阵{Int64}) 具有元素类型 Int64:
1 2
3 4
julia> adjoint(A) == transpose(A)
true
AbstractVector
的伴随是行向量:
julia> x = [3, 4im]
2-element 向量{复数{Int64}}:
3 + 0im
0 + 4im
julia> x'
1×2 adjoint(::向量{复数{Int64}}) 具有元素类型 复数{Int64}:
3+0im 0-4im
julia> x'x # 计算点积,等同于 x' * x
25 + 0im
对于矩阵的矩阵,单个块是递归操作的:
julia> A = reshape([x + im*x for x in 1:4], 2, 2)
2×2 矩阵{复数{Int64}}:
1+1im 3+3im
2+2im 4+4im
julia> C = reshape([A, 2A, 3A, 4A], 2, 2)
2×2 矩阵{矩阵{复数{Int64}}}:
[1+1im 3+3im; 2+2im 4+4im] [3+3im 9+9im; 6+6im 12+12im]
[2+2im 6+6im; 4+4im 8+8im] [4+4im 12+12im; 8+8im 16+16im]
julia> C'
2×2 adjoint(::矩阵{矩阵{复数{Int64}}}) 具有元素类型 Adjoint{复数{Int64}, 矩阵{复数{Int64}}}:
[1-1im 2-2im; 3-3im 4-4im] [2-2im 4-4im; 6-6im 8-8im]
[3-3im 6-6im; 9-9im 12-12im] [4-4im 8-8im; 12-12im 16-16im]
adjoint(F::Factorization)
因式分解 F
的惰性伴随。默认返回一个 AdjointFactorization
包装器。
LinearAlgebra.adjoint!
— Functionadjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
转置矩阵 A
并将元素的伴随存储在矩阵 X
中。size(X)
必须等于 size(transpose(A))
。除了在需要时调整 X
的 rowval
和 nzval
之外,不会分配额外的内存。
请参见 halfperm!
adjoint!(dest,src)
共轭转置数组 src
并将结果存储在预分配的数组 dest
中,dest
的大小应对应于 (size(src,2),size(src,1))
。不支持就地转置,如果 src
和 dest
有重叠的内存区域,将会发生意外结果。
示例
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 矩阵{复数{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(复数{Int64}, 2, 2)
2×2 矩阵{复数{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> adjoint!(B, A);
julia> B
2×2 矩阵{复数{Int64}}:
3-2im 8-7im
9-2im 4-6im
julia> A
2×2 矩阵{复数{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Adjoint
— Type伴随
用于底层线性代数对象的伴随视图的惰性包装类型,通常是 AbstractVector
/AbstractMatrix
。通常,不应直接调用 Adjoint
构造函数,而应使用 adjoint
。要实现视图,请使用 copy
。
此类型旨在用于线性代数 - 有关一般数据操作,请参见 permutedims
。
示例
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> Adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
LinearAlgebra.AdjointFactorization
— TypeAdjointFactorization
用于底层 Factorization
对象的伴随的惰性包装类型。通常,不应直接调用 AdjointFactorization
构造函数,而应使用 adjoint(:: Factorization)
代替。
Base.copy
— Methodcopy(A::Transpose)
copy(A::Adjoint)
急切地评估惰性矩阵的转置/伴随。请注意,转置是递归地应用于元素的。
此操作旨在用于线性代数 - 有关一般数据操作,请参见 permutedims
,该操作是非递归的。
示例
julia> A = [1 2im; -3im 4]
2×2 Matrix{Complex{Int64}}:
1+0im 0+2im
0-3im 4+0im
julia> T = transpose(A)
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
1+0im 0-3im
0+2im 4+0im
julia> copy(T)
2×2 Matrix{Complex{Int64}}:
1+0im 0-3im
0+2im 4+0im
LinearAlgebra.stride1
— Functionstride1(A) -> Int
返回数组元素在维度 1 中的连续距离,以元素大小为单位。
示例
julia> A = [1,2,3,4]
4-element Vector{Int64}:
1
2
3
4
julia> LinearAlgebra.stride1(A)
1
julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
2
4
julia> LinearAlgebra.stride1(B)
2
LinearAlgebra.checksquare
— FunctionLinearAlgebra.checksquare(A)
检查一个矩阵是否为方阵,然后返回其公共维度。对于多个参数,返回一个向量。
示例
julia> A = fill(1, (4,4)); B = fill(1, (5,5));
julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
4
5
LinearAlgebra.peakflops
— FunctionLinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)
peakflops
通过使用双精度 gemm!
计算计算机的峰值浮点运算速率。默认情况下,如果未指定任何参数,它将乘以两个大小为 n x n
的 Float64
矩阵,其中 n = 4096
。如果底层的 BLAS 使用多个线程,则可以实现更高的浮点运算速率。BLAS 线程的数量可以通过 BLAS.set_num_threads(n)
设置。
如果提供了关键字参数 eltype
,peakflops
将构造具有类型 eltype
的元素的矩阵以计算峰值浮点运算速率。
默认情况下,peakflops
将使用 3 次试验中的最佳计时。如果提供了关键字参数 ntrials
,peakflops
将使用指定的试验次数来选择最佳计时。
如果关键字参数 parallel
设置为 true
,peakflops
将在所有工作处理器上并行运行。将返回整个并行计算机的浮点运算速率。在并行运行时,仅使用 1 个 BLAS 线程。参数 n
仍然指的是在每个处理器上解决的问题的大小。
此函数至少需要 Julia 1.1。在 Julia 1.0 中,它可以从标准库 InteractiveUtils
中获得。
LinearAlgebra.hermitianpart
— Functionhermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
返回方阵 A
的厄米部分,定义为 (A + A') / 2
,作为一个 Hermitian
矩阵。对于实矩阵 A
,这也被称为 A
的对称部分;有时也称为“算子实部”。可选参数 uplo
控制 Hermitian
视图的相应参数。对于实矩阵,后者等同于 Symmetric
视图。
另请参见 hermitianpart!
以获取相应的就地操作。
此函数需要 Julia 1.10 或更高版本。
LinearAlgebra.hermitianpart!
— Functionhermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
就地覆盖方阵 A
的厄米部分 (A + A') / 2
,并返回 Hermitian(A, uplo)
。对于实矩阵 A
,这也被称为 A
的对称部分。
另请参见 hermitianpart
以获取相应的非就地操作。
此函数需要 Julia 1.10 或更高版本。
LinearAlgebra.copy_adjoint!
— Functioncopy_adjoint!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
高效地将矩阵 A
的元素复制到 B
,并进行伴随操作,如下所示:
B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]
元素 B[ir_dest, jr_dest]
会被覆盖。此外,索引范围参数必须满足 length(ir_dest) == length(jr_src)
和 length(jr_dest) == length(ir_src)
。
LinearAlgebra.copy_transpose!
— Functioncopy_transpose!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
高效地将矩阵 A
的元素复制到 B
,并进行转置,如下所示:
B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]
元素 B[ir_dest, jr_dest]
会被覆盖。此外,索引范围参数必须满足 length(ir_dest) == length(jr_src)
和 length(jr_dest) == length(ir_src)
。
copy_transpose!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
tM::AbstractChar,
M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B
高效地将矩阵 M
的元素复制到 B
,条件是字符参数 tM
如下:
tM | 目标 | 源 |
---|---|---|
'N' | B[ir_dest, jr_dest] | transpose(M)[jr_src, ir_src] |
'T' | B[ir_dest, jr_dest] | M[jr_src, ir_src] |
'C' | B[ir_dest, jr_dest] | conj(M)[jr_src, ir_src] |
元素 B[ir_dest, jr_dest]
会被覆盖。此外,索引范围参数必须满足 length(ir_dest) == length(jr_src)
和 length(jr_dest) == length(ir_src)
。
另见 copyto!
和 copy_adjoint!
。
Low-level matrix operations
在许多情况下,矩阵操作有就地版本,允许您提供一个预分配的输出向量或矩阵。这在优化关键代码时非常有用,以避免重复分配的开销。这些就地操作在下面以 !
结尾(例如 mul!
),符合通常的 Julia 约定。
LinearAlgebra.mul!
— Functionmul!(Y, A, B) -> Y
计算矩阵-矩阵或矩阵-向量乘积 $A B$ 并将结果存储在 Y
中,覆盖 Y
的现有值。请注意,Y
不能与 A
或 B
发生别名。
示例
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; Y = similar(B);
julia> mul!(Y, A, B) === Y
true
julia> Y
2×2 Matrix{Float64}:
3.0 3.0
7.0 7.0
julia> Y == A * B
true
实现
对于自定义矩阵和向量类型,建议实现 5 个参数的 mul!
,而不是直接实现 3 个参数的 mul!
。
mul!(C, A, B, α, β) -> C
结合就地矩阵-矩阵或矩阵-向量乘加 $A B α + C β$。结果存储在 C
中,覆盖原有值。请注意,C
不能与 A
或 B
发生别名。
五个参数的 mul!
至少需要 Julia 1.3。
示例
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; C = [1.0 2.0; 3.0 4.0];
julia> α, β = 100.0, 10.0;
julia> mul!(C, A, B, α, β) === C
true
julia> C
2×2 Matrix{Float64}:
310.0 320.0
730.0 740.0
julia> C_original = [1.0 2.0; 3.0 4.0]; # C 的原始值的副本
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!
— Functionlmul!(a::Number, B::AbstractArray)
通过标量 a
缩放数组 B
,并就地覆盖 B
。使用 rmul!
从右侧乘以标量。缩放操作遵循 a
与 B
中元素之间的乘法 *
语义。特别地,这也适用于涉及非有限数的乘法,例如 NaN
和 ±Inf
。
在 Julia 1.1 之前,B
中的 NaN
和 ±Inf
条目处理不一致。
示例
julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> lmul!(2, B)
2×2 Matrix{Int64}:
2 4
6 8
julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
NaN
lmul!(A, B)
计算矩阵-矩阵乘积 $AB$,覆盖 B
,并返回结果。这里,A
必须是特殊矩阵类型,例如 Diagonal
、UpperTriangular
或 LowerTriangular
,或某种正交类型,参见 QR
。
示例
julia> B = [0 1; 1 0];
julia> A = UpperTriangular([1 2; 0 3]);
julia> lmul!(A, B);
julia> B
2×2 Matrix{Int64}:
2 1
3 0
julia> B = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
3.0 4.0
1.0 2.0
LinearAlgebra.rmul!
— Functionrmul!(A::AbstractArray, b::Number)
通过标量 b
缩放数组 A
,并就地覆盖 A
。使用 lmul!
从左侧乘以标量。缩放操作遵循 A
的元素与 b
之间的乘法 *
的语义。特别地,这也适用于涉及非有限数的乘法,例如 NaN
和 ±Inf
。
在 Julia 1.1 之前,A
中的 NaN
和 ±Inf
条目处理不一致。
示例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> rmul!(A, 2)
2×2 Matrix{Int64}:
2 4
6 8
julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
NaN
rmul!(A, B)
计算矩阵-矩阵乘积 $AB$,覆盖 A
,并返回结果。这里,B
必须是特殊矩阵类型,例如 Diagonal
、UpperTriangular
或 LowerTriangular
,或某种正交类型,参见 QR
。
示例
julia> A = [0 1; 1 0];
julia> B = UpperTriangular([1 2; 0 3]);
julia> rmul!(A, B);
julia> A
2×2 Matrix{Int64}:
0 3
1 2
julia> A = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
2.0 1.0
4.0 3.0
LinearAlgebra.ldiv!
— Functionldiv!(Y, A, B) -> Y
计算 A \ B
并将结果存储在 Y
中,返回结果。
参数 A
不 应该是一个矩阵。相反,它应该是一个分解对象(例如,由 factorize
或 cholesky
生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu!
进行就地操作),而在性能关键的情况下,通常需要对 A
的分解进行细粒度控制。
某些结构化矩阵类型,例如 Diagonal
和 UpperTriangular
,是被允许的,因为它们已经处于分解形式
示例
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = zero(X);
julia> ldiv!(Y, qr(A), X);
julia> Y ≈ A\X
true
ldiv!(A, B)
计算 A \ B
,并在原地覆盖 B
以存储结果。
参数 A
不应 是一个矩阵。相反,它应该是一个分解对象(例如,由 factorize
或 cholesky
生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu!
在原地完成),而在性能关键的情况下,通常需要对 A
的分解进行细粒度控制。
某些结构化矩阵类型,例如 Diagonal
和 UpperTriangular
,是允许的,因为它们已经处于分解形式
示例
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = copy(X);
julia> ldiv!(qr(A), X);
julia> X ≈ A\Y
true
ldiv!(a::Number, B::AbstractArray)
将数组 B
中的每个条目除以标量 a
,并就地覆盖 B
。使用 rdiv!
从右侧除以标量。
示例
julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B
通过带部分主元的高斯消元法就地计算 A \ B
,并将结果存储在 B
中,返回结果。在此过程中,A
的对角线也会被覆盖。
ldiv!
对于 Tridiagonal
左侧需要至少 Julia 1.11。
LinearAlgebra.rdiv!
— Functionrdiv!(A, B)
计算 A / B
并在原地覆盖 A
以存储结果。
参数 B
不应 是一个矩阵。相反,它应该是一个分解对象(例如,由 factorize
或 cholesky
生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu!
在原地完成),而在性能关键的情况下,通常也需要对 B
的分解进行细粒度控制。
某些结构化矩阵类型,例如 Diagonal
和 UpperTriangular
,是被允许的,因为它们已经处于分解形式。
rdiv!(A::AbstractArray, b::Number)
将数组 A
中的每个条目除以标量 b
,并就地覆盖 A
。使用 ldiv!
从左侧除以标量。
示例
julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
BLAS functions
在Julia(如同许多科学计算中),密集线性代数操作基于LAPACK library,而这又是建立在被称为BLAS的基本线性代数构建块之上。对于每种计算机架构,都有高度优化的BLAS实现,有时在高性能线性代数例程中,直接调用BLAS函数是很有用的。
LinearAlgebra.BLAS
提供了一些 BLAS 函数的封装。那些覆盖输入数组的 BLAS 函数的名称以 '!'
结尾。通常,一个 BLAS 函数定义了四个方法,分别用于 Float32
、Float64
、ComplexF32
和 ComplexF64
数组。
BLAS character arguments
许多 BLAS 函数接受参数,这些参数决定是否转置一个参数(trans
),引用矩阵的哪个三角形(uplo
或 ul
),是否可以假设三角矩阵的对角线全为一(dA
),或者输入参数属于矩阵乘法的哪一侧(side
)。可能性包括:
Multiplication order
side | Meaning |
---|---|
'L' | The argument goes on the left side of a matrix-matrix operation. |
'R' | The argument goes on the right side of a matrix-matrix operation. |
Triangle referencing
uplo /ul | Meaning |
---|---|
'U' | Only the upper triangle of the matrix will be used. |
'L' | Only the lower triangle of the matrix will be used. |
Transposition operation
trans /tX | Meaning |
---|---|
'N' | The input matrix X is not transposed or conjugated. |
'T' | The input matrix X will be transposed. |
'C' | The input matrix X will be conjugated and transposed. |
Unit diagonal
diag /dX | Meaning |
---|---|
'N' | The diagonal values of the matrix X will be read. |
'U' | The diagonal of the matrix X is assumed to be all ones. |
LinearAlgebra.BLAS
— ModuleBLAS子例程的接口。
LinearAlgebra.BLAS.set_num_threads
— Functionset_num_threads(n::Integer)
set_num_threads(::Nothing)
将 BLAS 库应使用的线程数设置为 n::Integer
。
也接受 nothing
,在这种情况下,julia 会尝试猜测默认的线程数。传递 nothing
不被推荐,主要是出于历史原因。
LinearAlgebra.BLAS.get_num_threads
— Functionget_num_threads()
获取BLAS库正在使用的线程数量。
get_num_threads
至少需要Julia 1.6。
BLAS 函数可以分为三组,也称为三个级别,这取决于它们首次提出的时间、输入参数的类型以及操作的复杂性。
Level 1 BLAS functions
第 1 级 BLAS 函数最早在 [(Lawson, 1979)][Lawson-1979] 中提出,定义了标量和向量之间的操作。
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!
— Functionrot!(n, X, incx, Y, incy, c, s)
用 c*X + s*Y
覆盖 X
,并用 -conj(s)*X + c*Y
覆盖 Y
,针对数组 X
的前 n
个元素,步长为 incx
,以及数组 Y
的前 n
个元素,步长为 incy
。返回 X
和 Y
。
rot!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.scal!
— Functionscal!(n, a, X, incx)
scal!(a, X)
用 a*X
覆盖数组 X
的前 n
个元素,步长为 incx
。返回 X
。
如果未提供 n
和 incx
,则使用 length(X)
和 stride(X,1)
。
LinearAlgebra.BLAS.scal
— Functionscal(n, a, X, incx)
scal(a, X)
返回 X
的前 n
个元素乘以 a
,步长为 incx
。
如果未提供 n
和 incx
,则使用 length(X)
和 stride(X,1)
。
LinearAlgebra.BLAS.blascopy!
— Functionblascopy!(n, X, incx, Y, incy)
将数组 X
中的 n
个元素(步长为 incx
)复制到数组 Y
中(步长为 incy
)。返回 Y
。
LinearAlgebra.BLAS.dot
— Functiondot(n, X, incx, Y, incy)
两个向量的点积,由数组 X
中 n
个元素(步幅为 incx
)和数组 Y
中 n
个元素(步幅为 incy
)组成。
示例
julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
LinearAlgebra.BLAS.dotu
— Functiondotu(n, X, incx, Y, incy)
用于两个复数向量的点积函数,包含 n
个元素的数组 X
,步长为 incx
,以及 n
个元素的数组 Y
,步长为 incy
。
示例
julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
-10.0 + 10.0im
LinearAlgebra.BLAS.dotc
— Functiondotc(n, X, incx, U, incy)
用于两个复数向量的点积函数,由数组 X
的 n
个元素(步长为 incx
)和数组 U
的 n
个元素(步长为 incy
)组成,对第一个向量进行共轭。
示例
julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
LinearAlgebra.BLAS.nrm2
— Functionnrm2(n, X, incx)
由数组 X
中 n
个元素组成的向量的 2-范数,步长为 incx
。
示例
julia> BLAS.nrm2(4, fill(1.0, 8), 2)
2.0
julia> BLAS.nrm2(1, fill(1.0, 8), 2)
1.0
LinearAlgebra.BLAS.asum
— Functionasum(n, X, incx)
数组 X
的前 n
个元素的幅度之和,步长为 incx
。
对于实数数组,幅度是绝对值。对于复数数组,幅度是实部的绝对值与虚部的绝对值之和。
示例
julia> BLAS.asum(5, fill(1.0im, 10), 2)
5.0
julia> BLAS.asum(2, fill(1.0im, 10), 5)
2.0
LinearAlgebra.BLAS.iamax
— Functioniamax(n, dx, incx)
iamax(dx)
找到 dx
中绝对值最大的元素的索引。n
是 dx
的长度,incx
是步幅。如果未提供 n
和 incx
,则假定默认值为 n=length(dx)
和 incx=stride1(dx)
。
Level 2 BLAS functions
二级 BLAS 函数在 [(Dongarra, 1988)][Dongarra-1988] 中发布,定义了矩阵-向量操作。
[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291
返回一个向量
LinearAlgebra.BLAS.gemv!
— Functiongemv!(tA, alpha, A, x, beta, y)
更新向量 y
为 alpha*A*x + beta*y
或 alpha*A'x + beta*y
,具体取决于 tA
。alpha
和 beta
是标量。返回更新后的 y
。
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, alpha, A, x)
返回 alpha*A*x
或 alpha*A'x
,具体取决于 tA
。alpha
是一个标量。
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, A, x)
根据 tA
返回 A*x
或 A'x
。
LinearAlgebra.BLAS.gbmv!
— Functiongbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
根据 trans
更新向量 y
为 alpha*A*x + beta*y
或 alpha*A'*x + beta*y
。矩阵 A
是一个维度为 m
x size(A,2)
的一般带状矩阵,具有 kl
个下对角线和 ku
个上对角线。alpha
和 beta
是标量。返回更新后的 y
。
LinearAlgebra.BLAS.gbmv
— Functiongbmv(trans, m, kl, ku, alpha, A, x)
根据 trans
返回 alpha*A*x
或 alpha*A'*x
。矩阵 A
是一个维度为 m
乘 size(A,2)
的一般带状矩阵,具有 kl
个下对角线和 ku
个上对角线,alpha
是一个标量。
LinearAlgebra.BLAS.hemv!
— Functionhemv!(ul, alpha, A, x, beta, y)
更新向量 y
为 alpha*A*x + beta*y
。假设 A
是厄米的。仅使用 A
的 ul
三角部分。alpha
和 beta
是标量。返回更新后的 y
。
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, alpha, A, x)
返回 alpha*A*x
。假设 A
是厄米的。仅使用 A
的 ul
三角部分。alpha
是一个标量。
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, A, x)
返回 A*x
。假设 A
是厄米的。仅使用 A
的 ul
三角部分。
LinearAlgebra.BLAS.hpmv!
— Functionhpmv!(uplo, α, AP, x, β, y)
更新向量 y
为 α*A*x + β*y
,其中 A
是以压缩格式 AP
提供的厄米矩阵。
当 uplo = 'U'
时,数组 AP 必须包含厄米矩阵的上三角部分,按列顺序压缩,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[1, 2]
和 A[2, 2]
,依此类推。
当 uplo = 'L'
时,数组 AP 必须包含厄米矩阵的下三角部分,按列顺序压缩,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[2, 1]
和 A[3, 1]
,依此类推。
标量输入 α
和 β
必须是复数或实数。
数组输入 x
、y
和 AP
必须都是 ComplexF32
或 ComplexF64
类型。
返回更新后的 y
。
hpmv!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.symv!
— Functionsymv!(ul, alpha, A, x, beta, y)
更新向量 y
为 alpha*A*x + beta*y
。假设 A
是对称的。仅使用 A
的 ul
三角部分。alpha
和 beta
是标量。返回更新后的 y
。
LinearAlgebra.BLAS.symv
— Methodsymv(ul, alpha, A, x)
返回 alpha*A*x
。假设 A
是对称的。仅使用 A
的 ul
三角部分。alpha
是一个标量。
LinearAlgebra.BLAS.symv
— Methodsymv(ul, A, x)
返回 A*x
。假设 A
是对称的。仅使用 A
的 ul
三角部分。
LinearAlgebra.BLAS.sbmv!
— Functionsbmv!(uplo, k, alpha, A, x, beta, y)
更新向量 y
为 alpha*A*x + beta*y
,其中 A
是一个对称带状矩阵,阶数为 size(A,2)
,具有 k
个超对角线,存储在参数 A
中。A
的存储布局在参考 BLAS 模块中描述,级别-2 BLAS 可在 https://www.netlib.org/lapack/explore-html/ 找到。仅使用 uplo
三角形的 A
。
返回更新后的 y
。
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, alpha, A, x)
返回 alpha*A*x
,其中 A
是一个阶数为 size(A,2)
的对称带状矩阵,具有在参数 A
中存储的 k
个超对角线。仅使用 A
的 uplo
三角部分。
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, A, x)
返回 A*x
,其中 A
是一个阶数为 size(A,2)
的对称带状矩阵,具有在参数 A
中存储的 k
个超对角线。仅使用 A
的 uplo
三角部分。
LinearAlgebra.BLAS.spmv!
— Functionspmv!(uplo, α, AP, x, β, y)
更新向量 y
为 α*A*x + β*y
,其中 A
是以压缩格式 AP
提供的对称矩阵。
当 uplo = 'U'
时,数组 AP 必须包含对称矩阵的上三角部分,按列顺序压缩,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[1, 2]
和 A[2, 2]
,依此类推。
当 uplo = 'L'
时,数组 AP 必须包含对称矩阵的下三角部分,按列顺序压缩,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[2, 1]
和 A[3, 1]
,依此类推。
标量输入 α
和 β
必须是实数。
数组输入 x
、y
和 AP
必须都是 Float32
或 Float64
类型。
返回更新后的 y
。
spmv!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.trmv!
— FunctionLinearAlgebra.BLAS.trmv
— FunctionLinearAlgebra.BLAS.trsv!
— FunctionLinearAlgebra.BLAS.trsv
— Function返回一个矩阵
LinearAlgebra.BLAS.ger!
— Functionger!(alpha, x, y, A)
矩阵 A
的秩-1 更新,使用向量 x
和 y
作为 alpha*x*y' + A
。
LinearAlgebra.BLAS.her!
— Functionher!(uplo, alpha, x, A)
仅适用于复数数组。对厄米矩阵 A
进行秩-1 更新,使用向量 x
进行更新,形式为 alpha*x*x' + A
。uplo
控制更新 A
的哪个三角部分。返回 A
。
LinearAlgebra.BLAS.syr!
— Functionsyr!(uplo, alpha, x, A)
对称矩阵 A
的秩-1 更新,使用向量 x
进行更新,形式为 alpha*x*transpose(x) + A
。uplo
控制更新 A
的哪个三角部分。返回 A
。
LinearAlgebra.BLAS.spr!
— Functionspr!(uplo, α, x, AP)
将矩阵 A
更新为 A+α*x*x'
,其中 A
是以压缩格式提供的对称矩阵 AP
,x
是一个向量。
当 uplo = 'U'
时,数组 AP 必须按列顺序压缩包含对称矩阵的上三角部分,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[1, 2]
和 A[2, 2]
,依此类推。
当 uplo = 'L'
时,数组 AP 必须按列顺序压缩包含对称矩阵的下三角部分,因此 AP[1]
包含 A[1, 1]
,AP[2]
和 AP[3]
分别包含 A[2, 1]
和 A[3, 1]
,依此类推。
标量输入 α
必须是实数。
数组输入 x
和 AP
必须都是 Float32
或 Float64
类型。返回更新后的 AP
。
spr!
至少需要 Julia 1.8。
Level 3 BLAS functions
第3级BLAS函数在[(Dongarra, 1990)][Dongarra-1990]中发布,定义了矩阵-矩阵操作。
[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!
— Functiongemmt!(uplo, tA, tB, alpha, A, B, beta, C)
根据 uplo
指定的下三角或上三角部分更新 C
,计算为 alpha*A*B + beta*C
或根据 tA
和 tB
的其他变体。返回更新后的 C
。
gemmt!
至少需要 Julia 1.11。
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, alpha, A, B)
返回由 uplo
指定的 A*B
的下三角或上三角部分,或根据 tA
和 tB
的其他三个变体。
gemmt
至少需要 Julia 1.11。
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, A, B)
返回由 uplo
指定的 A*B
的下三角或上三角部分,或根据 tA
和 tB
的其他三个变体。
gemmt
至少需要 Julia 1.11。
LinearAlgebra.BLAS.gemm!
— Functiongemm!(tA, tB, alpha, A, B, beta, C)
更新 C
为 alpha*A*B + beta*C
或根据 tA
和 tB
的其他三种变体。返回更新后的 C
。
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, alpha, A, B)
返回 alpha*A*B
或根据 tA
和 tB
的其他三种变体。
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, A, B)
返回 A*B
或根据 tA
和 tB
的其他三种变体。
LinearAlgebra.BLAS.symm!
— Functionsymm!(side, ul, alpha, A, B, beta, C)
根据 side
更新 C
为 alpha*A*B + beta*C
或 alpha*B*A + beta*C
。假设 A
是对称的。仅使用 A
的 ul
三角部分。返回更新后的 C
。
LinearAlgebra.BLAS.symm
— MethodLinearAlgebra.BLAS.symm
— MethodLinearAlgebra.BLAS.hemm!
— Functionhemm!(side, ul, alpha, A, B, beta, C)
根据 side
更新 C
为 alpha*A*B + beta*C
或 alpha*B*A + beta*C
。假设 A
是厄米的。仅使用 A
的 ul
三角部分。返回更新后的 C
。
LinearAlgebra.BLAS.hemm
— MethodLinearAlgebra.BLAS.hemm
— MethodLinearAlgebra.BLAS.syrk!
— Functionsyrk!(uplo, trans, alpha, A, beta, C)
对称矩阵 C
的秩-k 更新为 alpha*A*transpose(A) + beta*C
或 alpha*transpose(A)*A + beta*C
,具体取决于 trans
。仅使用 C
的 uplo
三角部分。返回 C
。
LinearAlgebra.BLAS.syrk
— Functionsyrk(uplo, trans, alpha, A)
根据 uplo
,返回 A
的上三角或下三角,或根据 trans
返回 alpha*A*transpose(A)
或 alpha*transpose(A)*A
。
LinearAlgebra.BLAS.herk!
— Functionherk!(uplo, trans, alpha, A, beta, C)
仅适用于复数数组。根据 trans
,对厄米矩阵 C
进行秩-k 更新,形式为 alpha*A*A' + beta*C
或 alpha*A'*A + beta*C
。仅更新 C
的 uplo
三角部分。返回 C
。
LinearAlgebra.BLAS.herk
— FunctionLinearAlgebra.BLAS.syr2k!
— Functionsyr2k!(uplo, trans, alpha, A, B, beta, C)
对称矩阵 C
的秩-2k 更新为 alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C
或 alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C
,具体取决于 trans
。仅使用 C
的 uplo
三角部分。返回 C
。
LinearAlgebra.BLAS.syr2k
— Functionsyr2k(uplo, trans, alpha, A, B)
返回 uplo
三角形的 alpha*A*transpose(B) + alpha*B*transpose(A)
或 alpha*transpose(A)*B + alpha*transpose(B)*A
,具体取决于 trans
。
syr2k(uplo, trans, A, B)
返回 uplo
三角形的 A*transpose(B) + B*transpose(A)
或 transpose(A)*B + transpose(B)*A
,具体取决于 trans
。
LinearAlgebra.BLAS.her2k!
— Functionher2k!(uplo, trans, alpha, A, B, beta, C)
Hermitian 矩阵 C
的 Rank-2k 更新为 alpha*A*B' + alpha*B*A' + beta*C
或 alpha*A'*B + alpha*B'*A + beta*C
,具体取决于 trans
。标量 beta
必须是实数。仅使用 C
的 uplo
三角部分。返回 C
。
LinearAlgebra.BLAS.her2k
— Functionher2k(uplo, trans, alpha, A, B)
返回 uplo
三角形的 alpha*A*B' + alpha*B*A'
或 alpha*A'*B + alpha*B'*A
,具体取决于 trans
。
LinearAlgebra.BLAS.trmm!
— Functiontrmm!(side, ul, tA, dA, alpha, A, B)
更新 B
为 alpha*A*B
或由 side
和 tA
确定的其他三种变体之一。仅使用 A
的 ul
三角形。dA
决定是否读取对角线值或假定它们都是一。返回更新后的 B
。
LinearAlgebra.BLAS.trmm
— Functiontrmm(side, ul, tA, dA, alpha, A, B)
返回 alpha*A*B
或由 side
和 tA
确定的其他三种变体之一。仅使用 A
的 ul
三角形。dA
决定是否读取对角线值或假定它们都是一。
LinearAlgebra.BLAS.trsm!
— Functiontrsm!(side, ul, tA, dA, alpha, A, B)
用 A*X = alpha*B
的解覆盖 B
,或根据 side
和 tA
确定的其他三种变体之一。仅使用 A
的 ul
三角形。dA
决定是否读取对角线值或假定它们都是一。返回更新后的 B
。
LinearAlgebra.BLAS.trsm
— Functiontrsm(side, ul, tA, dA, alpha, A, B)
返回 A*X = alpha*B
的解,或由 side
和 tA
确定的其他三种变体之一。仅使用 A
的 ul
三角形。dA
确定是否读取对角线值或假定它们都是一。
LAPACK functions
LinearAlgebra.LAPACK
提供了一些线性代数的 LAPACK 函数的封装。那些覆盖输入数组的函数名称以 '!'
结尾。
通常一个函数定义了4个方法,分别对应于 Float64
、Float32
、ComplexF64
和 ComplexF32
数组。
请注意,Julia 提供的 LAPACK API 可能会在未来发生变化。由于该 API 不是面向用户的,因此没有承诺在未来的版本中支持/弃用这一特定功能集。
LinearAlgebra.LAPACK
— ModuleLAPACK子例程的接口。
LinearAlgebra.LAPACK.gbtrf!
— Functiongbtrf!(kl, ku, m, AB) -> (AB, ipiv)
计算带状矩阵 AB
的 LU 分解。kl
是包含非零带的第一个下对角线,ku
是包含非零带的最后一个上对角线,m
是矩阵 AB
的第一个维度。返回就地的 LU 分解和用于的主元向量 ipiv
。
LinearAlgebra.LAPACK.gbtrs!
— Functiongbtrs!(trans, kl, ku, m, AB, ipiv, B)
求解方程 AB * X = B
。trans
决定 AB
的方向。它可以是 N
(不转置)、T
(转置)或 C
(共轭转置)。kl
是包含非零带的第一个下对角线,ku
是包含一个的最后上对角线,m
是矩阵 AB
的第一个维度。ipiv
是从 gbtrf!
返回的主元向量。返回向量或矩阵 X
,在原地覆盖 B
。
LinearAlgebra.LAPACK.gebal!
— Functiongebal!(job, A) -> (ilo, ihi, scale)
在计算矩阵 A
的特征系统或 Schur 分解之前,平衡矩阵 A
。job
可以是 N
(A
不会被置换或缩放)、P
(A
只会被置换)、S
(A
只会被缩放)或 B
(A
将同时被置换和缩放)。就地修改 A
并返回 ilo
、ihi
和 scale
。如果启用了置换,则 A[i,j] = 0
如果 j > i
且 1 < j < ilo
或 j > ihi
。scale
包含有关所执行的缩放/置换的信息。
LinearAlgebra.LAPACK.gebak!
— Functiongebak!(job, side, ilo, ihi, scale, V)
将使用 gebal!
平衡的矩阵的特征向量 V
转换为原始矩阵的未缩放/未排列的特征向量。就地修改 V
。side
可以是 L
(转换左特征向量)或 R
(转换右特征向量)。
LinearAlgebra.LAPACK.gebrd!
— Functiongebrd!(A) -> (A, d, e, tauq, taup)
将 A
原地减少为双对角形式 A = QBP'
。返回 A
,包含双对角矩阵 B
;d
,包含 B
的对角元素;e
,包含 B
的非对角元素;tauq
,包含表示 Q
的初等反射器;以及 taup
,包含表示 P
的初等反射器。
LinearAlgebra.LAPACK.gelqf!
— Functiongelqf!(A, tau)
计算 A
的 LQ
分解,A = LQ
。tau
包含标量,用于参数化分解的基本反射器。tau
的长度必须大于或等于 A
的最小维度。
返回就地修改的 A
和 tau
。
gelqf!(A) -> (A, tau)
计算 A
的 LQ
分解,A = LQ
。
返回 A
,在原地修改,并返回 tau
,其中包含参数化分解的初等反射器的标量。
LinearAlgebra.LAPACK.geqlf!
— Functiongeqlf!(A, tau)
计算 A
的 QL
分解,A = QL
。tau
包含标量,用于参数化分解的基本反射器。tau
的长度必须大于或等于 A
的最小维度。
返回就地修改的 A
和 tau
。
geqlf!(A) -> (A, tau)
计算 A
的 QL
分解,A = QL
。
返回 A
,就地修改,并返回 tau
,其中包含参数化分解的初等反射器的标量。
LinearAlgebra.LAPACK.geqrf!
— Functiongeqrf!(A, tau)
计算 A
的 QR
分解,A = QR
。tau
包含标量,用于参数化分解的初等反射器。tau
的长度必须大于或等于 A
的最小维度。
返回就地修改的 A
和 tau
。
geqrf!(A) -> (A, tau)
计算 A
的 QR
分解,A = QR
。
返回 A
,就地修改,并返回 tau
,其中包含参数化分解的初等反射器的标量。
LinearAlgebra.LAPACK.geqp3!
— Functiongeqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
计算 A
的带主元的 QR
分解,AP = QR
,使用 BLAS 级别 3。P
是一个主元矩阵,由 jpvt
表示。tau
存储基本反射器。参数 jpvt
和 tau
是可选的,允许传递预分配的数组。当传递时,如果 A
是一个 (m x n)
矩阵,则 jpvt
的长度必须大于或等于 n
,而 tau
的长度必须大于或等于 A
的最小维度。输入时,如果 jpvt[j]
不等于零,则 A
的第 j
列被置换到 AP
的前面。
A
、jpvt
和 tau
在原地被修改。
LinearAlgebra.LAPACK.gerqf!
— Functiongerqf!(A, tau)
计算 A
的 RQ
分解,A = RQ
。tau
包含参数化分解的初等反射器的标量。tau
的长度必须大于或等于 A
的最小维度。
返回就地修改的 A
和 tau
。
gerqf!(A) -> (A, tau)
计算 A
的 RQ
分解,A = RQ
。
返回 A
,就地修改,并返回 tau
,其中包含参数化分解的初等反射器的标量。
LinearAlgebra.LAPACK.geqrt!
— Functiongeqrt!(A, T)
计算 A
的分块 QR
分解,A = QR
。T
包含上三角块反射器,用于参数化分解的初等反射器。T
的第一个维度设置块大小,必须在 1 和 n
之间。T
的第二个维度必须等于 A
的最小维度。
返回就地修改的 A
和 T
。
geqrt!(A, nb) -> (A, T)
计算 A
的分块 QR
分解,A = QR
。nb
设置块大小,必须在 1 和 A
的第二维 n
之间。
返回 A
,就地修改,并返回 T
,其中包含上三角块反射器,参数化分解的初等反射器。
LinearAlgebra.LAPACK.geqrt3!
— Functiongeqrt3!(A, T)
递归计算 A
的分块 QR
分解,A = QR
。T
包含上三角块反射器,用于参数化分解的初等反射器。T
的第一维设置块大小,必须在 1 和 n
之间。T
的第二维必须等于 A
的最小维度。
返回就地修改的 A
和 T
。
geqrt3!(A) -> (A, T)
递归计算 A
的分块 QR
分解,A = QR
。
返回 A
,在原地修改,以及 T
,其中包含上三角块反射器,用于参数化分解的基本反射器。
LinearAlgebra.LAPACK.getrf!
— Functiongetrf!(A, ipiv) -> (A, ipiv, info)
计算 A
的带主元的 LU
分解,A = LU
。ipiv
包含主元信息,info
是一个代码,指示成功(info = 0
)、U
中的奇异值(info = i
,在这种情况下 U[i,i]
是奇异的),或错误代码(info < 0
)。
getrf!(A) -> (A, ipiv, info)
计算 A
的带主元的 LU
分解,A = LU
。
返回修改后的 A
、主元信息 ipiv
和一个 info
代码,指示成功(info = 0
)、U
中的奇异值(info = i
,在这种情况下 U[i,i]
是奇异的)或错误代码(info < 0
)。
LinearAlgebra.LAPACK.tzrzf!
— Functiontzrzf!(A) -> (A, tau)
将上三角梯形矩阵 A
原地转换为上三角形形式。返回 A
和 tau
,即变换的初等反射器的标量参数。
LinearAlgebra.LAPACK.ormrz!
— Functionormrz!(side, trans, A, tau, C)
将矩阵 C
乘以由 tzrzf!
提供的变换中的 Q
。根据 side
或 trans
,乘法可以是左侧的(side = L, Q*C
)或右侧的(side = R, C*Q
),并且 Q
可以是未修改的(trans = N
)、转置的(trans = T
)或共轭转置的(trans = C
)。返回矩阵 C
,该矩阵在原地被修改为乘法的结果。
LinearAlgebra.LAPACK.gels!
— Functiongels!(trans, A, B) -> (F, B, ssr)
求解线性方程 A * X = B
、transpose(A) * X = B
或 adjoint(A) * X = B
,使用 QR 或 LQ 分解。就地修改矩阵/向量 B
以得到解。A
被其 QR
或 LQ
分解覆盖。trans
可以是 N
(不修改)、T
(转置)或 C
(共轭转置)。gels!
寻找最小范数/最小二乘解。A
可能是欠定或超定的。解返回在 B
中。
LinearAlgebra.LAPACK.gesv!
— Functiongesv!(A, B) -> (B, A, ipiv)
求解线性方程 A * X = B
,其中 A
是一个方阵,使用 A
的 LU
分解。A
被覆盖为其 LU
分解,B
被覆盖为解 X
。ipiv
包含 A
的 LU
分解的主元信息。
LinearAlgebra.LAPACK.getrs!
— Functiongetrs!(trans, A, ipiv, B)
求解线性方程 A * X = B
、transpose(A) * X = B
或 adjoint(A) * X = B
,其中 A
为方阵。就地修改矩阵/向量 B
以得到解。A
是来自 getrf!
的 LU
分解,ipiv
是主元信息。trans
可以是 N
(不修改)、T
(转置)或 C
(共轭转置)。
LinearAlgebra.LAPACK.getri!
— Functiongetri!(A, ipiv)
计算 A
的逆,使用通过 getrf!
找到的 LU
分解。ipiv
是输出的主元信息,A
包含 getrf!
的 LU
分解。A
被覆盖为其逆。
LinearAlgebra.LAPACK.gesvx!
— Functiongesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)
求解线性方程 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
) 或 adjoint(A) * X = B
(trans = C
),使用 A
的 LU
分解。fact
可以是 E
,在这种情况下 A
将被平衡并复制到 AF
;可以是 F
,在这种情况下 AF
和 ipiv
来自先前的 LU
分解作为输入;或者是 N
,在这种情况下 A
将被复制到 AF
然后进行分解。如果 fact = F
,equed
可以是 N
,表示 A
尚未平衡;R
,表示 A
从左侧乘以 Diagonal(R)
;C
,表示 A
从右侧乘以 Diagonal(C)
;或 B
,表示 A
从左侧乘以 Diagonal(R)
并从右侧乘以 Diagonal(C)
。如果 fact = F
且 equed = R
或 B
,则 R
的所有元素必须为正。如果 fact = F
且 equed = C
或 B
,则 C
的所有元素必须为正。
返回解 X
;equed
,如果 fact
不是 N
,则为输出,描述所执行的平衡;R
,行平衡对角线;C
,列平衡对角线;B
,可能会被其平衡形式 Diagonal(R)*B
(如果 trans = N
且 equed = R,B
)或 Diagonal(C)*B
(如果 trans = T,C
且 equed = C,B
)覆盖;rcond
,平衡后 A
的倒数条件数;ferr
,每个解向量在 X
中的前向误差界限;berr
,每个解向量在 X
中的前向误差界限;以及 work
,倒数主元增长因子。
gesvx!(A, B)
gesvx!
的无平衡、无转置简化。
LinearAlgebra.LAPACK.gelsd!
— Functiongelsd!(A, B, rcond) -> (B, rnk)
计算 A * X = B
的最小范数解,通过找到 A
的 SVD
分解,然后对问题进行分治。B
被覆盖为解 X
。小于 rcond
的奇异值将被视为零。返回的解在 B
中,A
的有效秩在 rnk
中。
LinearAlgebra.LAPACK.gelsy!
— Functiongelsy!(A, B, rcond) -> (B, rnk)
计算 A * X = B
的最小范数解,通过找到 A
的完整 QR
分解,然后对问题进行分治。B
被覆盖为解 X
。小于 rcond
的奇异值将被视为零。返回的解在 B
中,A
的有效秩在 rnk
中。
LinearAlgebra.LAPACK.gglse!
— Functiongglse!(A, c, B, d) -> (X,res)
求解方程 A * x = c
,其中 x
受到等式约束 B * x = d
。使用公式 ||c - A*x||^2 = 0
进行求解。返回 X
和残差平方和。
LinearAlgebra.LAPACK.geev!
— Functiongeev!(jobvl, jobvr, A) -> (W, VL, VR)
找到 A
的特征系统。如果 jobvl = N
,则不计算 A
的左特征向量。如果 jobvr = N
,则不计算 A
的右特征向量。如果 jobvl = V
或 jobvr = V
,则计算相应的特征向量。返回特征值在 W
中,右特征向量在 VR
中,左特征向量在 VL
中。
LinearAlgebra.LAPACK.gesdd!
— Functiongesdd!(job, A) -> (U, S, VT)
找到 A
的奇异值分解,A = U * S * V'
,使用分治法。如果 job = A
,则计算 U
的所有列和 V'
的所有行。如果 job = N
,则不计算 U
的任何列或 V'
的任何行。如果 job = O
,则用(稀疏)U
的列和(稀疏)V'
的行覆盖 A
。如果 job = S
,则计算并单独返回(稀疏)U
的列和(稀疏)V'
的行。
LinearAlgebra.LAPACK.gesvd!
— Functiongesvd!(jobu, jobvt, A) -> (U, S, VT)
找到 A
的奇异值分解,A = U * S * V'
。如果 jobu = A
,则计算 U
的所有列。如果 jobvt = A
,则计算 V'
的所有行。如果 jobu = N
,则不计算 U
的任何列。如果 jobvt = N
,则不计算 V'
的任何行。如果 jobu = O
,则用(稀疏)U
的列覆盖 A
。如果 jobvt = O
,则用(稀疏)V'
的行覆盖 A
。如果 jobu = S
,则计算(稀疏)U
的列并单独返回。如果 jobvt = S
,则计算(稀疏)V'
的行并单独返回。jobu
和 jobvt
不能同时为 O
。
返回 U
、S
和 Vt
,其中 S
是 A
的奇异值。
LinearAlgebra.LAPACK.ggsvd!
— Functionggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
找到 A
和 B
的广义奇异值分解,U'*A*Q = D1*R
和 V'*B*Q = D2*R
。D1
的对角线上有 alpha
,D2
的对角线上有 beta
。如果 jobu = U
,则计算正交/单位矩阵 U
。如果 jobv = V
,则计算正交/单位矩阵 V
。如果 jobq = Q
,则计算正交/单位矩阵 Q
。如果 jobu
、jobv
或 jobq
为 N
,则不计算该矩阵。此函数仅在 3.6.0 之前的 LAPACK 版本中可用。
LinearAlgebra.LAPACK.ggsvd3!
— Functionggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
找到 A
和 B
的广义奇异值分解,U'*A*Q = D1*R
和 V'*B*Q = D2*R
。D1
的对角线上有 alpha
,D2
的对角线上有 beta
。如果 jobu = U
,则计算正交/单位矩阵 U
。如果 jobv = V
,则计算正交/单位矩阵 V
。如果 jobq = Q
,则计算正交/单位矩阵 Q
。如果 jobu
、jobv
或 jobq
为 N
,则不计算该矩阵。此函数需要 LAPACK 3.6.0。
LinearAlgebra.LAPACK.geevx!
— Functiongeevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
找到具有矩阵平衡的 A
的特征系统。如果 jobvl = N
,则不计算 A
的左特征向量。如果 jobvr = N
,则不计算 A
的右特征向量。如果 jobvl = V
或 jobvr = V
,则计算相应的特征向量。如果 balanc = N
,则不执行平衡。如果 balanc = P
,则 A
被置换但不缩放。如果 balanc = S
,则 A
被缩放但不置换。如果 balanc = B
,则 A
被置换并缩放。如果 sense = N
,则不计算倒数条件数。如果 sense = E
,则仅计算特征值的倒数条件数。如果 sense = V
,则仅计算右特征向量的倒数条件数。如果 sense = B
,则计算右特征向量和特征向量的倒数条件数。如果 sense = E,B
,则必须计算右和左特征向量。
LinearAlgebra.LAPACK.ggev!
— Functionggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
找到 A
和 B
的广义特征分解。如果 jobvl = N
,则不计算左特征向量。如果 jobvr = N
,则不计算右特征向量。如果 jobvl = V
或 jobvr = V
,则计算相应的特征向量。
LinearAlgebra.LAPACK.ggev3!
— Functionggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
使用分块算法查找 A
和 B
的广义特征分解。如果 jobvl = N
,则不计算左特征向量。如果 jobvr = N
,则不计算右特征向量。如果 jobvl = V
或 jobvr = V
,则计算相应的特征向量。此函数需要 LAPACK 3.6.0。
LinearAlgebra.LAPACK.gtsv!
— Functiongtsv!(dl, d, du, B)
求解方程 A * X = B
,其中 A
是一个三对角矩阵,dl
在下对角线上,d
在对角线上,du
在上对角线上。
用解 X
覆盖 B
并返回它。
LinearAlgebra.LAPACK.gttrf!
— Functiongttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
找到一个三对角矩阵的 LU
分解,其中 dl
在下对角线上,d
在对角线上,du
在上对角线上。
就地修改 dl
、d
和 du
,并返回它们以及第二个上对角线 du2
和主元向量 ipiv
。
LinearAlgebra.LAPACK.gttrs!
— Functiongttrs!(trans, dl, d, du, du2, ipiv, B)
求解方程 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
) 或 adjoint(A) * X = B
(trans = C
),使用通过 gttrf!
计算的 LU
分解。B
被覆盖为解 X
。
LinearAlgebra.LAPACK.orglq!
— Functionorglq!(A, tau, k = length(tau))
显式地找到在对 A
调用 gelqf!
之后的 LQ
分解的矩阵 Q
。使用 gelqf!
的输出。A
被 Q
覆盖。
LinearAlgebra.LAPACK.orgqr!
— Functionorgqr!(A, tau, k = length(tau))
显式地找到在对 A
调用 geqrf!
之后的 QR
分解的矩阵 Q
。使用 geqrf!
的输出。A
被 Q
覆盖。
LinearAlgebra.LAPACK.orgql!
— Functionorgql!(A, tau, k = length(tau))
显式地找到在对 A
调用 geqlf!
之后的 QL
分解的矩阵 Q
。使用 geqlf!
的输出。A
被 Q
覆盖。
LinearAlgebra.LAPACK.orgrq!
— Functionorgrq!(A, tau, k = length(tau))
显式地找到在对 A
调用 gerqf!
之后的 RQ
分解的矩阵 Q
。使用 gerqf!
的输出。A
被 Q
覆盖。
LinearAlgebra.LAPACK.ormlq!
— Functionormlq!(side, trans, A, tau, C)
计算 Q * C
(trans = N
),transpose(Q) * C
(trans = T
),adjoint(Q) * C
(trans = C
)对于 side = L
或者使用从 gelqf!
计算的 A
的 LQ
分解的 Q
进行等效的右侧乘法对于 side = R
。C
被覆盖。
LinearAlgebra.LAPACK.ormqr!
— Functionormqr!(side, trans, A, tau, C)
计算 Q * C
(trans = N
)、transpose(Q) * C
(trans = T
)、adjoint(Q) * C
(trans = C
),对于 side = L
或者使用 side = R
的等效右侧乘法,使用从 geqrf!
计算的 A
的 QR
分解中的 Q
。C
被覆盖。
LinearAlgebra.LAPACK.ormql!
— Functionormql!(side, trans, A, tau, C)
计算 Q * C
(trans = N
)、transpose(Q) * C
(trans = T
)、adjoint(Q) * C
(trans = C
),对于 side = L
或者使用从 geqlf!
计算的 A
的 QL
分解得到的 Q
进行等效的右侧乘法 side = R
。C
被覆盖。
LinearAlgebra.LAPACK.ormrq!
— Functionormrq!(side, trans, A, tau, C)
计算 Q * C
(trans = N
)、transpose(Q) * C
(trans = T
)、adjoint(Q) * C
(trans = C
)对于 side = L
或者使用从 gerqf!
计算的 A
的 RQ
分解得到的 Q
进行等效的右侧乘法对于 side = R
。C
被覆盖。
LinearAlgebra.LAPACK.gemqrt!
— Functiongemqrt!(side, trans, V, T, C)
计算 Q * C
(trans = N
)、transpose(Q) * C
(trans = T
)、adjoint(Q) * C
(trans = C
)对于 side = L
或者使用从 geqrt!
计算的 A
的 QR
分解中的 Q
进行等效的右侧乘法对于 side = R
。C
被覆盖。
LinearAlgebra.LAPACK.posv!
— Functionposv!(uplo, A, B) -> (A, B)
找到 A * X = B
的解,其中 A
是一个对称或厄米正定矩阵。如果 uplo = U
,则计算 A
的上三角 Cholesky 分解。如果 uplo = L
,则计算 A
的下三角 Cholesky 分解。A
被其 Cholesky 分解覆盖。B
被解 X
覆盖。
LinearAlgebra.LAPACK.potrf!
— Functionpotrf!(uplo, A)
计算正定矩阵 A
的 Cholesky 分解(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)。A
被覆盖并返回一个信息代码。
LinearAlgebra.LAPACK.potri!
— Functionpotri!(uplo, A)
计算正定矩阵 A
的逆,在调用 potrf!
找到其(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)Cholesky 分解后。
A
被其逆覆盖并返回。
LinearAlgebra.LAPACK.potrs!
— Functionpotrs!(uplo, A, B)
找到 A * X = B
的解,其中 A
是一个对称或厄米正定矩阵,其 Cholesky 分解是通过 potrf!
计算的。如果 uplo = U
,则计算了 A
的上三角 Cholesky 分解。如果 uplo = L
,则计算了 A
的下三角 Cholesky 分解。B
被覆盖为解 X
。
LinearAlgebra.LAPACK.pstrf!
— Functionpstrf!(uplo, A, tol) -> (A, piv, rank, info)
计算正定矩阵 A
的(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)带主元的 Cholesky 分解,使用用户设置的容忍度 tol
。A
被其 Cholesky 分解覆盖。
返回 A
、主元 piv
、A
的秩,以及一个 info
代码。如果 info = 0
,则分解成功。如果 info = i > 0
,则 A
是不定的或秩不足。
LinearAlgebra.LAPACK.ptsv!
— Functionptsv!(D, E, B)
求解正定三对角矩阵 A
的方程 A * X = B
。D
是 A
的对角线,E
是副对角线。B
被覆盖为解 X
并返回。
LinearAlgebra.LAPACK.pttrf!
— Functionpttrf!(D, E)
计算正定三对角矩阵的 LDLt 分解,其中 D
为对角线,E
为非对角线。D
和 E
被覆盖并返回。
LinearAlgebra.LAPACK.pttrs!
— Functionpttrs!(D, E, B)
求解正定三对角矩阵 A
的方程 A * X = B
,其中对角线为 D
,副对角线为 E
,在使用 pttrf!
计算 A
的 LDLt 分解后。B
被覆盖为解 X
。
LinearAlgebra.LAPACK.trtri!
— Functiontrtri!(uplo, diag, A)
找到(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)矩阵 A
的逆。如果 diag = N
,则 A
具有非单位对角元素。如果 diag = U
,则 A
的所有对角元素均为一。A
被其逆所覆盖。
LinearAlgebra.LAPACK.trtrs!
— Functiontrtrs!(uplo, trans, diag, A, B)
求解 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
) 或 adjoint(A) * X = B
(trans = C
),其中 A
是(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)矩阵。如果 diag = N
,则 A
的对角元素为非单位元素。如果 diag = U
,则 A
的所有对角元素均为一。B
被覆盖为解 X
。
LinearAlgebra.LAPACK.trcon!
— Functiontrcon!(norm, uplo, diag, A)
找到三角矩阵 A
的倒数条件数(如果 uplo = U
则为上三角,如果 uplo = L
则为下三角)。如果 diag = N
,则 A
具有非单位对角元素。如果 diag = U
,则 A
的所有对角元素均为一。如果 norm = I
,则在无穷范数下找到条件数。如果 norm = O
或 1
,则在一范数下找到条件数。
LinearAlgebra.LAPACK.trevc!
— Functiontrevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))
查找上三角矩阵 T
的特征系统。如果 side = R
,则计算右特征向量。如果 side = L
,则计算左特征向量。如果 side = B
,则计算两组特征向量。如果 howmny = A
,则找到所有特征向量。如果 howmny = B
,则找到所有特征向量并使用 VL
和 VR
进行反变换。如果 howmny = S
,则仅计算与 select
中的值对应的特征向量。
LinearAlgebra.LAPACK.trrfs!
— Functiontrrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)
估计 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
)、adjoint(A) * X = B
(trans = C
) 对于 side = L
的解的误差,或者在计算 X
后的右侧 side = R
的等效方程 X * A
,使用 trtrs!
。如果 uplo = U
,则 A
是上三角矩阵。如果 uplo = L
,则 A
是下三角矩阵。如果 diag = N
,则 A
具有非单位对角元素。如果 diag = U
,则 A
的所有对角元素均为一。Ferr
和 Berr
是可选输入。Ferr
是前向误差,Berr
是后向误差,均为分量式。
LinearAlgebra.LAPACK.stev!
— Functionstev!(job, dv, ev) -> (dv, Zmat)
计算对称三对角矩阵的特征系统,其中 dv
为对角线,ev
为副对角线。如果 job = N
,则仅找到特征值并返回在 dv
中。如果 job = V
,则特征向量也会被找到并返回在 Zmat
中。
LinearAlgebra.LAPACK.stebz!
— Functionstebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)
计算对称三对角矩阵的特征值,其中 dv
为对角线,ev
为非对角线。如果 range = A
,则找到所有特征值。如果 range = V
,则找到半开区间 (vl, vu]
中的特征值。如果 range = I
,则找到索引在 il
和 iu
之间的特征值。如果 order = B
,特征值在一个块内排序。如果 order = E
,则在所有块之间排序。abstol
可以设置为收敛的容差。
LinearAlgebra.LAPACK.stegr!
— Functionstegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)
计算对称三对角矩阵的特征值(jobz = N
)或特征值和特征向量(jobz = V
),其中 dv
为对角线,ev
为非对角线。如果 range = A
,则找到所有特征值。如果 range = V
,则找到半开区间 (vl, vu]
中的特征值。如果 range = I
,则找到索引在 il
和 iu
之间的特征值。特征值返回在 w
中,特征向量返回在 Z
中。
LinearAlgebra.LAPACK.stein!
— Functionstein!(dv, ev_in, w_in, iblock_in, isplit_in)
计算对称三对角矩阵的特征向量,其中 dv
为对角线,ev_in
为副对角线。w_in
指定要查找对应特征向量的输入特征值。iblock_in
指定与 w_in
中特征值对应的子矩阵。isplit_in
指定子矩阵块之间的分割点。
LinearAlgebra.LAPACK.syconv!
— Functionsyconv!(uplo, A, ipiv) -> (A, work)
将对称矩阵 A
(已被分解为三角矩阵)转换为两个矩阵 L
和 D
。如果 uplo = U
,则 A
是上三角的。如果 uplo = L
,则它是下三角的。ipiv
是来自三角分解的主元向量。A
被 L
和 D
覆盖。
LinearAlgebra.LAPACK.sysv!
— Functionsysv!(uplo, A, B) -> (B, A, ipiv)
找到对称矩阵 A
的 A * X = B
的解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。B
被解 X
覆盖。A
被其 Bunch-Kaufman 分解覆盖。ipiv
包含关于分解的主元信息。
LinearAlgebra.LAPACK.sytrf!
— Functionsytrf!(uplo, A) -> (A, ipiv, info)
计算对称矩阵 A
的 Bunch-Kaufman 分解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。
返回被分解覆盖的 A
、一个主元向量 ipiv
和错误代码 info
,该代码是一个非负整数。如果 info
为正,则矩阵是奇异的,分解的对角部分在位置 info
处恰好为零。
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)
计算对称矩阵 A
的 Bunch-Kaufman 分解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。
返回被分解覆盖的 A
、主元向量 ipiv
和错误代码 info
,该代码是一个非负整数。如果 info
为正,则矩阵是奇异的,分解的对角部分在位置 info
处恰好为零。
LinearAlgebra.LAPACK.sytri!
— Functionsytri!(uplo, A, ipiv)
计算对称矩阵 A
的逆,使用 sytrf!
的结果。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。A
被其逆覆盖。
LinearAlgebra.LAPACK.sytrs!
— Functionsytrs!(uplo, A, ipiv, B)
求解方程 A * X = B
,其中 A
是一个对称矩阵,使用 sytrf!
的结果。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。B
被解 X
覆盖。
LinearAlgebra.LAPACK.hesv!
— Functionhesv!(uplo, A, B) -> (B, A, ipiv)
找到 Hermitian 矩阵 A
的 A * X = B
的解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。B
被解 X
覆盖。A
被其 Bunch-Kaufman 分解覆盖。ipiv
包含关于分解的主元信息。
LinearAlgebra.LAPACK.hetrf!
— Functionhetrf!(uplo, A) -> (A, ipiv, info)
计算厄米矩阵 A
的 Bunch-Kaufman 分解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。
返回被分解覆盖的 A
、一个主元向量 ipiv
和错误代码 info
,该代码是一个非负整数。如果 info
为正,则矩阵是奇异的,分解的对角部分在位置 info
处恰好为零。
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)
计算厄米矩阵 A
的 Bunch-Kaufman 分解。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。
返回被分解覆盖的 A
、主元向量 ipiv
和错误代码 info
,该代码是一个非负整数。如果 info
为正,则矩阵是奇异的,分解的对角部分在位置 info
处恰好为零。
LinearAlgebra.LAPACK.hetri!
— Functionhetri!(uplo, A, ipiv)
计算 Hermitian 矩阵 A
的逆,使用 sytrf!
的结果。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。A
被其逆覆盖。
LinearAlgebra.LAPACK.hetrs!
— Functionhetrs!(uplo, A, ipiv, B)
求解方程 A * X = B
,其中 A
是一个厄米矩阵,使用 sytrf!
的结果。如果 uplo = U
,则存储 A
的上半部分。如果 uplo = L
,则存储下半部分。B
被解 X
覆盖。
LinearAlgebra.LAPACK.syev!
— Functionsyev!(jobz, uplo, A)
查找对称矩阵 A
的特征值(jobz = N
)或特征值和特征向量(jobz = V
)。如果 uplo = U
,则使用 A
的上三角部分。如果 uplo = L
,则使用 A
的下三角部分。
LinearAlgebra.LAPACK.syevr!
— Functionsyevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)
查找对称矩阵 A
的特征值(jobz = N
)或特征值和特征向量(jobz = V
)。如果 uplo = U
,则使用 A
的上三角部分。如果 uplo = L
,则使用 A
的下三角部分。如果 range = A
,则找到所有特征值。如果 range = V
,则找到半开区间 (vl, vu]
中的特征值。如果 range = I
,则找到索引在 il
和 iu
之间的特征值。abstol
可以设置为收敛的容差。
特征值返回在 W
中,特征向量返回在 Z
中。
LinearAlgebra.LAPACK.syevd!
— Functionsyevd!(jobz, uplo, A)
查找对称矩阵 A
的特征值(jobz = N
)或特征值和特征向量(jobz = V
)。如果 uplo = U
,则使用 A
的上三角部分。如果 uplo = L
,则使用 A
的下三角部分。
使用分治法,而不是 syev!
使用的 QR 迭代或 syevr!
使用的多种相对稳健的表示法。有关不同方法的准确性和性能比较,请参见 James W. Demmel 等人,SIAM J. Sci. Comput. 30, 3, 1508 (2008)。
LinearAlgebra.LAPACK.sygvd!
— Functionsygvd!(itype, jobz, uplo, A, B) -> (w, A, B)
查找对称矩阵 A
和对称正定矩阵 B
的广义特征值(jobz = N
)或特征值和特征向量(jobz = V
)。如果 uplo = U
,则使用 A
和 B
的上三角部分。如果 uplo = L
,则使用 A
和 B
的下三角部分。如果 itype = 1
,要解决的问题是 A * x = lambda * B * x
。如果 itype = 2
,要解决的问题是 A * B * x = lambda * x
。如果 itype = 3
,要解决的问题是 B * A * x = lambda * x
。
LinearAlgebra.LAPACK.bdsqr!
— Functionbdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)
计算具有对角线 d
和副对角线 e_
的双对角矩阵的奇异值分解。如果 uplo = U
,则 e_
是超对角线。如果 uplo = L
,则 e_
是下对角线。还可以选择计算乘积 Q' * C
。
返回奇异值在 d
中,矩阵 C
被覆盖为 Q' * C
。
LinearAlgebra.LAPACK.bdsdc!
— Functionbdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)
计算具有对角线 d
和副对角线 e_
的双对角矩阵的奇异值分解,使用分治法。如果 uplo = U
,则 e_
是超对角线。如果 uplo = L
,则 e_
是下对角线。如果 compq = N
,则仅找到奇异值。如果 compq = I
,则找到奇异值和向量。如果 compq = P
,则以紧凑形式找到奇异值和向量。仅适用于实数类型。
返回奇异值在 d
中,如果 compq = P
,则紧凑的奇异向量在 iq
中。
LinearAlgebra.LAPACK.gecon!
— Functiongecon!(normtype, A, anorm)
找到矩阵 A
的倒数条件数。如果 normtype = I
,则条件数在无穷范数中找到。如果 normtype = O
或 1
,则条件数在一范数中找到。A
必须是 getrf!
的结果,anorm
是 A
在相关范数中的范数。
LinearAlgebra.LAPACK.gehrd!
— Functiongehrd!(ilo, ihi, A) -> (A, tau)
将矩阵 A
转换为 Hessenberg 形式。如果 A
是通过 gebal!
平衡的,则 ilo
和 ihi
是 gebal!
的输出。否则,它们应该是 ilo = 1
和 ihi = size(A,2)
。tau
包含分解的基本反射器。
LinearAlgebra.LAPACK.orghr!
— Functionorghr!(ilo, ihi, A, tau)
显式地找到 Q
,即来自 gehrd!
的正交/单位矩阵。ilo
、ihi
、A
和 tau
必须对应于 gehrd!
的输入/输出。
LinearAlgebra.LAPACK.gees!
— Functiongees!(jobvs, A) -> (A, vs, w)
计算矩阵 A
的特征值(jobvs = N
)或特征值和 Schur 向量(jobvs = V
)。A
被其 Schur 形式覆盖。
返回 A
、包含 Schur 向量的 vs
和包含特征值的 w
。
LinearAlgebra.LAPACK.gges!
— Functiongges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
计算 A
和 B
的广义特征值、广义 Schur 形式、左 Schur 向量(jobsvl = V
)或右 Schur 向量(jobvsr = V
)。
广义特征值返回在 alpha
和 beta
中。左 Schur 向量返回在 vsl
中,右 Schur 向量返回在 vsr
中。
LinearAlgebra.LAPACK.gges3!
— Functiongges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
计算广义特征值、广义 Schur 形式、左 Schur 向量(jobsvl = V
)或右 Schur 向量(jobvsr = V
)的 A
和 B
,使用阻塞算法。此函数需要 LAPACK 3.6.0。
广义特征值返回在 alpha
和 beta
中。左 Schur 向量返回在 vsl
中,右 Schur 向量返回在 vsr
中。
LinearAlgebra.LAPACK.trexc!
— Functiontrexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)
重新排列矩阵的 Schur 分解 T
,使得 T
中行索引为 ifst
的对角块移动到行索引 ilst
。如果 compq = V
,则 Schur 向量 Q
会被重新排序。如果 compq = N
,则它们不会被修改。4-参数方法调用 5-参数方法,compq = V
。
LinearAlgebra.LAPACK.trsen!
— Functiontrsen!(job, compq, select, T, Q) -> (T, Q, w, s, sep)
trsen!(select, T, Q) -> (T, Q, w, s, sep)
重新排序矩阵的 Schur 分解,并可选择性地找到倒数条件数。如果 job = N
,则不找到条件数。如果 job = E
,则仅找到此特征值簇的条件数。如果 job = V
,则仅找到不变子空间的条件数。如果 job = B
,则找到簇和子空间的条件数。如果 compq = V
,则更新 Schur 向量 Q
。如果 compq = N
,则不修改 Schur 向量。select
确定哪些特征值在簇中。3 参数方法调用 5 参数方法,job = N
和 compq = V
。
返回 T
,Q
,重新排序的特征值 w
,特征值簇的条件数 s
,以及不变子空间的条件数 sep
。
LinearAlgebra.LAPACK.tgsen!
— Functiontgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
重新排列广义舒尔分解的向量。select
指定每个簇中的特征值。
LinearAlgebra.LAPACK.trsyl!
— Functiontrsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)
解决 Sylvester 矩阵方程 A * X +/- X * B = scale*C
,其中 A
和 B
都是准上三角矩阵。如果 transa = N
,则 A
不会被修改。如果 transa = T
,则 A
被转置。如果 transa = C
,则 A
被共轭转置。transb
和 B
也类似。如果 isgn = 1
,则方程 A * X + X * B = scale * C
被求解。如果 isgn = -1
,则方程 A * X - X * B = scale * C
被求解。
返回 X
(覆盖 C
)和 scale
。
LinearAlgebra.LAPACK.hseqr!
— Functionhseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
计算所有特征值和(可选)矩阵的 Schur 分解,该矩阵已被简化为 Hessenberg 形式。如果 H
是通过 gebal!
平衡的,则 ilo
和 ihi
是 gebal!
的输出。否则,它们应该是 ilo = 1
和 ihi = size(H,2)
。tau
包含分解的基本反射器。
- ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
- DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
- Bischof1987C Bischof 和 C Van Loan, "The WY representation for products of Householder matrices", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber 和 C Van Loan, "A storage-efficient WY representation for products of Householder transformations", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
- ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
- Bunch1977J R Bunch 和 L Kaufman, 一些稳定的方法用于计算惯性和求解对称线性系统, Mathematics of Computation 31:137 (1977), 163-179. url.
- issue8859Issue 8859, "Fix least squares", https://github.com/JuliaLang/julia/pull/8859
- B96Åke Björck, "Numerical Methods for Least Squares Problems", SIAM Press, Philadelphia, 1996, "Other Titles in Applied Mathematics", Vol. 51. doi:10.1137/1.9781611971484
- S84G. W. Stewart, "Rank Degeneracy", SIAM Journal on Scientific and Statistical Computing, 5(2), 1984, 403-413. doi:10.1137/0905030
- KY88Konstantinos Konstantinides 和 Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. doi:10.1109/29.1585
- H05Nicholas J. Higham, "The squaring and scaling method for the matrix exponential revisited", SIAM Journal on Matrix Analysis and Applications, 26(4), 2005, 1179-1193. doi:10.1137/090768539
- AH12Awad H. Al-Mohy 和 Nicholas J. Higham, "改进的逆缩放和平方算法用于矩阵对数", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham 和 Samuel D. Relton, "计算矩阵对数的 Fréchet 导数并估计条件数", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck 和 Sven Hammarling, "A Schur method for the square root of a matrix", Linear Algebra and its Applications, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
- H87Nicholas J. Higham, "Computing real square roots of a real matrix", Linear Algebra and its Applications, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
- S03Matthew I. Smith, "A Schur Algorithm for Computing Matrix pth Roots", SIAM Journal on Matrix Analysis and Applications, vol. 24, 2003, pp. 971–989. doi:10.1137/S0895479801392697
- AH16_1Mary Aprahamian 和 Nicholas J. Higham, "矩阵逆三角和逆双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Mary Aprahamian 和 Nicholas J. Higham, "矩阵逆三角函数和逆双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Mary Aprahamian 和 Nicholas J. Higham, "矩阵逆三角和逆双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Mary Aprahamian 和 Nicholas J. Higham, "矩阵反三角和反双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Mary Aprahamian 和 Nicholas J. Higham, "矩阵反三角和反双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Mary Aprahamian 和 Nicholas J. Higham, "矩阵反三角和逆双曲函数:理论与算法", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577