Linear Algebra

除了(并作为)对多维数组的支持,Julia 提供了许多常见且有用的线性代数操作的原生实现,可以通过 using LinearAlgebra 加载。基本操作,如 trdetinv 都得到了支持:

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中各种优化方法的钩子。

TypeDescription
SymmetricSymmetric matrix
HermitianHermitian matrix
UpperTriangularUpper triangular matrix
UnitUpperTriangularUpper triangular matrix with unit diagonal
LowerTriangularLower triangular matrix
UnitLowerTriangularLower triangular matrix with unit diagonal
UpperHessenbergUpper Hessenberg matrix
TridiagonalTridiagonal matrix
SymTridiagonalSymmetric tridiagonal matrix
BidiagonalUpper/lower bidiagonal matrix
DiagonalDiagonal matrix
UniformScalingUniform scaling operator

Elementary operations

Matrix type+-*\Other functions with optimized methods
SymmetricMVinv, sqrt, cbrt, exp
HermitianMVinv, sqrt, cbrt, exp
UpperTriangularMVMVinv, det, logdet
UnitUpperTriangularMVMVinv, det, logdet
LowerTriangularMVMVinv, det, logdet
UnitLowerTriangularMVMVinv, det, logdet
UpperHessenbergMMinv, det
SymTridiagonalMMMSMVeigmax, eigmin
TridiagonalMMMSMV
BidiagonalMMMSMV
DiagonalMMMVMVinv, det, logdet, /
UniformScalingMMMVSMVS/

传奇:

KeyDescription
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 typeLAPACKeigeneigvalseigvecssvdsvdvals
SymmetricSYARI
HermitianHEARI
UpperTriangularTRAAA
UnitUpperTriangularTRAAA
LowerTriangularTRAAA
UnitLowerTriangularTRAAA
SymTridiagonalSTAARIAV
TridiagonalGT
BidiagonalBDAA
DiagonalDIA

传奇:

KeyDescriptionExample
A (all)An optimized method to find all the characteristic values and/or vectors is availablee.g. eigvals(M)
R (range)An optimized method to find the ilth through the ihth characteristic values are availableeigvals(M, il, ih)
I (interval)An optimized method to find the characteristic values in the interval [vl, vh] is availableeigvals(M, vl, vh)
V (vectors)An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is availableeigvecs(M, x)

The uniform scaling operator

一个 UniformScaling 运算符表示一个标量乘以单位运算符,λ*I。单位运算符 I 被定义为一个常量,并且是 UniformScaling 的一个实例。这些运算符的大小是通用的,并且与二元运算中的其他矩阵匹配 +-*\。对于 A+IA-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 部分。

TypeDescription
BunchKaufmanBunch-Kaufman factorization
CholeskyCholesky factorization
CholeskyPivotedPivoted Cholesky factorization
LDLtLDL(T) factorization
LULU factorization
QRQR factorization
QRCompactWYCompact WY form of the QR factorization
QRPivotedPivoted QR factorization
LQQR factorization of transpose(A)
HessenbergHessenberg decomposition
EigenSpectral decomposition
GeneralizedEigenGeneralized spectral decomposition
SVDSingular value decomposition
GeneralizedSVDGeneralized SVD
SchurSchur decomposition
GeneralizedSchurGeneralized Schur decomposition

Factorization 对象的伴随和转置被懒惰地封装在 AdjointFactorizationTransposeFactorization 对象中。一般来说,实数 Factorization 的转置被封装为 AdjointFactorization

Orthogonal matrices (AbstractQ)

某些矩阵分解生成正交/单位“矩阵”因子。这些分解包括从调用 qr 获得的与 QR 相关的分解,即 QRQRCompactWYQRPivoted,从调用 hessenberg 获得的 Hessenberg 分解,以及从 lq 获得的 LQ 分解。虽然这些正交/单位因子可以有矩阵表示,但出于性能和内存原因,它们的内部表示是不同的。因此,它们应该被视为基于矩阵的、基于函数的线性算子。特别是,读取其矩阵表示的某一列需要运行“矩阵”-向量乘法代码,而不是简单地从内存中读取数据(可能会用结构零填充向量的部分)。与其他非三角矩阵类型的另一个明显区别是,底层乘法代码允许在乘法过程中进行就地修改。此外,特定 AbstractQ 子类型的对象,如通过 4d61726b646f776e2e436f64652822222c202271722229_407265664d61726b646f776e2e436f64652822222c202268657373656e626572672229_407265664d61726b646f776e2e436f64652822222c20226c712229_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.NoPivotType
NoPivot

不进行主元选择。没有主元选择的矩阵分解,例如 LU 分解,可能会失败,并且在浮点矩阵面临舍入误差时可能也会在数值上不稳定。这个主元策略主要用于教学目的。

source
LinearAlgebra.RowNonZeroType
RowNonZero

剩余行中的第一个非零元素被选为主元。

请注意,对于浮点矩阵,结果 LU 算法在数值上是不稳定的——这种策略主要用于与手动计算(通常使用这种策略)进行比较,或用于其他不易受到舍入误差影响的代数类型(例如有理数)。否则,在高斯消元中通常应优先使用默认的 RowMaximum 主元策略。

请注意,矩阵的 element type 必须支持 iszero 方法。

source
LinearAlgebra.RowMaximumType
RowMaximum

在剩余行中选择最大绝对值元素作为主元。这是浮点矩阵LU分解的默认策略,有时被称为“部分主元”算法。

请注意,矩阵的 元素类型 必须支持 abs 方法,其结果类型必须支持 < 方法。

source

Standard 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
source
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!

另见muladddot

Julia 1.7

这些优化至少需要Julia 1.7。

source
Base.:\Method
\(A, B)

使用多算法进行矩阵除法。对于输入矩阵 AB,结果 X 满足 A*X == BA 为方阵时。所使用的求解器取决于 A 的结构。如果 A 是上三角或下三角(或对角)矩阵,则不需要对 A 进行因式分解,系统通过前向或后向替代法求解。对于非三角形的方阵,使用 LU 因式分解。

对于矩形的 A,结果是通过对 A 进行带主元的 QR 因式分解和基于 R 因子的 A 的秩估计计算的最小范数最小二乘解。

A 是稀疏矩阵时,使用类似的多算法。对于不定矩阵,LDLt 因式分解在数值因式分解过程中不使用主元,因此即使对于可逆矩阵,该过程也可能失败。

另见:factorizepinv

示例

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
source
Base.:/Method
A / 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
source
LinearAlgebra.SingularExceptionType
SingularException

当输入矩阵具有一个或多个零值特征值且不可逆时抛出异常。涉及此类矩阵的线性求解无法计算。info 字段指示(其中一个)奇异值的位置。

source
LinearAlgebra.PosDefExceptionType
PosDefException

当输入矩阵不是正定时抛出异常。一些线性代数函数和分解仅适用于正定矩阵。info字段指示小于或等于0的特征值之一的位置。

source
LinearAlgebra.ZeroPivotExceptionType
ZeroPivotException <: Exception

当矩阵分解/求解在主元(对角线)位置遇到零并无法继续时,会抛出此异常。这可能并不意味着矩阵是奇异的:切换到其他分解方法(例如可以重新排序变量以消除虚假零主元的带主元的LU分解)可能是有益的。info字段指示(一个)零主元的位置。

source
LinearAlgebra.LAPACKExceptionType
LAPACK异常

在直接调用LAPACK函数或调用其他内部使用LAPACK函数但缺乏专门错误处理的函数时抛出的通用LAPACK异常。info字段包含有关基础错误的附加信息,并取决于被调用的LAPACK函数。

source
LinearAlgebra.dotFunction
dot(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
source
LinearAlgebra.dotMethod
dot(x, A, y)

计算两个向量 xy 之间的广义点积 dot(x, A*y),而不存储中间结果 A*y。与两个参数的 dot(_,_) 一样,这个操作是递归的。此外,对于复数向量,第一个向量会被共轭。

Julia 1.4

三个参数的 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
source
LinearAlgebra.crossFunction
cross(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
source
LinearAlgebra.axpy!Function
axpy!(α, x::AbstractArray, y::AbstractArray)

x * α + y 覆盖 y 并返回 y。如果 xy 具有相同的轴,则等价于 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
source
LinearAlgebra.axpby!Function
axpby!(α, x::AbstractArray, β, y::AbstractArray)

x * α + y * β 覆盖 y 并返回 y。如果 xy 具有相同的轴,则等价于 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
source
LinearAlgebra.rotate!Function
rotate!(x, y, c, s)

c*x + s*y 覆盖 x,用 -conj(s)*x + c*y 覆盖 y。返回 xy

Julia 1.5

rotate! 至少需要 Julia 1.5。

source
LinearAlgebra.reflect!Function
reflect!(x, y, c, s)

c*x + s*y 覆盖 x,用 conj(s)*x - c*y 覆盖 y。返回 xy

Julia 1.5

reflect! 至少需要 Julia 1.5。

source
LinearAlgebra.factorizeFunction
factorize(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 类型的专门方法。

source
LinearAlgebra.DiagonalType
Diagonal(V::AbstractVector)

构造一个以 V 为对角线的惰性矩阵。

另请参见 UniformScaling 用于惰性单位矩阵 Idiagm 用于创建稠密矩阵,以及 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
source
对角线(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
source
Diagonal{T}(undef, n)

构造一个未初始化的长度为 nDiagonal{T}。请参见 undef

source
LinearAlgebra.BidiagonalType
Bidiagonal(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
source
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
source
LinearAlgebra.SymTridiagonalType
SymTridiagonal(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
source
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]
source
LinearAlgebra.TridiagonalType
Tridiagonal(dl::V, d::V, du::V) where V <: AbstractVector

从第一个下对角线、对角线和第一个上对角线分别构造一个三对角矩阵。结果是 Tridiagonal 类型,并提供高效的专用线性求解器,但可以通过 convert(Array, _)(或简写为 Array(_))转换为常规矩阵。dldu 的长度必须比 d 的长度少一。

Note

下对角线 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
source
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
source
LinearAlgebra.SymmetricType
Symmetric(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

source
LinearAlgebra.HermitianType
Hermitian(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)
source
LinearAlgebra.LowerTriangularType
LowerTriangular(A::AbstractMatrix)

构造矩阵 ALowerTriangular 视图。

示例

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
source
LinearAlgebra.UpperTriangularType
UpperTriangular(A::AbstractMatrix)

构造矩阵 AUpperTriangular 视图。

示例

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
source
LinearAlgebra.UnitLowerTriangularType
UnitLowerTriangular(A::AbstractMatrix)

构造矩阵 AUnitLowerTriangular 视图。这样的视图在其对角线上具有 Aeltypeoneunit

示例

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
source
LinearAlgebra.UnitUpperTriangularType
UnitUpperTriangular(A::AbstractMatrix)

构造矩阵 AUnitUpperTriangular 视图。这样的视图在其对角线上具有 Aeltypeoneunit

示例

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
source
LinearAlgebra.UpperHessenbergType
UpperHessenberg(A::AbstractMatrix)

构造矩阵 AUpperHessenberg 视图。A 中第一副对角线以下的条目将被忽略。

Julia 1.3

此类型在 Julia 1.3 中添加。

H \ bdet(H) 和类似操作实现了高效算法。

另请参见 hessenberg 函数,以将任何矩阵分解为类似的上Hessenberg矩阵。

如果 F::Hessenberg 是分解对象,则可以通过 F.Q 访问单位矩阵,通过 F.H 访问Hessenberg矩阵。当提取 Q 时,结果类型为 HessenbergQ 对象,并且可以通过 convert(Array, _)(或简写为 Array(_))转换为常规矩阵。

迭代分解会产生因子 F.QF.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
source
LinearAlgebra.UniformScalingType
UniformScaling{T<:Number}

定义为标量乘以单位算子的通用大小均匀缩放算子,λ*I。尽管没有明确的 size,在许多情况下它的行为类似于矩阵,并且支持某些索引。另见 I

Julia 1.6

从 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
source
LinearAlgebra.IConstant
I

一个类型为 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
source
LinearAlgebra.UniformScalingMethod
(I::UniformScaling)(n::Integer)

UniformScaling 构造一个 Diagonal 矩阵。

Julia 1.2

此方法自 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
source
LinearAlgebra.LUType
LU <: Factorization

矩阵分解类型的 LU 分解一个方阵 A。这是 lu 的返回类型,对应的矩阵分解函数。

可以通过 getproperty 访问分解 F::LU 的各个组成部分:

组件描述
F.LL(单位下三角)部分的 LU
F.UU(上三角)部分的 LU
F.p(右)置换 Vector
F.P(右)置换 Matrix

迭代分解会产生组件 F.LF.UF.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
source
LinearAlgebra.luFunction
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

计算稀疏矩阵 A 的 LU 分解。

对于元素类型为实数或复数的稀疏 A,返回类型 FUmfpackLU{Tv, Ti},其中 Tv = Float64ComplexF64,而 Ti 是整数类型(Int32Int64)。

check = true 时,如果分解失败,将抛出错误。当 check = false 时,检查分解有效性的责任(通过 issuccess)由用户承担。

置换 q 可以是一个置换向量或 nothing。如果未提供置换向量或 qnothing,则使用 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 的各个组件:

组件描述
LLUL(下三角)部分
ULUU(上三角)部分
p右置换 Vector
q左置换 Vector
Rs缩放因子的 Vector
:(L,U,p,q,Rs) 组件

FA 之间的关系为

F.L*F.U == (F.Rs .* A)[F.p, F.q]

F 进一步支持以下函数:

另见 lu!

Note

lu(A::AbstractSparseMatrixCSC) 使用的是 UMFPACK[ACM832] 库,该库是 SuiteSparse 的一部分。由于该库仅支持元素为 Float64ComplexF64 的稀疏矩阵,lu 会将 A 转换为类型为 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64} 的副本。

source
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU

计算 A 的 LU 分解。

check = true 时,如果分解失败,将抛出错误。当 check = false 时,检查分解有效性的责任(通过 issuccess)由用户承担。

默认情况下,当 check = true 时,如果分解产生有效因子,但上三角因子 U 的秩不足,也会抛出错误。可以通过传递 allowsingular = true 来更改此行为。

在大多数情况下,如果 AAbstractMatrix{T} 的子类型 S,且元素类型 T 支持 +-*/,则返回类型为 LU{T,S{T}}

一般来说,LU 分解涉及对矩阵行的排列(对应于下面描述的 F.p 输出),称为“主元选择”(因为它对应于选择哪个行包含“主元”,即 F.U 的对角元素)。可以通过可选的 pivot 参数选择以下主元选择策略:

  • RowMaximum()(默认):标准主元选择策略;主元对应于剩余待分解行中绝对值最大的元素。此主元选择策略要求元素类型也支持 abs<。 (这通常是浮点矩阵的唯一数值稳定选项。)
  • RowNonZero():主元对应于剩余待分解行中第一个非零元素。 (这对应于手动计算中的典型选择,对于支持 iszero 但不支持 abs< 的更一般的代数数类型也很有用。)
  • NoPivot():关闭主元选择(如果在主元位置遇到零条目,将失败,即使 allowsingular = true)。

可以通过 getproperty 访问分解 F 的各个组成部分:

组件描述
F.LL(下三角)部分的 LU
F.UU(上三角)部分的 LU
F.p(右)排列 Vector
F.P(右)排列 Matrix

迭代分解会产生组件 F.LF.UF.p

FA 之间的关系是

F.L*F.U == A[F.p, :]

F 进一步支持以下函数:

支持的函数LULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

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
source
LinearAlgebra.lu!Function
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU

计算稀疏矩阵 A 的 LU 分解,重用已存在的 LU 分解中存储的符号分解 F。除非将 reuse_symbolic 设置为 false,否则稀疏矩阵 A 必须具有与用于创建 LU 分解 F 的矩阵相同的非零模式,否则会抛出错误。如果 AF 的大小不同,则所有向量将相应地调整大小。

check = true 时,如果分解失败,将抛出错误。当 check = false 时,检查分解有效性的责任(通过 issuccess)由用户承担。

置换 q 可以是一个置换向量或 nothing。如果未提供置换向量或 qnothing,则使用 UMFPACK 的默认值。如果置换不是基于零的,则会制作一个基于零的副本。

另见 lu

Note

lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC) 使用的是 SuiteSparse 中的 UMFPACK 库。由于该库仅支持具有 Float64ComplexF64 元素的稀疏矩阵,因此 lu! 将自动将类型转换为 LU 分解所设置的类型或适当的 SparseMatrixCSC{ComplexF64}

Julia 1.5

UmfpackLUlu! 至少需要 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
source
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU

lu!lu 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。如果因因式分解产生一个无法由 A 的元素类型表示的数字,例如对于整数类型,将抛出 InexactError 异常。

Julia 1.11

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:
[...]
source
LinearAlgebra.CholeskyType
Cholesky <: Factorization

稠密对称/厄米正定矩阵 A 的 Cholesky 分解的矩阵分解类型。这是 cholesky 的返回类型,对应的矩阵分解函数。

可以通过 F::Cholesky 的分解获得三角形 Cholesky 因子,方法是使用 F.LF.U,其中 A ≈ F.U' * F.U ≈ F.L * F.L'

以下函数可用于 Cholesky 对象:size\invdetlogdetisposdef

迭代分解会产生组件 LU

示例

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
source
LinearAlgebra.CholeskyPivotedType
CholeskyPivoted

矩阵分解类型,适用于稠密对称/厄米正半定矩阵 A 的带主元的 Cholesky 分解。这是 cholesky(_, ::RowMaximum) 的返回类型,对应的矩阵分解函数。

可以通过 F.LF.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\invdetrank

迭代分解会产生组件 LU

示例

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
source
LinearAlgebra.choleskyFunction
cholesky(A, NoPivot(); check = true) -> Cholesky

计算稠密对称正定矩阵 A 的 Cholesky 分解,并返回一个 Cholesky 分解。矩阵 A 可以是一个 SymmetricHermitian AbstractMatrix,或者是一个 完全 对称或 Hermitian 的 AbstractMatrix

可以通过 F.LF.U 从分解 F 中获得三角形 Cholesky 因子,其中 A ≈ F.U' * F.U ≈ F.L * F.L'

对于 Cholesky 对象,提供以下函数:size\invdetlogdetisposdef

如果你有一个由于构造中的舍入误差而稍微非 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
source
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

计算稠密对称半正定矩阵 A 的带主元的 Cholesky 分解,并返回一个 CholeskyPivoted 分解。矩阵 A 可以是 SymmetricHermitian AbstractMatrix,或者是 完全 对称或 Hermitian 的 AbstractMatrix

可以通过 F.LF.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\invdetrank

参数 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
source
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor

计算稀疏正定矩阵 A 的 Cholesky 分解。A 必须是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 视图。请注意,即使 A 没有类型标签,它仍然必须是对称的或厄米的。如果未给出 perm,则使用填充减少的置换。F = cholesky(A) 最常用于通过 F\b 求解方程组,但方法 diagdetlogdet 也为 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
Note

此方法使用来自 SuiteSparse 的 CHOLMOD[ACM887][DavisHager2009] 库。CHOLMOD 仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将适当地转换为这些类型。

CHOLMOD 的许多其他函数被封装但未从 Base.SparseArrays.CHOLMOD 模块导出。

source
LinearAlgebra.cholesky!Function
cholesky!(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:
[...]
source
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

cholesky 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。如果因子分解产生的数字无法由 A 的元素类型表示,例如对于整数类型,将抛出 InexactError 异常。

source
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

计算 A 的 Cholesky ($LL'$) 分解,重用符号分解 FA 必须是 SparseMatrixCSCSparseMatrixCSCSymmetric/ Hermitian 视图。请注意,即使 A 没有类型标签,它仍然必须是对称的或厄米的。

另请参见 cholesky

Note

此方法使用来自 SuiteSparse 的 CHOLMOD 库,仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将会适当地转换为这些类型。

source
LinearAlgebra.lowrankupdateFunction
lowrankupdate(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) 操作。

source
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

获取给定 ALDLtLLt 分解 FA + C*C'LDLt 分解。

返回的因子始终是 LDLt 分解。

另见 lowrankupdate!, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankdowndateFunction
lowrankdowndate(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) 的操作。

source
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

给定 ALDLtLLt 分解 F,获取 A + C*C'LDLt 分解。

返回的因子始终是 LDLt 分解。

另见 lowrankdowndate!, lowrankupdate, lowrankupdate!.

source
LinearAlgebra.lowrankupdate!Function
lowrankupdate!(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 会被销毁。

source
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)

ALDLtLLt 分解 F 更新为 A + C*C' 的分解。

LLt 分解会转换为 LDLt

另见 lowrankupdate, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankdowndate!Function
lowrankdowndate!(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 会被销毁。

source
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)

ALDLtLLt 分解 F 更新为 A - C*C' 的分解。

LLt 分解会转换为 LDLt

另见 lowrankdowndate, lowrankupdate, lowrankupdate!.

source
LinearAlgebra.LDLtType
LDLt <: 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.LL(单位下三角)部分的 LDLt
F.DD(对角)部分的 LDLt
F.LtLt(单位上三角)部分的 LDLt
F.dD 的对角值作为 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
source
LinearAlgebra.ldltFunction
ldlt(S::SymTridiagonal) -> LDLt

计算实对称三对角矩阵 SLDLt(即 $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
source
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor

计算稀疏矩阵 A$LDL'$ 分解。A 必须是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 视图。请注意,即使 A 没有类型标签,它仍然必须是对称或厄米的。使用填充减少的置换。F = ldlt(A) 最常用于求解方程组 A*x = b,使用 F\b。返回的分解对象 F 还支持方法 diagdetlogdetinv。您可以使用 F.LF 中提取单个因子。然而,由于默认情况下启用了主元,分解在内部表示为 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 顺序)。

Note

此方法使用来自 SuiteSparse 的 CHOLMOD[ACM887][DavisHager2009] 库。CHOLMOD 仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将根据需要转换为这些类型。

CHOLMOD 的许多其他函数被封装但未从 Base.SparseArrays.CHOLMOD 模块导出。

source
LinearAlgebra.ldlt!Function
ldlt!(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
source
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

计算 A$LDL'$ 分解,重用符号分解 FA 必须是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 视图。请注意,即使 A 没有类型标签,它仍必须是对称的或厄米的。

另请参见 ldlt

Note

此方法使用来自 SuiteSparse 的 CHOLMOD 库,仅支持单精度或双精度的实数或复数类型。输入矩阵如果不是这些元素类型,将会被适当地转换为这些类型。

source
LinearAlgebra.QRType
QR <: 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).\]

迭代分解产生组件 QR

该对象有两个字段:

  • factors 是一个 m×n 矩阵。

    • 上三角部分包含 $R$ 的元素,即 R = triu(F.factors) 对于一个 QR 对象 F
    • 次对角部分包含以压缩格式存储的反射器 $v_i$,其中 $v_i$ 是矩阵 V = I + tril(F.factors, -1) 的第 $i$ 列。
  • τ 是一个长度为 min(m,n) 的向量,包含系数 $au_i$

source
LinearAlgebra.QRCompactWYType
QRCompactWY <: 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)$ 给出。

迭代分解产生组件 QR

该对象有两个字段:

  • factors,如同 QR 类型,是一个 m×n 矩阵。

    • 上三角部分包含 $R$ 的元素,即 R = triu(F.factors) 对于一个 QR 对象 F
    • 次对角部分包含反射器 $v_i$,以打包格式存储,使得 V = I + tril(F.factors, -1)
  • T 是一个 $n_b$×$\min(m,n)$ 矩阵,如上所述。每个三角矩阵 $T_j$ 的次对角元素被忽略。

Note

此格式不应与较旧的 WY 表示法混淆 [Bischof1987]

source
LinearAlgebra.QRPivotedType
QRPivoted <: 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).\]

迭代分解产生组件 QRp

该对象有三个字段:

  • factors 是一个 m×n 矩阵。

    • 上三角部分包含 $R$ 的元素,即 R = triu(F.factors) 对于一个 QR 对象 F
    • 次对角部分包含反射器 $v_i$,以压缩格式存储,其中 $v_i$ 是矩阵 V = I + tril(F.factors, -1) 的第 $i$ 列。
  • τ 是一个长度为 min(m,n) 的向量,包含系数 $au_i$

  • jpvt 是一个长度为 n 的整数向量,对应于置换 $P$

source
LinearAlgebra.qrFunction
qr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse

计算稀疏矩阵 AQR 分解。使用填充减少的行和列置换,使得 F.R = F.Q'*A[F.prow,F.pcol]。这种类型的主要应用是解决最小二乘或欠定问题,使用 \。该函数调用 C 库 SPQR[ACM933]

Note

qr(A::SparseMatrixCSC) 使用的是 SuiteSparse 中的 SPQR 库。由于该库仅支持具有 Float64ComplexF64 元素的稀疏矩阵,因此从 Julia v1.4 开始,qrA 转换为适当类型的 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
source
qr(A, pivot = NoPivot(); blocksize) -> F

计算矩阵 A 的 QR 分解:一个正交(或如果 A 是复值则为单位)矩阵 Q,以及一个上三角矩阵 R,使得

\[A = Q R\]

返回的对象 F 以打包格式存储分解:

  • 如果 pivot == ColumnNorm(),则 F 是一个 QRPivoted 对象,
  • 否则如果 A 的元素类型是 BLAS 类型(Float32Float64ComplexF32ComplexF64),则 F 是一个 QRCompactWY 对象,
  • 否则 F 是一个 QR 对象。

可以通过属性访问器检索分解 F 的各个组成部分:

  • F.Q:正交/单位矩阵 Q
  • F.R:上三角矩阵 R
  • F.p:置换向量(仅 QRPivoted
  • F.P:置换矩阵(仅 QRPivoted
Note

每次通过 F.R 引用上三角因子都会分配一个新数组。因此,建议缓存该数组,例如,通过 R = F.R 并继续使用 R

迭代分解会产生组件 QR,以及如果存在则为 p

以下函数可用于 QR 对象:invsize\。当 A 是矩形时,\ 将返回一个最小二乘解,如果解不是唯一的,则返回范数最小的解。当 A 不是满秩时,需要进行(列)置换的分解以获得最小范数解。

允许与全/方形或非全/方形 Q 进行乘法,即支持 F.Q*F.RF.Q*A。可以使用 MatrixQ 矩阵转换为常规矩阵。此操作返回“薄” Q 因子,即,如果 Am×nm>=n,则 Matrix(F.Q) 产生一个具有正交列的 m×n 矩阵。要检索“完整” Q 因子,即一个 m×m 的正交矩阵,请使用 F.Q*Icollect(F.Q)。如果 m<=n,则 Matrix(F.Q) 产生一个 m×m 的正交矩阵。

QR 分解的块大小可以通过关键字参数 blocksize :: Integer 指定,当 pivot == NoPivot()A isa StridedMatrix{<:BlasFloat} 时。如果 blocksize > minimum(size(A)),则会被忽略。请参见 QRCompactWY

Julia 1.4

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
Note

qr 返回多种类型,因为 LAPACK 使用几种表示法来最小化 Householder 基本反射器的乘积的内存存储需求,以便 QR 矩阵可以紧凑地存储,而不是作为两个单独的密集矩阵。

source
LinearAlgebra.qr!Function
qr!(A, pivot = NoPivot(); blocksize)

qr!qr 相同,当 AAbstractMatrix 的子类型时,但通过覆盖输入 A 来节省空间,而不是创建副本。如果因因式分解产生一个无法由 A 的元素类型表示的数字,例如对于整数类型,将抛出 InexactError 异常。

Julia 1.4

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:
[...]
source
LinearAlgebra.LQType
LQ <: 因式分解

矩阵 ALQ 因式分解类型。LQ 分解是 transpose(A)QR 分解。这是 lq 的返回类型,对应的矩阵因式分解函数。

如果 S::LQ 是因式分解对象,则可以通过 S.L 获取下三角组件,通过 S.Q 获取正交/单位组件,使得 A ≈ S.L*S.Q

迭代分解会产生组件 S.LS.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
source
LinearAlgebra.lqFunction
lq(A) -> S::LQ

计算 A 的 LQ 分解。分解的下三角成分可以通过 LQ 对象 SS.L 获得,正交/单位成分可以通过 S.Q 获得,从而有 A ≈ S.L*S.Q

迭代分解会产生成分 S.LS.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
source
LinearAlgebra.BunchKaufmanType
BunchKaufman <: Factorization

矩阵分解类型的 Bunch-Kaufman 分解用于对称或厄米矩阵 A,表示为 P'UDU'PP'LDL'P,具体取决于 A 中存储的是上三角(默认)还是下三角。如果 A 是复对称的,则 U'L' 表示非共轭转置,即分别为 transpose(U)transpose(L)。这是 bunchkaufman 的返回类型,对应的矩阵分解函数。

如果 S::BunchKaufman 是分解对象,则可以通过 S.DS.US.L 获取组件,具体取决于 S.uploS.p

迭代分解会生成组件 S.DS.US.L,具体取决于 S.uploS.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
source
LinearAlgebra.bunchkaufmanFunction
bunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman

计算对称或厄米矩阵 A 的 Bunch-Kaufman [Bunch1977] 分解为 P'*U*D*U'*PP'*L*D*L'*P,具体取决于 A 中存储的是哪个三角形,并返回一个 BunchKaufman 对象。请注意,如果 A 是复对称的,则 U'L' 表示未共轭的转置,即 transpose(U)transpose(L)

迭代分解会产生组件 S.DS.US.L,具体取决于 S.uploS.p

如果 rooktrue,则使用 rook 选主元。如果 rook 为 false,则不使用 rook 选主元。

check = true 时,如果分解失败,将抛出错误。当 check = false 时,检查分解有效性的责任(通过 issuccess)由用户承担。

以下函数可用于 BunchKaufman 对象:size\invissymmetricishermitiangetindex

示例

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
source
LinearAlgebra.EigenType
Eigen <: Factorization

矩阵分解类型,表示方阵 A 的特征值/谱分解。这是 eigen 的返回类型,对应的矩阵分解函数。

如果 F::Eigen 是分解对象,可以通过 F.values 获取特征值,通过矩阵 F.vectors 的列获取特征向量。(第 k 个特征向量可以通过切片 F.vectors[:, k] 获取。)

迭代分解会产生组件 F.valuesF.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
source
LinearAlgebra.GeneralizedEigenType
GeneralizedEigen <: Factorization

广义特征值/谱分解的矩阵分解类型,适用于 AB。这是调用带有两个矩阵参数的 eigen 时返回的相应矩阵分解函数的返回类型。

如果 F::GeneralizedEigen 是分解对象,则可以通过 F.values 获取特征值,通过矩阵 F.vectors 的列获取特征向量。(第 k 个特征向量可以通过切片 F.vectors[:, k] 获取。)

迭代分解会产生组件 F.valuesF.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
source
LinearAlgebra.eigvalsFunction
eigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values

返回 A 的特征值。

对于一般的非对称矩阵,可以在特征值计算之前指定如何平衡矩阵。permutescalesortby 关键字与 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
source

对于标量输入,eigvals 将返回一个标量。

示例

julia> eigvals(-2)
-2
source
eigvals(A, B) -> values

计算 AB 的广义特征值。

示例

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
source
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
source
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

返回 A 的特征值。可以通过指定一对 vlvu 来计算特征值的子集,分别表示特征值的下界和上界。

示例

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
source
LinearAlgebra.eigvals!Function
eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

eigvals 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。permutescalesortby 关键字与 eigen 相同。

Note

在对输入矩阵 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
source
eigvals!(A, B; sortby) -> values

eigvals 相同,但通过覆盖输入 A(和 B)来节省空间,而不是创建副本。

Note

在调用 eigvals! 后,输入矩阵 AB 将不再包含它们的特征值。它们被用作工作空间。

示例

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
source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

eigvals 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。irange 是要搜索的特征值 索引 的范围 - 例如,从第 2 个到第 8 个特征值。

source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

eigvals 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。vl 是搜索特征值的区间下界,vu 是上界。

source
LinearAlgebra.eigmaxFunction
eigmax(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:
[...]
source
LinearAlgebra.eigminFunction
eigmin(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:
[...]
source
LinearAlgebra.eigvecsFunction
eigvecs(A::SymTridiagonal[, eigvals]) -> Matrix

返回一个矩阵 M,其列是 A 的特征向量。(第 k 个特征向量可以通过切片 M[:, k] 获得。)

如果指定了可选的特征值向量 eigvalseigvecs 将返回相应的特征向量。

示例

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
source
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix

返回一个矩阵 M,其列是 A 的特征向量。(kth 特征向量可以通过切片 M[:, k] 获得。) permutescalesortby 关键字与 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
source
eigvecs(A, B) -> 矩阵

返回一个矩阵 M,其列是 AB 的广义特征向量。(kth 特征向量可以通过切片 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
source
LinearAlgebra.eigenFunction
eigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen

计算 A 的特征值分解,返回一个 Eigen 分解对象 F,该对象包含特征值在 F.values 中,特征向量在矩阵 F.vectors 的列中。这对应于求解形式为 Ax = λx 的特征值问题,其中 A 是一个矩阵,x 是一个特征向量,λ 是一个特征值。(kth 特征向量可以通过切片 F.vectors[:, k] 获得。)

迭代分解会产生组件 F.valuesF.vectors

以下函数可用于 Eigen 对象:invdetisposdef

对于一般的非对称矩阵,可以指定在特征向量计算之前如何平衡矩阵。选项 permute=true 会对矩阵进行置换,使其更接近上三角形,scale=true 会通过其对角元素缩放矩阵,使行和列在范数上更为相等。默认情况下,这两个选项均为 true

默认情况下,特征值和特征向量按 (real(λ),imag(λ)) 进行字典序排序。可以将不同的比较函数 by(λ) 传递给 sortby,或者可以传递 sortby=nothing 以保持特征值的任意顺序。一些特殊的矩阵类型(例如 DiagonalSymTridiagonal)可能会实现自己的排序约定,并不接受 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
source
eigen(A, B; sortby) -> GeneralizedEigen

计算 AB 的广义特征值分解,返回一个 GeneralizedEigen 分解对象 F,其中包含广义特征值在 F.values 中,广义特征向量在矩阵 F.vectors 的列中。这对应于求解形式为 Ax = λBx 的广义特征值问题,其中 A, B 是矩阵,x 是特征向量,λ 是特征值。(kth 广义特征向量可以通过切片 F.vectors[:, k] 获得。)

迭代分解会产生组件 F.valuesF.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
source
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen

计算 A 的特征值分解,返回一个 Eigen 分解对象 F,该对象包含特征值在 F.values 中,特征向量在矩阵 F.vectors 的列中。(第 k 个特征向量可以通过切片 F.vectors[:, k] 获得。)

迭代分解会产生组件 F.valuesF.vectors

以下函数可用于 Eigen 对象:invdetisposdef

UnitRange irange 指定要搜索的排序特征值的索引。

Note

如果 irange 不是 1:n,其中 nA 的维度,则返回的分解将是一个 截断 分解。

source
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen

计算 A 的特征值分解,返回一个 Eigen 分解对象 F,其中包含特征值在 F.values 中,特征向量在矩阵 F.vectors 的列中。(第 k 个特征向量可以通过切片 F.vectors[:, k] 获得。)

迭代分解会产生组件 F.valuesF.vectors

以下函数可用于 Eigen 对象:invdetisposdef

vl 是要搜索的特征值窗口的下界,vu 是上界。

Note

如果 [vl, vu] 不包含 A 的所有特征值,则返回的分解将是 截断 分解。

source
LinearAlgebra.eigen!Function
eigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)

eigen 相同,但通过覆盖输入 A(和 B)来节省空间,而不是创建副本。

source
LinearAlgebra.HessenbergType
Hessenberg <: 因式分解

Hessenberg 对象表示方阵的 Hessenberg 因式分解 QHQ',或其移位 Q(H+μI)Q',该因式分解由 hessenberg 函数生成。

source
LinearAlgebra.hessenbergFunction
hessenberg(A) -> Hessenberg

计算 A 的 Hessenberg 分解并返回一个 Hessenberg 对象。如果 F 是因式分解对象,则可以通过 F.Q(类型为 LinearAlgebra.HessenbergQ)访问单位矩阵,通过 F.H(类型为 UpperHessenberg)访问 Hessenberg 矩阵,任一矩阵都可以通过 Matrix(F.H)Matrix(F.Q) 转换为常规矩阵。

如果 AHermitian 或实 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
source
LinearAlgebra.SchurType
Schur <: Factorization

矩阵 A 的 Schur 分解的矩阵分解类型。这是 schur(_) 的返回类型,对应的矩阵分解函数。

如果 F::Schur 是分解对象,则 (准) 三角形 Schur 因子可以通过 F.SchurF.T 获得,正交/单位 Schur 向量可以通过 F.vectorsF.Z 获得,使得 A = F.vectors * F.Schur * F.vectors'。矩阵 A 的特征值可以通过 F.values 获得。

迭代分解会产生组件 F.TF.ZF.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
source
LinearAlgebra.GeneralizedSchurType
GeneralizedSchur <: Factorization

广义 Schur 分解的矩阵分解类型,适用于两个矩阵 AB。这是 schur(_, _) 的返回类型,对应的矩阵分解函数。

如果 F::GeneralizedSchur 是分解对象,则可以通过 F.SF.T 获取(准)三角 Schur 因子,通过 F.leftF.Q 获取左侧单位/正交 Schur 向量,通过 F.rightF.Z 获取右侧单位/正交 Schur 向量,使得 A=F.left*F.S*F.right'B=F.left*F.T*F.right'AB 的广义特征值可以通过 F.α./F.β 获取。

迭代分解会产生组件 F.SF.TF.QF.ZF.αF.β

source
LinearAlgebra.schurFunction
schur(A) -> F::Schur

计算矩阵 A 的 Schur 分解。可以通过 F.SchurF.TSchur 对象 F 中获得(准)三角 Schur 因子,正交/单位 Schur 向量可以通过 F.vectorsF.Z 获得,从而满足 A = F.vectors * F.Schur * F.vectors'。可以通过 F.values 获得 A 的特征值。

对于实数矩阵 A,Schur 分解是“准三角形”的,这意味着它是上三角的,除了对于任何共轭复特征值的 2×2 对角块;这使得即使存在复特征值,分解也可以完全是实数的。要从实数准三角分解中获得(复数)纯上三角的 Schur 分解,可以使用 Schur{Complex}(schur(A))

迭代分解会产生组件 F.TF.ZF.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
source
schur(A, B) -> F::GeneralizedSchur

计算矩阵 AB 的广义 Schur(或 QZ)分解。可以通过 F.SF.TSchur 对象 F 中获得(准)三角形 Schur 因子,左单位/正交 Schur 向量可以通过 F.leftF.Q 获得,右单位/正交 Schur 向量可以通过 F.rightF.Z 获得,使得 A=F.left*F.S*F.right'B=F.left*F.T*F.right'。广义特征值 AB 可以通过 F.α./F.β 获得。

迭代分解会产生组件 F.SF.TF.QF.ZF.αF.β

source
LinearAlgebra.schur!Function
schur!(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
source
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur

schur 相同,但使用输入矩阵 AB 作为工作区。

source
LinearAlgebra.ordschurFunction
ordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

根据逻辑数组 select 重新排序矩阵 A = Z*T*Z' 的 Schur 分解 F,返回重新排序的分解 F 对象。所选的特征值出现在 F.Schur 的主对角线上,F.vectors 的相应主列形成对应右不变子空间的正交/单位基。在实数情况下,复共轭特征值对必须通过 select 要么全部包含,要么全部排除。

source
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur

根据逻辑数组 select 重新排序矩阵对 (A, B) = (Q*S*Z', Q*T*Z') 的广义 Schur 分解 F,并返回一个广义 Schur 对象 F。所选的特征值出现在 F.SF.T 的主对角线上,左侧和右侧的正交/单位 Schur 向量也被重新排序,以便仍然满足 (A, B) = F.Q*(F.S, F.T)*F.Z',并且仍然可以通过 F.α./F.β 获取 AB 的广义特征值。

source
LinearAlgebra.ordschur!Function
ordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

ordschur 相同,但会覆盖分解 F

source
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur

ordschur 相同,但会覆盖分解 F

source
LinearAlgebra.SVDType
SVD <: Factorization

矩阵 A 的奇异值分解(SVD)的矩阵分解类型。这是 svd(_) 的返回类型,对应的矩阵分解函数。

如果 F::SVD 是分解对象,则可以通过 F.UF.SF.VF.Vt 获取 USVVt,使得 A = U * Diagonal(S) * VtS 中的奇异值按降序排列。

迭代分解会产生组件 USV

示例

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
source
LinearAlgebra.GeneralizedSVDType
GeneralizedSVD <: Factorization

广义奇异值分解(SVD)两矩阵 AB 的矩阵分解类型,使得 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] 的有效数值秩。

迭代分解产生组件 UVQD1D2R0

F.D1F.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
source
LinearAlgebra.svdFunction
svd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

计算 A 的奇异值分解(SVD)并返回一个 SVD 对象。

USVVt 可以通过因式分解 F 获取,使用 F.UF.SF.VF.Vt,使得 A = U * Diagonal(S) * Vt。该算法生成 Vt,因此提取 Vt 比提取 V 更高效。S 中的奇异值按降序排列。

迭代分解会产生组件 USV

如果 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()

Julia 1.3

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
source
svd(A, B) -> GeneralizedSVD

计算 AB 的广义 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] 的有效数值秩。

迭代分解产生组件 UVQD1D2R0

广义 SVD 用于应用场景,例如当人们想比较 AB 各自的贡献时,如人类与酵母基因组,或信号与噪声,或聚类之间与聚类内部的比较。(参见 Edelman 和 Wang 的讨论:https://arxiv.org/abs/1901.00485)

它将 [A; B] 分解为 [UC; VS]H,其中 [UC; VS][A; B] 列空间的自然正交基,H = RQ'[A;B] 行空间的自然非正交基,其中顶部行最密切归因于 A 矩阵,底部行归因于 B 矩阵。多余弦/正弦矩阵 CS 提供了 AB 的多重度量,而 UV 提供了这些度量的方向。

示例

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
source
LinearAlgebra.svd!Function
svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

svd!svd 相同,但通过覆盖输入 A 来节省空间,而不是创建副本。有关详细信息,请参见 svd 的文档。

source
svd!(A, B) -> 广义奇异值分解

svd!svd 相同,但会就地修改参数 AB,而不是创建副本。有关详细信息,请参见 svd 的文档。

source
LinearAlgebra.svdvalsFunction
svdvals(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
source
svdvals(A, B)

返回 AB 的广义奇异值,来自广义奇异值分解。另见 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
source
LinearAlgebra.svdvals!Function
svdvals!(A)

返回 A 的奇异值,通过覆盖输入来节省空间。另见 svdvalssvd

source
svdvals!(A, B)

返回 AB 的广义奇异值的广义奇异值分解,通过覆盖 AB 来节省空间。另见 svdsvdvals

source
LinearAlgebra.GivensType
LinearAlgebra.Givens(i1,i2,c,s) -> G

一个 Givens 旋转线性算子。字段 cs 分别表示旋转角度的余弦和正弦。Givens 类型支持左乘 G*A 和共轭转置右乘 A*G'。该类型没有 size,因此可以与任意大小的矩阵相乘,只要 i2<=size(A,2) 对于 G*Ai2<=size(A,1) 对于 A*G'

另见 givens

source
LinearAlgebra.givensFunction
givens(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

另见 LinearAlgebra.Givens.

source
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. ```

source
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)

计算 Givens 旋转 G 和标量 r,使得乘法的结果

B = G*x

具有以下属性:

B[i1] = r
B[i2] = 0

另见 LinearAlgebra.Givens. ```

source
LinearAlgebra.triuFunction
triu(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
source
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
source
LinearAlgebra.triu!Function
triu!(M)

矩阵的上三角,过程中覆盖 M。另见 triu

source
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
source
LinearAlgebra.trilFunction
tril(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
source
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
source
LinearAlgebra.tril!Function
tril!(M)

矩阵的下三角,过程中覆盖 M。另见 tril

source
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
source
LinearAlgebra.diagindFunction
diagind(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(对应主对角线)。

另请参见: diag, diagm, Diagonal

示例

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)
Julia 1.11

指定 IndexStyle 至少需要 Julia 1.11。

source
LinearAlgebra.diagFunction
diag(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
source
LinearAlgebra.diagmFunction
diagm(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 构造一个完整的矩阵;如果您想要存储效率高且运算快速的版本,请参见 DiagonalBidiagonal TridiagonalSymTridiagonal

示例

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
source
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
source
LinearAlgebra.rankFunction
rank(::QRSparse{Tv,Ti}) -> Ti

返回QR分解的秩

source
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti

通过计算 S 的 QR 分解来计算秩。小于 tol 的值被视为零。请参阅 SPQR 的手册。

source
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)

通过计算 svdvals(A) 的输出中有多少个大于 max(atol, rtol*σ₁) 来计算矩阵的数值秩,其中 σ₁A 的最大计算奇异值。atolrtol 分别是绝对和相对容差。默认的相对容差是 n*ϵ,其中 nA 最小维度的大小,ϵA 元素类型的 eps

Note

数值秩可能是对病态矩阵的敏感和不精确的表征,这些矩阵的奇异值接近阈值容差 max(atol, rtol*σ₁)。在这种情况下,对奇异值计算或矩阵的轻微扰动可能会通过推动一个或多个奇异值跨越阈值而改变 rank 的结果。这些变化甚至可能由于不同 Julia 版本、架构、编译器或操作系统之间的浮点错误变化而发生。

Julia 1.1

atolrtol 关键字参数需要至少 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
source
LinearAlgebra.normFunction
norm(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 |$norma_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
source
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
source
LinearAlgebra.opnormFunction
opnorm(A::AbstractMatrix, p::Real=2)

计算由向量 p-范数诱导的算子范数(或矩阵范数),其中有效的 p 值为 12Inf。(请注意,对于稀疏矩阵,当前未实现 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
source
opnorm(x::Number, p::Real=2)

对于数字,返回 $\left( |x|^p \right)^{1/p}$。这等同于 norm

source
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
source
LinearAlgebra.normalizeFunction
normalize(a, p::Real=2)

归一化 a 使其 p-范数等于 1,即 norm(a, p) == 1。对于标量,这类似于 sign(a),但 normalize(0) = NaN。另请参见 normalize!normsign

示例

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
source
LinearAlgebra.condFunction
cond(M, p::Real=2)

矩阵 M 的条件数,使用算子 p-范数计算。有效的 p 值为 12(默认)或 Inf

source
LinearAlgebra.condskeelFunction
condskeel(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 的有效值为 12Inf(默认)。

这个量在文献中也被称为 Bauer 条件数、相对条件数或逐分量相对条件数。

source
LinearAlgebra.trFunction
tr(M)

矩阵迹。对 M 的对角元素求和。

示例

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> tr(A)
5
source
LinearAlgebra.logdetFunction
logdet(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
source
LinearAlgebra.logabsdetFunction
logabsdet(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)
source
Base.invMethod
inv(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
source
LinearAlgebra.pinvFunction
pinv(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*ϵ,其中 nM 最小维度的大小,ϵ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
source
LinearAlgebra.nullspaceFunction
nullspace(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 ```

source
Base.kronFunction
kron(A, B)

计算两个向量、矩阵或数字的克罗内克积。

对于实向量 vw,克罗内克积与外积相关,通过 kron(v,w) == vec(w * transpose(v))w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))。注意 vw 在这些表达式的左右两侧的顺序不同(由于列主存储)。对于复向量,外积 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
source
Base.kron!Function
kron!(C, A, B)

计算 AB 的克罗内克积,并将结果存储在 C 中,覆盖 C 的现有内容。这是 kron 的就地版本。

Julia 1.6

此函数需要 Julia 1.6 或更高版本。

source
Base.expMethod
exp(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
source
Base.cisMethod
cis(A::AbstractMatrix)

更高效的方法用于平方矩阵 Aexp(im*A)(特别是当 AHermitian 或实对称矩阵时)。

另见 cispi, sincos, exp

Julia 1.7

在 Julia 1.7 中添加了对使用 cis 处理矩阵的支持。

示例

julia> cis([π 0; 0 π]) ≈ -I
true
source
Base.:^Method
^(A::AbstractMatrix, p::Number)

矩阵幂,相当于 $\exp(p\log(A))$

示例

julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
 1  26
 0  27
source
Base.:^Method
^(b::Number, A::AbstractMatrix)

矩阵指数,等价于 $\exp(\log(b)A)$

Julia 1.1

在 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
source
Base.logMethod
log(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
source
Base.sqrtMethod
sqrt(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
source
sqrt(A::AbstractMatrix)

如果 A 没有负的实特征值,计算 A 的主矩阵平方根,即唯一的矩阵 $X$,其特征值具有正实部,使得 $X^2 = A$。否则,将返回非主平方根。

如果 A 是实对称或厄米矩阵,则使用其特征分解 (eigen) 来计算平方根。对于这样的矩阵,由于舍入误差而略微负的特征值 λ 被视为零。更准确地说,所有特征值 ≥ -rtol*(max |λ|) 的矩阵被视为半正定(产生一个厄米平方根),负特征值被视为零。rtolsqrt 的一个关键字参数(仅在厄米/实对称情况下),默认为机器精度乘以 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
source
Base.Math.cbrtMethod
cbrt(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
source
Base.cosMethod
cos(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
source
Base.sinMethod
sin(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
source
Base.Math.sincosMethod
sincos(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
source
Base.tanMethod
tan(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
source
Base.coshMethod
cosh(A::AbstractMatrix)

计算方阵 A 的矩阵双曲余弦。

source
Base.sinhMethod
sinh(A::AbstractMatrix)

计算方阵 A 的矩阵双曲正弦。

source
Base.tanhMethod
tanh(A::AbstractMatrix)

计算方阵 A 的矩阵双曲正切。

source
Base.acosMethod
acos(A::AbstractMatrix)

计算方阵 A 的逆矩阵余弦。

如果 A 是对称的或厄米的,则使用其特征分解 (eigen) 来计算逆余弦。否则,逆余弦是通过使用 logsqrt 来确定的。有关用于计算此函数的理论和对数公式,请参见 [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
source
Base.asinMethod
asin(A::AbstractMatrix)

计算方阵 A 的逆矩阵正弦。

如果 A 是对称的或厄米的,则使用其特征分解 (eigen) 来计算逆正弦。否则,逆正弦是通过使用 logsqrt 来确定的。有关用于计算此函数的理论和对数公式,请参见 [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
source
Base.atanMethod
atan(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
source
Base.acoshMethod
acosh(A::AbstractMatrix)

计算方阵 A 的反双曲余弦矩阵。有关用于计算此函数的理论和对数公式,请参见 [AH16_4]

source
Base.asinhMethod
asinh(A::AbstractMatrix)

计算方阵 A 的反双曲正弦矩阵。有关用于计算此函数的理论和对数公式,请参见 [AH16_5]

source
Base.atanhMethod
atanh(A::AbstractMatrix)

计算方阵 A 的逆双曲矩阵切线。有关用于计算此函数的理论和对数公式,请参见 [AH16_6]

source
LinearAlgebra.lyapFunction
lyap(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
source
LinearAlgebra.sylvesterFunction
sylvester(A, B, C)

计算Sylvester方程AX + XB + C = 0的解X,其中ABC具有兼容的维度,并且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
source
LinearAlgebra.issuccessFunction
issuccess(F::Factorization)

测试矩阵的因式分解是否成功。

Julia 1.6

issuccess(::CholeskyPivoted) 需要 Julia 1.6 或更高版本。

示例

julia> F = cholesky([1 0; 0 1]);

julia> issuccess(F)
true
source
issuccess(F::LU; allowsingular = false)

测试矩阵的 LU 分解是否成功。默认情况下,产生有效但秩不足的 U 因子的分解被视为失败。通过传递 allowsingular = true 可以更改此行为。

Julia 1.11

allowsingular 关键字参数是在 Julia 1.11 中添加的。

示例

julia> F = lu([1 2; 1 2], check = false);

julia> issuccess(F)
false

julia> issuccess(F, allowsingular = true)
true
source
LinearAlgebra.issymmetricFunction
issymmetric(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
source
LinearAlgebra.isposdefFunction
isposdef(A) -> Bool

测试一个矩阵是否是正定的(和厄米的),通过尝试对 A 进行 Cholesky 分解。

另见 isposdef!, cholesky.

示例

julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
 1   2
 2  50

julia> isposdef(A)
true
source
LinearAlgebra.isposdef!Function
isposdef!(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
source
LinearAlgebra.istrilFunction
istril(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
source
LinearAlgebra.istriuFunction
istriu(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
source
LinearAlgebra.isdiagFunction
isdiag(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
source
LinearAlgebra.ishermitianFunction
ishermitian(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
source
Base.transposeFunction
transpose(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

AbstractVectortranspose 是一个行向量:

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]
source
transpose(F::Factorization)

因式分解 F 的惰性转置。默认情况下,返回一个 TransposeFactorization,但对于具有实数 eltypeFactorization,则返回一个 AdjointFactorization

source
LinearAlgebra.transpose!Function
transpose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

转置矩阵 A 并将其存储在矩阵 X 中。size(X) 必须等于 size(transpose(A))。除非需要调整 Xrowvalnzval,否则不分配额外的内存。

请参见 halfperm!

source
transpose!(dest,src)

转置数组 src 并将结果存储在预分配的数组 dest 中,dest 的大小应对应于 (size(src,2),size(src,1))。不支持就地转置,如果 srcdest 有重叠的内存区域,将会发生意外结果。

示例

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
source
LinearAlgebra.TransposeType
转置

用于底层线性代数对象的转置视图的惰性包装类型,通常是 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
source
Base.adjointFunction
A'
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]
source
adjoint(F::Factorization)

因式分解 F 的惰性伴随。默认返回一个 AdjointFactorization 包装器。

source
LinearAlgebra.adjoint!Function
adjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

转置矩阵 A 并将元素的伴随存储在矩阵 X 中。size(X) 必须等于 size(transpose(A))。除了在需要时调整 Xrowvalnzval 之外,不会分配额外的内存。

请参见 halfperm!

source
adjoint!(dest,src)

共轭转置数组 src 并将结果存储在预分配的数组 dest 中,dest 的大小应对应于 (size(src,2),size(src,1))。不支持就地转置,如果 srcdest 有重叠的内存区域,将会发生意外结果。

示例

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
source
LinearAlgebra.AdjointType
伴随

用于底层线性代数对象的伴随视图的惰性包装类型,通常是 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
source
Base.copyMethod
copy(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
source
LinearAlgebra.stride1Function
stride1(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
source
LinearAlgebra.checksquareFunction
LinearAlgebra.checksquare(A)

检查一个矩阵是否为方阵,然后返回其公共维度。对于多个参数,返回一个向量。

示例

julia> A = fill(1, (4,4)); B = fill(1, (5,5));

julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
 4
 5
source
LinearAlgebra.peakflopsFunction
LinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)

peakflops 通过使用双精度 gemm! 计算计算机的峰值浮点运算速率。默认情况下,如果未指定任何参数,它将乘以两个大小为 n x nFloat64 矩阵,其中 n = 4096。如果底层的 BLAS 使用多个线程,则可以实现更高的浮点运算速率。BLAS 线程的数量可以通过 BLAS.set_num_threads(n) 设置。

如果提供了关键字参数 eltypepeakflops 将构造具有类型 eltype 的元素的矩阵以计算峰值浮点运算速率。

默认情况下,peakflops 将使用 3 次试验中的最佳计时。如果提供了关键字参数 ntrialspeakflops 将使用指定的试验次数来选择最佳计时。

如果关键字参数 parallel 设置为 truepeakflops 将在所有工作处理器上并行运行。将返回整个并行计算机的浮点运算速率。在并行运行时,仅使用 1 个 BLAS 线程。参数 n 仍然指的是在每个处理器上解决的问题的大小。

Julia 1.1

此函数至少需要 Julia 1.1。在 Julia 1.0 中,它可以从标准库 InteractiveUtils 中获得。

source
LinearAlgebra.hermitianpartFunction
hermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

返回方阵 A 的厄米部分,定义为 (A + A') / 2,作为一个 Hermitian 矩阵。对于实矩阵 A,这也被称为 A 的对称部分;有时也称为“算子实部”。可选参数 uplo 控制 Hermitian 视图的相应参数。对于实矩阵,后者等同于 Symmetric 视图。

另请参见 hermitianpart! 以获取相应的就地操作。

Julia 1.10

此函数需要 Julia 1.10 或更高版本。

source
LinearAlgebra.hermitianpart!Function
hermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

就地覆盖方阵 A 的厄米部分 (A + A') / 2,并返回 Hermitian(A, uplo)。对于实矩阵 A,这也被称为 A 的对称部分。

另请参见 hermitianpart 以获取相应的非就地操作。

Julia 1.10

此函数需要 Julia 1.10 或更高版本。

source
LinearAlgebra.copy_adjoint!Function
copy_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)

source
LinearAlgebra.copy_transpose!Function
copy_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)

source
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!

source

Low-level matrix operations

在许多情况下,矩阵操作有就地版本,允许您提供一个预分配的输出向量或矩阵。这在优化关键代码时非常有用,以避免重复分配的开销。这些就地操作在下面以 ! 结尾(例如 mul!),符合通常的 Julia 约定。

LinearAlgebra.mul!Function
mul!(Y, A, B) -> Y

计算矩阵-矩阵或矩阵-向量乘积 $A B$ 并将结果存储在 Y 中,覆盖 Y 的现有值。请注意,Y 不能与 AB 发生别名。

示例

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!

source
mul!(C, A, B, α, β) -> C

结合就地矩阵-矩阵或矩阵-向量乘加 $A B α + C β$。结果存储在 C 中,覆盖原有值。请注意,C 不能与 AB 发生别名。

Julia 1.3

五个参数的 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
source
LinearAlgebra.lmul!Function
lmul!(a::Number, B::AbstractArray)

通过标量 a 缩放数组 B,并就地覆盖 B。使用 rmul! 从右侧乘以标量。缩放操作遵循 aB 中元素之间的乘法 * 语义。特别地,这也适用于涉及非有限数的乘法,例如 NaN±Inf

Julia 1.1

在 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
source
lmul!(A, B)

计算矩阵-矩阵乘积 $AB$,覆盖 B,并返回结果。这里,A 必须是特殊矩阵类型,例如 DiagonalUpperTriangularLowerTriangular,或某种正交类型,参见 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
source
LinearAlgebra.rmul!Function
rmul!(A::AbstractArray, b::Number)

通过标量 b 缩放数组 A,并就地覆盖 A。使用 lmul! 从左侧乘以标量。缩放操作遵循 A 的元素与 b 之间的乘法 * 的语义。特别地,这也适用于涉及非有限数的乘法,例如 NaN±Inf

Julia 1.1

在 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
source
rmul!(A, B)

计算矩阵-矩阵乘积 $AB$,覆盖 A,并返回结果。这里,B 必须是特殊矩阵类型,例如 DiagonalUpperTriangularLowerTriangular,或某种正交类型,参见 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
source
LinearAlgebra.ldiv!Function
ldiv!(Y, A, B) -> Y

计算 A \ B 并将结果存储在 Y 中,返回结果。

参数 A 应该是一个矩阵。相反,它应该是一个分解对象(例如,由 factorizecholesky 生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu! 进行就地操作),而在性能关键的情况下,通常需要对 A 的分解进行细粒度控制。

Note

某些结构化矩阵类型,例如 DiagonalUpperTriangular,是被允许的,因为它们已经处于分解形式

示例

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
source
ldiv!(A, B)

计算 A \ B,并在原地覆盖 B 以存储结果。

参数 A 不应 是一个矩阵。相反,它应该是一个分解对象(例如,由 factorizecholesky 生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu! 在原地完成),而在性能关键的情况下,通常需要对 A 的分解进行细粒度控制。

Note

某些结构化矩阵类型,例如 DiagonalUpperTriangular,是允许的,因为它们已经处于分解形式

示例

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
source
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
source
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B

通过带部分主元的高斯消元法就地计算 A \ B,并将结果存储在 B 中,返回结果。在此过程中,A 的对角线也会被覆盖。

Julia 1.11

ldiv! 对于 Tridiagonal 左侧需要至少 Julia 1.11。

source
LinearAlgebra.rdiv!Function
rdiv!(A, B)

计算 A / B 并在原地覆盖 A 以存储结果。

参数 B 不应 是一个矩阵。相反,它应该是一个分解对象(例如,由 factorizecholesky 生成)。这样做的原因是,分解本身既昂贵又通常会分配内存(尽管也可以通过例如 lu! 在原地完成),而在性能关键的情况下,通常也需要对 B 的分解进行细粒度控制。

Note

某些结构化矩阵类型,例如 DiagonalUpperTriangular,是被允许的,因为它们已经处于分解形式。

source
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
source

BLAS functions

在Julia(如同许多科学计算中),密集线性代数操作基于LAPACK library,而这又是建立在被称为BLAS的基本线性代数构建块之上。对于每种计算机架构,都有高度优化的BLAS实现,有时在高性能线性代数例程中,直接调用BLAS函数是很有用的。

LinearAlgebra.BLAS 提供了一些 BLAS 函数的封装。那些覆盖输入数组的 BLAS 函数的名称以 '!' 结尾。通常,一个 BLAS 函数定义了四个方法,分别用于 Float32Float64ComplexF32ComplexF64 数组。

BLAS character arguments

许多 BLAS 函数接受参数,这些参数决定是否转置一个参数(trans),引用矩阵的哪个三角形(uploul),是否可以假设三角矩阵的对角线全为一(dA),或者输入参数属于矩阵乘法的哪一侧(side)。可能性包括:

Multiplication order

sideMeaning
'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/ulMeaning
'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/tXMeaning
'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/dXMeaning
'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.set_num_threadsFunction
set_num_threads(n::Integer)
set_num_threads(::Nothing)

将 BLAS 库应使用的线程数设置为 n::Integer

也接受 nothing,在这种情况下,julia 会尝试猜测默认的线程数。传递 nothing 不被推荐,主要是出于历史原因。

source

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!Function
rot!(n, X, incx, Y, incy, c, s)

c*X + s*Y 覆盖 X,并用 -conj(s)*X + c*Y 覆盖 Y,针对数组 X 的前 n 个元素,步长为 incx,以及数组 Y 的前 n 个元素,步长为 incy。返回 XY

Julia 1.5

rot! 至少需要 Julia 1.5。

source
LinearAlgebra.BLAS.scal!Function
scal!(n, a, X, incx)
scal!(a, X)

a*X 覆盖数组 X 的前 n 个元素,步长为 incx。返回 X

如果未提供 nincx,则使用 length(X)stride(X,1)

source
LinearAlgebra.BLAS.scalFunction
scal(n, a, X, incx)
scal(a, X)

返回 X 的前 n 个元素乘以 a,步长为 incx

如果未提供 nincx,则使用 length(X)stride(X,1)

source
LinearAlgebra.BLAS.blascopy!Function
blascopy!(n, X, incx, Y, incy)

将数组 X 中的 n 个元素(步长为 incx)复制到数组 Y 中(步长为 incy)。返回 Y

source
LinearAlgebra.BLAS.dotFunction
dot(n, X, incx, Y, incy)

两个向量的点积,由数组 Xn 个元素(步幅为 incx)和数组 Yn 个元素(步幅为 incy)组成。

示例

julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
source
LinearAlgebra.BLAS.dotuFunction
dotu(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
source
LinearAlgebra.BLAS.dotcFunction
dotc(n, X, incx, U, incy)

用于两个复数向量的点积函数,由数组 Xn 个元素(步长为 incx)和数组 Un 个元素(步长为 incy)组成,对第一个向量进行共轭。

示例

julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
source
LinearAlgebra.BLAS.nrm2Function
nrm2(n, X, incx)

由数组 Xn 个元素组成的向量的 2-范数,步长为 incx

示例

julia> BLAS.nrm2(4, fill(1.0, 8), 2)
2.0

julia> BLAS.nrm2(1, fill(1.0, 8), 2)
1.0
source
LinearAlgebra.BLAS.asumFunction
asum(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
source
LinearAlgebra.BLAS.iamaxFunction
iamax(n, dx, incx)
iamax(dx)

找到 dx 中绝对值最大的元素的索引。ndx 的长度,incx 是步幅。如果未提供 nincx,则假定默认值为 n=length(dx)incx=stride1(dx)

source

Level 2 BLAS functions

二级 BLAS 函数在 [(Dongarra, 1988)][Dongarra-1988] 中发布,定义了矩阵-向量操作。

[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291

返回一个向量

LinearAlgebra.BLAS.gemv!Function
gemv!(tA, alpha, A, x, beta, y)

更新向量 yalpha*A*x + beta*yalpha*A'x + beta*y,具体取决于 tAalphabeta 是标量。返回更新后的 y

source
LinearAlgebra.BLAS.gbmv!Function
gbmv!(trans, m, kl, ku, alpha, A, x, beta, y)

根据 trans 更新向量 yalpha*A*x + beta*yalpha*A'*x + beta*y。矩阵 A 是一个维度为 m x size(A,2) 的一般带状矩阵,具有 kl 个下对角线和 ku 个上对角线。alphabeta 是标量。返回更新后的 y

source
LinearAlgebra.BLAS.gbmvFunction
gbmv(trans, m, kl, ku, alpha, A, x)

根据 trans 返回 alpha*A*xalpha*A'*x。矩阵 A 是一个维度为 msize(A,2) 的一般带状矩阵,具有 kl 个下对角线和 ku 个上对角线,alpha 是一个标量。

source
LinearAlgebra.BLAS.hemv!Function
hemv!(ul, alpha, A, x, beta, y)

更新向量 yalpha*A*x + beta*y。假设 A 是厄米的。仅使用 Aul 三角部分。alphabeta 是标量。返回更新后的 y

source
LinearAlgebra.BLAS.hemvMethod
hemv(ul, alpha, A, x)

返回 alpha*A*x。假设 A 是厄米的。仅使用 Aul 三角部分。alpha 是一个标量。

source
LinearAlgebra.BLAS.hpmv!Function
hpmv!(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],依此类推。

标量输入 αβ 必须是复数或实数。

数组输入 xyAP 必须都是 ComplexF32ComplexF64 类型。

返回更新后的 y

Julia 1.5

hpmv! 至少需要 Julia 1.5。

source
LinearAlgebra.BLAS.symv!Function
symv!(ul, alpha, A, x, beta, y)

更新向量 yalpha*A*x + beta*y。假设 A 是对称的。仅使用 Aul 三角部分。alphabeta 是标量。返回更新后的 y

source
LinearAlgebra.BLAS.symvMethod
symv(ul, alpha, A, x)

返回 alpha*A*x。假设 A 是对称的。仅使用 Aul 三角部分。alpha 是一个标量。

source
LinearAlgebra.BLAS.sbmv!Function
sbmv!(uplo, k, alpha, A, x, beta, y)

更新向量 yalpha*A*x + beta*y,其中 A 是一个对称带状矩阵,阶数为 size(A,2),具有 k 个超对角线,存储在参数 A 中。A 的存储布局在参考 BLAS 模块中描述,级别-2 BLAS 可在 https://www.netlib.org/lapack/explore-html/ 找到。仅使用 uplo 三角形的 A

返回更新后的 y

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, alpha, A, x)

返回 alpha*A*x,其中 A 是一个阶数为 size(A,2) 的对称带状矩阵,具有在参数 A 中存储的 k 个超对角线。仅使用 Auplo 三角部分。

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, A, x)

返回 A*x,其中 A 是一个阶数为 size(A,2) 的对称带状矩阵,具有在参数 A 中存储的 k 个超对角线。仅使用 Auplo 三角部分。

source
LinearAlgebra.BLAS.spmv!Function
spmv!(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],依此类推。

标量输入 αβ 必须是实数。

数组输入 xyAP 必须都是 Float32Float64 类型。

返回更新后的 y

Julia 1.5

spmv! 至少需要 Julia 1.5。

source
LinearAlgebra.BLAS.trmv!Function
trmv!(ul, tA, dA, A, b)

返回 op(A)*b,其中 optA 决定。仅使用 Aul 三角部分。dA 决定是否读取对角线值或假设它们都是一。乘法在 b 上就地进行。

source
LinearAlgebra.BLAS.trmvFunction
trmv(ul, tA, dA, A, b)

返回 op(A)*b,其中 optA 确定。仅使用 Aul 三角部分。dA 确定是否读取对角线值或假定它们都是一。

source
LinearAlgebra.BLAS.trsv!Function
trsv!(ul, tA, dA, A, b)

A*x = b 的解覆盖 b,或根据 tAul 确定的其他两个变体之一。 dA 确定是否读取对角线值或假定它们都是一。 返回更新后的 b

source
LinearAlgebra.BLAS.trsvFunction
trsv(ul, tA, dA, A, b)

返回 A*x = b 的解,或由 tAul 确定的其他两个变体。dA 确定对角线值是被读取还是假定为全为一。

source

返回一个矩阵

LinearAlgebra.BLAS.her!Function
her!(uplo, alpha, x, A)

仅适用于复数数组。对厄米矩阵 A 进行秩-1 更新,使用向量 x 进行更新,形式为 alpha*x*x' + Auplo 控制更新 A 的哪个三角部分。返回 A

source
LinearAlgebra.BLAS.syr!Function
syr!(uplo, alpha, x, A)

对称矩阵 A 的秩-1 更新,使用向量 x 进行更新,形式为 alpha*x*transpose(x) + Auplo 控制更新 A 的哪个三角部分。返回 A

source
LinearAlgebra.BLAS.spr!Function
spr!(uplo, α, x, AP)

将矩阵 A 更新为 A+α*x*x',其中 A 是以压缩格式提供的对称矩阵 APx 是一个向量。

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],依此类推。

标量输入 α 必须是实数。

数组输入 xAP 必须都是 Float32Float64 类型。返回更新后的 AP

Julia 1.8

spr! 至少需要 Julia 1.8。

source

Level 3 BLAS functions

第3级BLAS函数在[(Dongarra, 1990)][Dongarra-1990]中发布,定义了矩阵-矩阵操作。

[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170

LinearAlgebra.BLAS.gemmt!Function
gemmt!(uplo, tA, tB, alpha, A, B, beta, C)

根据 uplo 指定的下三角或上三角部分更新 C,计算为 alpha*A*B + beta*C 或根据 tAtB 的其他变体。返回更新后的 C

Julia 1.11

gemmt! 至少需要 Julia 1.11。

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, alpha, A, B)

返回由 uplo 指定的 A*B 的下三角或上三角部分,或根据 tAtB 的其他三个变体。

Julia 1.11

gemmt 至少需要 Julia 1.11。

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, A, B)

返回由 uplo 指定的 A*B 的下三角或上三角部分,或根据 tAtB 的其他三个变体。

Julia 1.11

gemmt 至少需要 Julia 1.11。

source
LinearAlgebra.BLAS.gemm!Function
gemm!(tA, tB, alpha, A, B, beta, C)

更新 Calpha*A*B + beta*C 或根据 tAtB 的其他三种变体。返回更新后的 C

source
LinearAlgebra.BLAS.symm!Function
symm!(side, ul, alpha, A, B, beta, C)

根据 side 更新 Calpha*A*B + beta*Calpha*B*A + beta*C。假设 A 是对称的。仅使用 Aul 三角部分。返回更新后的 C

source
LinearAlgebra.BLAS.symmMethod
symm(side, ul, alpha, A, B)

返回 alpha*A*Balpha*B*A,具体取决于 side。假设 A 是对称的。仅使用 Aul 三角部分。

source
LinearAlgebra.BLAS.hemm!Function
hemm!(side, ul, alpha, A, B, beta, C)

根据 side 更新 Calpha*A*B + beta*Calpha*B*A + beta*C。假设 A 是厄米的。仅使用 Aul 三角部分。返回更新后的 C

source
LinearAlgebra.BLAS.hemmMethod
hemm(side, ul, alpha, A, B)

返回 alpha*A*Balpha*B*A,具体取决于 side。假设 A 是厄米的。仅使用 Aul 三角部分。

source
LinearAlgebra.BLAS.syrk!Function
syrk!(uplo, trans, alpha, A, beta, C)

对称矩阵 C 的秩-k 更新为 alpha*A*transpose(A) + beta*Calpha*transpose(A)*A + beta*C,具体取决于 trans。仅使用 Cuplo 三角部分。返回 C

source
LinearAlgebra.BLAS.syrkFunction
syrk(uplo, trans, alpha, A)

根据 uplo,返回 A 的上三角或下三角,或根据 trans 返回 alpha*A*transpose(A)alpha*transpose(A)*A

source
LinearAlgebra.BLAS.herk!Function
herk!(uplo, trans, alpha, A, beta, C)

仅适用于复数数组。根据 trans,对厄米矩阵 C 进行秩-k 更新,形式为 alpha*A*A' + beta*Calpha*A'*A + beta*C。仅更新 Cuplo 三角部分。返回 C

source
LinearAlgebra.BLAS.syr2k!Function
syr2k!(uplo, trans, alpha, A, B, beta, C)

对称矩阵 C 的秩-2k 更新为 alpha*A*transpose(B) + alpha*B*transpose(A) + beta*Calpha*transpose(A)*B + alpha*transpose(B)*A + beta*C,具体取决于 trans。仅使用 Cuplo 三角部分。返回 C

source
LinearAlgebra.BLAS.syr2kFunction
syr2k(uplo, trans, alpha, A, B)

返回 uplo 三角形的 alpha*A*transpose(B) + alpha*B*transpose(A)alpha*transpose(A)*B + alpha*transpose(B)*A,具体取决于 trans

source
syr2k(uplo, trans, A, B)

返回 uplo 三角形的 A*transpose(B) + B*transpose(A)transpose(A)*B + transpose(B)*A,具体取决于 trans

source
LinearAlgebra.BLAS.her2k!Function
her2k!(uplo, trans, alpha, A, B, beta, C)

Hermitian 矩阵 C 的 Rank-2k 更新为 alpha*A*B' + alpha*B*A' + beta*Calpha*A'*B + alpha*B'*A + beta*C,具体取决于 trans。标量 beta 必须是实数。仅使用 Cuplo 三角部分。返回 C

source
LinearAlgebra.BLAS.her2kFunction
her2k(uplo, trans, alpha, A, B)

返回 uplo 三角形的 alpha*A*B' + alpha*B*A'alpha*A'*B + alpha*B'*A,具体取决于 trans

source
her2k(uplo, trans, A, B)

返回uplo三角形的A*B' + B*A'A'*B + B'*A,具体取决于trans

source
LinearAlgebra.BLAS.trmm!Function
trmm!(side, ul, tA, dA, alpha, A, B)

更新 Balpha*A*B 或由 sidetA 确定的其他三种变体之一。仅使用 Aul 三角形。dA 决定是否读取对角线值或假定它们都是一。返回更新后的 B

source
LinearAlgebra.BLAS.trmmFunction
trmm(side, ul, tA, dA, alpha, A, B)

返回 alpha*A*B 或由 sidetA 确定的其他三种变体之一。仅使用 Aul 三角形。dA 决定是否读取对角线值或假定它们都是一。

source
LinearAlgebra.BLAS.trsm!Function
trsm!(side, ul, tA, dA, alpha, A, B)

A*X = alpha*B 的解覆盖 B,或根据 sidetA 确定的其他三种变体之一。仅使用 Aul 三角形。dA 决定是否读取对角线值或假定它们都是一。返回更新后的 B

source
LinearAlgebra.BLAS.trsmFunction
trsm(side, ul, tA, dA, alpha, A, B)

返回 A*X = alpha*B 的解,或由 sidetA 确定的其他三种变体之一。仅使用 Aul 三角形。dA 确定是否读取对角线值或假定它们都是一。

source

LAPACK functions

LinearAlgebra.LAPACK 提供了一些线性代数的 LAPACK 函数的封装。那些覆盖输入数组的函数名称以 '!' 结尾。

通常一个函数定义了4个方法,分别对应于 Float64Float32ComplexF64ComplexF32 数组。

请注意,Julia 提供的 LAPACK API 可能会在未来发生变化。由于该 API 不是面向用户的,因此没有承诺在未来的版本中支持/弃用这一特定功能集。

LinearAlgebra.LAPACK.gbtrf!Function
gbtrf!(kl, ku, m, AB) -> (AB, ipiv)

计算带状矩阵 AB 的 LU 分解。kl 是包含非零带的第一个下对角线,ku 是包含非零带的最后一个上对角线,m 是矩阵 AB 的第一个维度。返回就地的 LU 分解和用于的主元向量 ipiv

source
LinearAlgebra.LAPACK.gbtrs!Function
gbtrs!(trans, kl, ku, m, AB, ipiv, B)

求解方程 AB * X = Btrans 决定 AB 的方向。它可以是 N(不转置)、T(转置)或 C(共轭转置)。kl 是包含非零带的第一个下对角线,ku 是包含一个的最后上对角线,m 是矩阵 AB 的第一个维度。ipiv 是从 gbtrf! 返回的主元向量。返回向量或矩阵 X,在原地覆盖 B

source
LinearAlgebra.LAPACK.gebal!Function
gebal!(job, A) -> (ilo, ihi, scale)

在计算矩阵 A 的特征系统或 Schur 分解之前,平衡矩阵 Ajob 可以是 NA 不会被置换或缩放)、PA 只会被置换)、SA 只会被缩放)或 BA 将同时被置换和缩放)。就地修改 A 并返回 iloihiscale。如果启用了置换,则 A[i,j] = 0 如果 j > i1 < j < iloj > ihiscale 包含有关所执行的缩放/置换的信息。

source
LinearAlgebra.LAPACK.gebak!Function
gebak!(job, side, ilo, ihi, scale, V)

将使用 gebal! 平衡的矩阵的特征向量 V 转换为原始矩阵的未缩放/未排列的特征向量。就地修改 Vside 可以是 L(转换左特征向量)或 R(转换右特征向量)。

source
LinearAlgebra.LAPACK.gebrd!Function
gebrd!(A) -> (A, d, e, tauq, taup)

A 原地减少为双对角形式 A = QBP'。返回 A,包含双对角矩阵 Bd,包含 B 的对角元素;e,包含 B 的非对角元素;tauq,包含表示 Q 的初等反射器;以及 taup,包含表示 P 的初等反射器。

source
LinearAlgebra.LAPACK.gelqf!Function
gelqf!(A, tau)

计算 ALQ 分解,A = LQtau 包含标量,用于参数化分解的基本反射器。tau 的长度必须大于或等于 A 的最小维度。

返回就地修改的 Atau

source
gelqf!(A) -> (A, tau)

计算 ALQ 分解,A = LQ

返回 A,在原地修改,并返回 tau,其中包含参数化分解的初等反射器的标量。

source
LinearAlgebra.LAPACK.geqlf!Function
geqlf!(A, tau)

计算 AQL 分解,A = QLtau 包含标量,用于参数化分解的基本反射器。tau 的长度必须大于或等于 A 的最小维度。

返回就地修改的 Atau

source
geqlf!(A) -> (A, tau)

计算 AQL 分解,A = QL

返回 A,就地修改,并返回 tau,其中包含参数化分解的初等反射器的标量。

source
LinearAlgebra.LAPACK.geqrf!Function
geqrf!(A, tau)

计算 AQR 分解,A = QRtau 包含标量,用于参数化分解的初等反射器。tau 的长度必须大于或等于 A 的最小维度。

返回就地修改的 Atau

source
geqrf!(A) -> (A, tau)

计算 AQR 分解,A = QR

返回 A,就地修改,并返回 tau,其中包含参数化分解的初等反射器的标量。

source
LinearAlgebra.LAPACK.geqp3!Function
geqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)

计算 A 的带主元的 QR 分解,AP = QR,使用 BLAS 级别 3。P 是一个主元矩阵,由 jpvt 表示。tau 存储基本反射器。参数 jpvttau 是可选的,允许传递预分配的数组。当传递时,如果 A 是一个 (m x n) 矩阵,则 jpvt 的长度必须大于或等于 n,而 tau 的长度必须大于或等于 A 的最小维度。输入时,如果 jpvt[j] 不等于零,则 A 的第 j 列被置换到 AP 的前面。

Ajpvttau 在原地被修改。

source
LinearAlgebra.LAPACK.gerqf!Function
gerqf!(A, tau)

计算 ARQ 分解,A = RQtau 包含参数化分解的初等反射器的标量。tau 的长度必须大于或等于 A 的最小维度。

返回就地修改的 Atau

source
gerqf!(A) -> (A, tau)

计算 ARQ 分解,A = RQ

返回 A,就地修改,并返回 tau,其中包含参数化分解的初等反射器的标量。

source
LinearAlgebra.LAPACK.geqrt!Function
geqrt!(A, T)

计算 A 的分块 QR 分解,A = QRT 包含上三角块反射器,用于参数化分解的初等反射器。T 的第一个维度设置块大小,必须在 1 和 n 之间。T 的第二个维度必须等于 A 的最小维度。

返回就地修改的 AT

source
geqrt!(A, nb) -> (A, T)

计算 A 的分块 QR 分解,A = QRnb 设置块大小,必须在 1 和 A 的第二维 n 之间。

返回 A,就地修改,并返回 T,其中包含上三角块反射器,参数化分解的初等反射器。

source
LinearAlgebra.LAPACK.geqrt3!Function
geqrt3!(A, T)

递归计算 A 的分块 QR 分解,A = QRT 包含上三角块反射器,用于参数化分解的初等反射器。T 的第一维设置块大小,必须在 1 和 n 之间。T 的第二维必须等于 A 的最小维度。

返回就地修改的 AT

source
geqrt3!(A) -> (A, T)

递归计算 A 的分块 QR 分解,A = QR

返回 A,在原地修改,以及 T,其中包含上三角块反射器,用于参数化分解的基本反射器。

source
LinearAlgebra.LAPACK.getrf!Function
getrf!(A, ipiv) -> (A, ipiv, info)

计算 A 的带主元的 LU 分解,A = LUipiv 包含主元信息,info 是一个代码,指示成功(info = 0)、U 中的奇异值(info = i,在这种情况下 U[i,i] 是奇异的),或错误代码(info < 0)。

source
getrf!(A) -> (A, ipiv, info)

计算 A 的带主元的 LU 分解,A = LU

返回修改后的 A、主元信息 ipiv 和一个 info 代码,指示成功(info = 0)、U 中的奇异值(info = i,在这种情况下 U[i,i] 是奇异的)或错误代码(info < 0)。

source
LinearAlgebra.LAPACK.tzrzf!Function
tzrzf!(A) -> (A, tau)

将上三角梯形矩阵 A 原地转换为上三角形形式。返回 Atau,即变换的初等反射器的标量参数。

source
LinearAlgebra.LAPACK.ormrz!Function
ormrz!(side, trans, A, tau, C)

将矩阵 C 乘以由 tzrzf! 提供的变换中的 Q。根据 sidetrans,乘法可以是左侧的(side = L, Q*C)或右侧的(side = R, C*Q),并且 Q 可以是未修改的(trans = N)、转置的(trans = T)或共轭转置的(trans = C)。返回矩阵 C,该矩阵在原地被修改为乘法的结果。

source
LinearAlgebra.LAPACK.gels!Function
gels!(trans, A, B) -> (F, B, ssr)

求解线性方程 A * X = Btranspose(A) * X = Badjoint(A) * X = B,使用 QR 或 LQ 分解。就地修改矩阵/向量 B 以得到解。A 被其 QRLQ 分解覆盖。trans 可以是 N(不修改)、T(转置)或 C(共轭转置)。gels! 寻找最小范数/最小二乘解。A 可能是欠定或超定的。解返回在 B 中。

source
LinearAlgebra.LAPACK.gesv!Function
gesv!(A, B) -> (B, A, ipiv)

求解线性方程 A * X = B,其中 A 是一个方阵,使用 ALU 分解。A 被覆盖为其 LU 分解,B 被覆盖为解 Xipiv 包含 ALU 分解的主元信息。

source
LinearAlgebra.LAPACK.getrs!Function
getrs!(trans, A, ipiv, B)

求解线性方程 A * X = Btranspose(A) * X = Badjoint(A) * X = B,其中 A 为方阵。就地修改矩阵/向量 B 以得到解。A 是来自 getrf!LU 分解,ipiv 是主元信息。trans 可以是 N(不修改)、T(转置)或 C(共轭转置)。

source
LinearAlgebra.LAPACK.getri!Function
getri!(A, ipiv)

计算 A 的逆,使用通过 getrf! 找到的 LU 分解。ipiv 是输出的主元信息,A 包含 getrf!LU 分解。A 被覆盖为其逆。

source
LinearAlgebra.LAPACK.gesvx!Function
gesvx!(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),使用 ALU 分解。fact 可以是 E,在这种情况下 A 将被平衡并复制到 AF;可以是 F,在这种情况下 AFipiv 来自先前的 LU 分解作为输入;或者是 N,在这种情况下 A 将被复制到 AF 然后进行分解。如果 fact = Fequed 可以是 N,表示 A 尚未平衡;R,表示 A 从左侧乘以 Diagonal(R)C,表示 A 从右侧乘以 Diagonal(C);或 B,表示 A 从左侧乘以 Diagonal(R) 并从右侧乘以 Diagonal(C)。如果 fact = Fequed = RB,则 R 的所有元素必须为正。如果 fact = Fequed = CB,则 C 的所有元素必须为正。

返回解 Xequed,如果 fact 不是 N,则为输出,描述所执行的平衡;R,行平衡对角线;C,列平衡对角线;B,可能会被其平衡形式 Diagonal(R)*B(如果 trans = Nequed = R,B)或 Diagonal(C)*B(如果 trans = T,Cequed = C,B)覆盖;rcond,平衡后 A 的倒数条件数;ferr,每个解向量在 X 中的前向误差界限;berr,每个解向量在 X 中的前向误差界限;以及 work,倒数主元增长因子。

source
gesvx!(A, B)

gesvx! 的无平衡、无转置简化。

source
LinearAlgebra.LAPACK.gelsd!Function
gelsd!(A, B, rcond) -> (B, rnk)

计算 A * X = B 的最小范数解,通过找到 ASVD 分解,然后对问题进行分治。B 被覆盖为解 X。小于 rcond 的奇异值将被视为零。返回的解在 B 中,A 的有效秩在 rnk 中。

source
LinearAlgebra.LAPACK.gelsy!Function
gelsy!(A, B, rcond) -> (B, rnk)

计算 A * X = B 的最小范数解,通过找到 A 的完整 QR 分解,然后对问题进行分治。B 被覆盖为解 X。小于 rcond 的奇异值将被视为零。返回的解在 B 中,A 的有效秩在 rnk 中。

source
LinearAlgebra.LAPACK.gglse!Function
gglse!(A, c, B, d) -> (X,res)

求解方程 A * x = c,其中 x 受到等式约束 B * x = d。使用公式 ||c - A*x||^2 = 0 进行求解。返回 X 和残差平方和。

source
LinearAlgebra.LAPACK.geev!Function
geev!(jobvl, jobvr, A) -> (W, VL, VR)

找到 A 的特征系统。如果 jobvl = N,则不计算 A 的左特征向量。如果 jobvr = N,则不计算 A 的右特征向量。如果 jobvl = Vjobvr = V,则计算相应的特征向量。返回特征值在 W 中,右特征向量在 VR 中,左特征向量在 VL 中。

source
LinearAlgebra.LAPACK.gesdd!Function
gesdd!(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' 的行。

source
LinearAlgebra.LAPACK.gesvd!Function
gesvd!(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' 的行并单独返回。jobujobvt 不能同时为 O

返回 USVt,其中 SA 的奇异值。

source
LinearAlgebra.LAPACK.ggsvd!Function
ggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)

找到 AB 的广义奇异值分解,U'*A*Q = D1*RV'*B*Q = D2*RD1 的对角线上有 alphaD2 的对角线上有 beta。如果 jobu = U,则计算正交/单位矩阵 U。如果 jobv = V,则计算正交/单位矩阵 V。如果 jobq = Q,则计算正交/单位矩阵 Q。如果 jobujobvjobqN,则不计算该矩阵。此函数仅在 3.6.0 之前的 LAPACK 版本中可用。

source
LinearAlgebra.LAPACK.ggsvd3!Function
ggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)

找到 AB 的广义奇异值分解,U'*A*Q = D1*RV'*B*Q = D2*RD1 的对角线上有 alphaD2 的对角线上有 beta。如果 jobu = U,则计算正交/单位矩阵 U。如果 jobv = V,则计算正交/单位矩阵 V。如果 jobq = Q,则计算正交/单位矩阵 Q。如果 jobujobvjobqN,则不计算该矩阵。此函数需要 LAPACK 3.6.0。

source
LinearAlgebra.LAPACK.geevx!Function
geevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)

找到具有矩阵平衡的 A 的特征系统。如果 jobvl = N,则不计算 A 的左特征向量。如果 jobvr = N,则不计算 A 的右特征向量。如果 jobvl = Vjobvr = V,则计算相应的特征向量。如果 balanc = N,则不执行平衡。如果 balanc = P,则 A 被置换但不缩放。如果 balanc = S,则 A 被缩放但不置换。如果 balanc = B,则 A 被置换并缩放。如果 sense = N,则不计算倒数条件数。如果 sense = E,则仅计算特征值的倒数条件数。如果 sense = V,则仅计算右特征向量的倒数条件数。如果 sense = B,则计算右特征向量和特征向量的倒数条件数。如果 sense = E,B,则必须计算右和左特征向量。

source
LinearAlgebra.LAPACK.ggev!Function
ggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

找到 AB 的广义特征分解。如果 jobvl = N,则不计算左特征向量。如果 jobvr = N,则不计算右特征向量。如果 jobvl = Vjobvr = V,则计算相应的特征向量。

source
LinearAlgebra.LAPACK.ggev3!Function
ggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

使用分块算法查找 AB 的广义特征分解。如果 jobvl = N,则不计算左特征向量。如果 jobvr = N,则不计算右特征向量。如果 jobvl = Vjobvr = V,则计算相应的特征向量。此函数需要 LAPACK 3.6.0。

source
LinearAlgebra.LAPACK.gtsv!Function
gtsv!(dl, d, du, B)

求解方程 A * X = B,其中 A 是一个三对角矩阵,dl 在下对角线上,d 在对角线上,du 在上对角线上。

用解 X 覆盖 B 并返回它。

source
LinearAlgebra.LAPACK.gttrf!Function
gttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)

找到一个三对角矩阵的 LU 分解,其中 dl 在下对角线上,d 在对角线上,du 在上对角线上。

就地修改 dlddu,并返回它们以及第二个上对角线 du2 和主元向量 ipiv

source
LinearAlgebra.LAPACK.gttrs!Function
gttrs!(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

source
LinearAlgebra.LAPACK.orglq!Function
orglq!(A, tau, k = length(tau))

显式地找到在对 A 调用 gelqf! 之后的 LQ 分解的矩阵 Q。使用 gelqf! 的输出。AQ 覆盖。

source
LinearAlgebra.LAPACK.orgqr!Function
orgqr!(A, tau, k = length(tau))

显式地找到在对 A 调用 geqrf! 之后的 QR 分解的矩阵 Q。使用 geqrf! 的输出。AQ 覆盖。

source
LinearAlgebra.LAPACK.orgql!Function
orgql!(A, tau, k = length(tau))

显式地找到在对 A 调用 geqlf! 之后的 QL 分解的矩阵 Q。使用 geqlf! 的输出。AQ 覆盖。

source
LinearAlgebra.LAPACK.orgrq!Function
orgrq!(A, tau, k = length(tau))

显式地找到在对 A 调用 gerqf! 之后的 RQ 分解的矩阵 Q。使用 gerqf! 的输出。AQ 覆盖。

source
LinearAlgebra.LAPACK.ormlq!Function
ormlq!(side, trans, A, tau, C)

计算 Q * Ctrans = N),transpose(Q) * Ctrans = T),adjoint(Q) * Ctrans = C)对于 side = L 或者使用从 gelqf! 计算的 ALQ 分解的 Q 进行等效的右侧乘法对于 side = RC 被覆盖。

source
LinearAlgebra.LAPACK.ormqr!Function
ormqr!(side, trans, A, tau, C)

计算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),对于 side = L 或者使用 side = R 的等效右侧乘法,使用从 geqrf! 计算的 AQR 分解中的 QC 被覆盖。

source
LinearAlgebra.LAPACK.ormql!Function
ormql!(side, trans, A, tau, C)

计算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),对于 side = L 或者使用从 geqlf! 计算的 AQL 分解得到的 Q 进行等效的右侧乘法 side = RC 被覆盖。

source
LinearAlgebra.LAPACK.ormrq!Function
ormrq!(side, trans, A, tau, C)

计算 Q * Ctrans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)对于 side = L 或者使用从 gerqf! 计算的 ARQ 分解得到的 Q 进行等效的右侧乘法对于 side = RC 被覆盖。

source
LinearAlgebra.LAPACK.gemqrt!Function
gemqrt!(side, trans, V, T, C)

计算 Q * Ctrans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)对于 side = L 或者使用从 geqrt! 计算的 AQR 分解中的 Q 进行等效的右侧乘法对于 side = RC 被覆盖。

source
LinearAlgebra.LAPACK.posv!Function
posv!(uplo, A, B) -> (A, B)

找到 A * X = B 的解,其中 A 是一个对称或厄米正定矩阵。如果 uplo = U,则计算 A 的上三角 Cholesky 分解。如果 uplo = L,则计算 A 的下三角 Cholesky 分解。A 被其 Cholesky 分解覆盖。B 被解 X 覆盖。

source
LinearAlgebra.LAPACK.potrf!Function
potrf!(uplo, A)

计算正定矩阵 A 的 Cholesky 分解(如果 uplo = U 则为上三角,如果 uplo = L 则为下三角)。A 被覆盖并返回一个信息代码。

source
LinearAlgebra.LAPACK.potri!Function
potri!(uplo, A)

计算正定矩阵 A 的逆,在调用 potrf! 找到其(如果 uplo = U 则为上三角,如果 uplo = L 则为下三角)Cholesky 分解后。

A 被其逆覆盖并返回。

source
LinearAlgebra.LAPACK.potrs!Function
potrs!(uplo, A, B)

找到 A * X = B 的解,其中 A 是一个对称或厄米正定矩阵,其 Cholesky 分解是通过 potrf! 计算的。如果 uplo = U,则计算了 A 的上三角 Cholesky 分解。如果 uplo = L,则计算了 A 的下三角 Cholesky 分解。B 被覆盖为解 X

source
LinearAlgebra.LAPACK.pstrf!Function
pstrf!(uplo, A, tol) -> (A, piv, rank, info)

计算正定矩阵 A 的(如果 uplo = U 则为上三角,如果 uplo = L 则为下三角)带主元的 Cholesky 分解,使用用户设置的容忍度 tolA 被其 Cholesky 分解覆盖。

返回 A、主元 pivA 的秩,以及一个 info 代码。如果 info = 0,则分解成功。如果 info = i > 0,则 A 是不定的或秩不足。

source
LinearAlgebra.LAPACK.ptsv!Function
ptsv!(D, E, B)

求解正定三对角矩阵 A 的方程 A * X = BDA 的对角线,E 是副对角线。B 被覆盖为解 X 并返回。

source
LinearAlgebra.LAPACK.pttrf!Function
pttrf!(D, E)

计算正定三对角矩阵的 LDLt 分解,其中 D 为对角线,E 为非对角线。DE 被覆盖并返回。

source
LinearAlgebra.LAPACK.pttrs!Function
pttrs!(D, E, B)

求解正定三对角矩阵 A 的方程 A * X = B,其中对角线为 D,副对角线为 E,在使用 pttrf! 计算 A 的 LDLt 分解后。B 被覆盖为解 X

source
LinearAlgebra.LAPACK.trtri!Function
trtri!(uplo, diag, A)

找到(如果 uplo = U 则为上三角,如果 uplo = L 则为下三角)矩阵 A 的逆。如果 diag = N,则 A 具有非单位对角元素。如果 diag = U,则 A 的所有对角元素均为一。A 被其逆所覆盖。

source
LinearAlgebra.LAPACK.trtrs!Function
trtrs!(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

source
LinearAlgebra.LAPACK.trcon!Function
trcon!(norm, uplo, diag, A)

找到三角矩阵 A 的倒数条件数(如果 uplo = U 则为上三角,如果 uplo = L 则为下三角)。如果 diag = N,则 A 具有非单位对角元素。如果 diag = U,则 A 的所有对角元素均为一。如果 norm = I,则在无穷范数下找到条件数。如果 norm = O1,则在一范数下找到条件数。

source
LinearAlgebra.LAPACK.trevc!Function
trevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))

查找上三角矩阵 T 的特征系统。如果 side = R,则计算右特征向量。如果 side = L,则计算左特征向量。如果 side = B,则计算两组特征向量。如果 howmny = A,则找到所有特征向量。如果 howmny = B,则找到所有特征向量并使用 VLVR 进行反变换。如果 howmny = S,则仅计算与 select 中的值对应的特征向量。

source
LinearAlgebra.LAPACK.trrfs!Function
trrfs!(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 的所有对角元素均为一。FerrBerr 是可选输入。Ferr 是前向误差,Berr 是后向误差,均为分量式。

source
LinearAlgebra.LAPACK.stev!Function
stev!(job, dv, ev) -> (dv, Zmat)

计算对称三对角矩阵的特征系统,其中 dv 为对角线,ev 为副对角线。如果 job = N,则仅找到特征值并返回在 dv 中。如果 job = V,则特征向量也会被找到并返回在 Zmat 中。

source
LinearAlgebra.LAPACK.stebz!Function
stebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)

计算对称三对角矩阵的特征值,其中 dv 为对角线,ev 为非对角线。如果 range = A,则找到所有特征值。如果 range = V,则找到半开区间 (vl, vu] 中的特征值。如果 range = I,则找到索引在 iliu 之间的特征值。如果 order = B,特征值在一个块内排序。如果 order = E,则在所有块之间排序。abstol 可以设置为收敛的容差。

source
LinearAlgebra.LAPACK.stegr!Function
stegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)

计算对称三对角矩阵的特征值(jobz = N)或特征值和特征向量(jobz = V),其中 dv 为对角线,ev 为非对角线。如果 range = A,则找到所有特征值。如果 range = V,则找到半开区间 (vl, vu] 中的特征值。如果 range = I,则找到索引在 iliu 之间的特征值。特征值返回在 w 中,特征向量返回在 Z 中。

source
LinearAlgebra.LAPACK.stein!Function
stein!(dv, ev_in, w_in, iblock_in, isplit_in)

计算对称三对角矩阵的特征向量,其中 dv 为对角线,ev_in 为副对角线。w_in 指定要查找对应特征向量的输入特征值。iblock_in 指定与 w_in 中特征值对应的子矩阵。isplit_in 指定子矩阵块之间的分割点。

source
LinearAlgebra.LAPACK.syconv!Function
syconv!(uplo, A, ipiv) -> (A, work)

将对称矩阵 A(已被分解为三角矩阵)转换为两个矩阵 LD。如果 uplo = U,则 A 是上三角的。如果 uplo = L,则它是下三角的。ipiv 是来自三角分解的主元向量。ALD 覆盖。

source
LinearAlgebra.LAPACK.sysv!Function
sysv!(uplo, A, B) -> (B, A, ipiv)

找到对称矩阵 AA * X = B 的解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。B 被解 X 覆盖。A 被其 Bunch-Kaufman 分解覆盖。ipiv 包含关于分解的主元信息。

source
LinearAlgebra.LAPACK.sytrf!Function
sytrf!(uplo, A) -> (A, ipiv, info)

计算对称矩阵 A 的 Bunch-Kaufman 分解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。

返回被分解覆盖的 A、一个主元向量 ipiv 和错误代码 info,该代码是一个非负整数。如果 info 为正,则矩阵是奇异的,分解的对角部分在位置 info 处恰好为零。

source
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)

计算对称矩阵 A 的 Bunch-Kaufman 分解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。

返回被分解覆盖的 A、主元向量 ipiv 和错误代码 info,该代码是一个非负整数。如果 info 为正,则矩阵是奇异的,分解的对角部分在位置 info 处恰好为零。

source
LinearAlgebra.LAPACK.sytri!Function
sytri!(uplo, A, ipiv)

计算对称矩阵 A 的逆,使用 sytrf! 的结果。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。A 被其逆覆盖。

source
LinearAlgebra.LAPACK.sytrs!Function
sytrs!(uplo, A, ipiv, B)

求解方程 A * X = B,其中 A 是一个对称矩阵,使用 sytrf! 的结果。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。B 被解 X 覆盖。

source
LinearAlgebra.LAPACK.hesv!Function
hesv!(uplo, A, B) -> (B, A, ipiv)

找到 Hermitian 矩阵 AA * X = B 的解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。B 被解 X 覆盖。A 被其 Bunch-Kaufman 分解覆盖。ipiv 包含关于分解的主元信息。

source
LinearAlgebra.LAPACK.hetrf!Function
hetrf!(uplo, A) -> (A, ipiv, info)

计算厄米矩阵 A 的 Bunch-Kaufman 分解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。

返回被分解覆盖的 A、一个主元向量 ipiv 和错误代码 info,该代码是一个非负整数。如果 info 为正,则矩阵是奇异的,分解的对角部分在位置 info 处恰好为零。

source
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)

计算厄米矩阵 A 的 Bunch-Kaufman 分解。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。

返回被分解覆盖的 A、主元向量 ipiv 和错误代码 info,该代码是一个非负整数。如果 info 为正,则矩阵是奇异的,分解的对角部分在位置 info 处恰好为零。

source
LinearAlgebra.LAPACK.hetri!Function
hetri!(uplo, A, ipiv)

计算 Hermitian 矩阵 A 的逆,使用 sytrf! 的结果。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。A 被其逆覆盖。

source
LinearAlgebra.LAPACK.hetrs!Function
hetrs!(uplo, A, ipiv, B)

求解方程 A * X = B,其中 A 是一个厄米矩阵,使用 sytrf! 的结果。如果 uplo = U,则存储 A 的上半部分。如果 uplo = L,则存储下半部分。B 被解 X 覆盖。

source
LinearAlgebra.LAPACK.syev!Function
syev!(jobz, uplo, A)

查找对称矩阵 A 的特征值(jobz = N)或特征值和特征向量(jobz = V)。如果 uplo = U,则使用 A 的上三角部分。如果 uplo = L,则使用 A 的下三角部分。

source
LinearAlgebra.LAPACK.syevr!Function
syevr!(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,则找到索引在 iliu 之间的特征值。abstol 可以设置为收敛的容差。

特征值返回在 W 中,特征向量返回在 Z 中。

source
LinearAlgebra.LAPACK.syevd!Function
syevd!(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)。

source
LinearAlgebra.LAPACK.sygvd!Function
sygvd!(itype, jobz, uplo, A, B) -> (w, A, B)

查找对称矩阵 A 和对称正定矩阵 B 的广义特征值(jobz = N)或特征值和特征向量(jobz = V)。如果 uplo = U,则使用 AB 的上三角部分。如果 uplo = L,则使用 AB 的下三角部分。如果 itype = 1,要解决的问题是 A * x = lambda * B * x。如果 itype = 2,要解决的问题是 A * B * x = lambda * x。如果 itype = 3,要解决的问题是 B * A * x = lambda * x

source
LinearAlgebra.LAPACK.bdsqr!Function
bdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)

计算具有对角线 d 和副对角线 e_ 的双对角矩阵的奇异值分解。如果 uplo = U,则 e_ 是超对角线。如果 uplo = L,则 e_ 是下对角线。还可以选择计算乘积 Q' * C

返回奇异值在 d 中,矩阵 C 被覆盖为 Q' * C

source
LinearAlgebra.LAPACK.bdsdc!Function
bdsdc!(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 中。

source
LinearAlgebra.LAPACK.gecon!Function
gecon!(normtype, A, anorm)

找到矩阵 A 的倒数条件数。如果 normtype = I,则条件数在无穷范数中找到。如果 normtype = O1,则条件数在一范数中找到。A 必须是 getrf! 的结果,anormA 在相关范数中的范数。

source
LinearAlgebra.LAPACK.gehrd!Function
gehrd!(ilo, ihi, A) -> (A, tau)

将矩阵 A 转换为 Hessenberg 形式。如果 A 是通过 gebal! 平衡的,则 iloihigebal! 的输出。否则,它们应该是 ilo = 1ihi = size(A,2)tau 包含分解的基本反射器。

source
LinearAlgebra.LAPACK.orghr!Function
orghr!(ilo, ihi, A, tau)

显式地找到 Q,即来自 gehrd! 的正交/单位矩阵。iloihiAtau 必须对应于 gehrd! 的输入/输出。

source
LinearAlgebra.LAPACK.gees!Function
gees!(jobvs, A) -> (A, vs, w)

计算矩阵 A 的特征值(jobvs = N)或特征值和 Schur 向量(jobvs = V)。A 被其 Schur 形式覆盖。

返回 A、包含 Schur 向量的 vs 和包含特征值的 w

source
LinearAlgebra.LAPACK.gges!Function
gges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)

计算 AB 的广义特征值、广义 Schur 形式、左 Schur 向量(jobsvl = V)或右 Schur 向量(jobvsr = V)。

广义特征值返回在 alphabeta 中。左 Schur 向量返回在 vsl 中,右 Schur 向量返回在 vsr 中。

source
LinearAlgebra.LAPACK.gges3!Function
gges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)

计算广义特征值、广义 Schur 形式、左 Schur 向量(jobsvl = V)或右 Schur 向量(jobvsr = V)的 AB,使用阻塞算法。此函数需要 LAPACK 3.6.0。

广义特征值返回在 alphabeta 中。左 Schur 向量返回在 vsl 中,右 Schur 向量返回在 vsr 中。

source
LinearAlgebra.LAPACK.trexc!Function
trexc!(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

source
LinearAlgebra.LAPACK.trsen!Function
trsen!(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 = Ncompq = V

返回 TQ,重新排序的特征值 w,特征值簇的条件数 s,以及不变子空间的条件数 sep

source
LinearAlgebra.LAPACK.tgsen!Function
tgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)

重新排列广义舒尔分解的向量。select 指定每个簇中的特征值。

source
LinearAlgebra.LAPACK.trsyl!Function
trsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)

解决 Sylvester 矩阵方程 A * X +/- X * B = scale*C,其中 AB 都是准上三角矩阵。如果 transa = N,则 A 不会被修改。如果 transa = T,则 A 被转置。如果 transa = C,则 A 被共轭转置。transbB 也类似。如果 isgn = 1,则方程 A * X + X * B = scale * C 被求解。如果 isgn = -1,则方程 A * X - X * B = scale * C 被求解。

返回 X(覆盖 C)和 scale

source
LinearAlgebra.LAPACK.hseqr!Function
hseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)

计算所有特征值和(可选)矩阵的 Schur 分解,该矩阵已被简化为 Hessenberg 形式。如果 H 是通过 gebal! 平衡的,则 iloihigebal! 的输出。否则,它们应该是 ilo = 1ihi = size(H,2)tau 包含分解的基本反射器。

source
  • 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