線性代數

除了 (以及作為其中一部分) 支援多維陣列之外,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 提供許多 分解,可透過將矩陣預先分解成更適合問題(基於效能或記憶體原因)的格式,來加速線性求解或矩陣指數運算等問題。有關更多資訊,請參閱 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 不是 Hermitian、對稱、三角形、三對角線或雙對角線,因此 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

此處的 \ 運算執行線性求解。左除運算子相當強大,且可以輕鬆撰寫簡潔、可讀的程式碼,其靈活性足以解決各種線性方程式組。

特殊矩陣

具有特殊對稱性和結構的矩陣 經常出現在線性代數中,並且經常與各種矩陣分解相關聯。Julia 具有豐富的特殊矩陣類型集合,這些集合允許使用專門為特定矩陣類型開發的特殊例程進行快速計算。

下表總結了已在 Julia 中實現的特殊矩陣類型,以及是否可以使用 LAPACK 中針對它們的各種優化方法的掛鉤。

類型說明
Symmetric對稱矩陣
Hermitian厄米矩陣
UpperTriangular三角矩陣
UnitUpperTriangular對角線為單位的上三角矩陣
LowerTriangular三角矩陣
UnitLowerTriangular對角線為單位的下三角矩陣
UpperHessenbergHessenberg 矩陣
Tridiagonal三對角矩陣
SymTridiagonal對稱三對角矩陣
Bidiagonal上/下雙對角矩陣
Diagonal對角矩陣
UniformScaling均勻縮放運算子

基本運算

矩陣類型+-*\具有優化方法的其他函數
SymmetricMVinvsqrtexp
HermitianMVinvsqrtexp
UpperTriangularMVMVinvdetlogdet
UnitUpperTriangularMVMVinvdetlogdet
LowerTriangularMVMVinvdetlogdet
UnitLowerTriangularMVMVinvdetlogdet
UpperHessenbergMMinvdet
SymTridiagonalMMMSMVeigmaxeigmin
TridiagonalMMMSMV
BidiagonalMMMSMV
DiagonalMMMVMVinvdetlogdet/
UniformScalingMMMVSMVS/

圖例

關鍵說明
M(矩陣)提供矩陣-矩陣運算的最佳化方法
V(向量)提供矩陣-向量運算的最佳化方法
S(純量)提供矩陣-純量運算的最佳化方法

矩陣分解

矩陣類型LAPACKeigeneigvalseigvecssvdsvdvals
SymmetricSYARI
HermitianHEARI
UpperTriangularTRAAA
UnitUpperTriangularTRAAA
LowerTriangularTRAAA
UnitLowerTriangularTRAAA
SymTridiagonalSTAARIAV
TridiagonalGT
BidiagonalBDAA
DiagonalDIA

圖例

關鍵說明範例
A(全部)提供找出所有特徵值和/或特徵向量的最佳化方法例如:eigvals(M)
R(範圍)提供找出第 il 個到第 ih 個特徵值的最佳化方法eigvals(M, il, ih)
I(區間)提供找出區間 [vl, vh] 中的特徵值的最佳化方法eigvals(M, vl, vh)
V(向量)提供找出對應於特徵值 x=[x1, x2,...] 的特徵向量的最佳化方法eigvecs(M, x)

均勻縮放算子

一個 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 和不同的 μ 求解許多形式為 (A+μI)x = b 的系統,那麼首先通過 hessenberg 函數計算 A 的 Hessenberg 分解 F 可能是有益的。給定 F,Julia 使用了一個有效的演算法來計算 (F+μ*I) \ b(等於 (A+μ*I)x \ b)和相關運算,例如行列式。

矩陣分解

矩陣分解(又稱矩陣分解) 計算一個矩陣分解為一個矩陣乘積,並且是(數值)線性代數中的核心概念之一。

下表總結了在 Julia 中已實現的矩陣分解類型。它們相關方法的詳細資訊可以在線性代數文件中的 標準函數 部分中找到。

類型說明
BunchKaufmanBunch-Kaufman 分解
CholeskyCholesky 分解
CholeskyPivoted樞紐 Cholesky 分解
LDLtLDL(T) 分解
LULU 分解
QRQR 分解
QRCompactWYQR 分解的緊湊 WY 形式
QRPivoted樞紐 QR 分解
LQtranspose(A)QR 分解
HessenbergHessenberg 分解
Eigen譜分解
GeneralizedEigen廣義譜分解
SVD奇異值分解
GeneralizedSVD廣義 SVD
SchurSchur 分解
GeneralizedSchur廣義 Schur 分解

Factorization 物件的伴隨和轉置會分別以 AdjointFactorizationTransposeFactorization 物件包裝起來。一般而言,實數 Factorization 的轉置會包裝為 AdjointFactorization

正交矩陣 (AbstractQ)

有些矩陣分解會產生正交/酉「矩陣」因子。這些分解包括從呼叫 qr 獲得的 QR 相關分解,例如 QRQRCompactWYQRPivoted,從呼叫 hessenberg 獲得的 Hessenberg 分解,以及從 lq 獲得的 LQ 分解。雖然這些正交/酉因子允許矩陣表示,但它們的內部表示基於效能和記憶體考量而有所不同。因此,應該將它們視為由矩陣支援的函式式線性算子。特別是,例如讀取其矩陣表示的某一欄,需要執行「矩陣」-向量乘法程式碼,而不是僅從記憶體讀取資料 (可能會以結構零填滿向量的部分)。另一個與其他非三角矩陣類型的明顯區別在於,底層乘法程式碼允許在乘法過程中進行原地修改。此外,特定 AbstractQ 子類型的物件,例如透過 qrhessenberglq 建立的物件,可以根據情況表現得像方陣或矩形矩陣

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 的矩陣表示形式,以及索引到矩陣表示形式的所有工作。相反地,加法和減法以及更通用的廣播在矩陣表示形式中的元素上會失敗,因為那將非常低效。對於此類使用案例,請考慮預先計算矩陣表示形式並將其快取以供未來重複使用。

標準函數

Julia 中的線性代數函數在很大程度上是透過呼叫 LAPACK 中的函數來實作。稀疏矩陣分解呼叫 SuiteSparse 中的函數。其他稀疏求解器可用作 Julia 套件。

Base.:*方法
*(A::AbstractMatrix, B::AbstractMatrix)

矩陣相乘。

範例

julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
 2  1
 1  1
Base.:\方法
\(A, B)

使用多重演算法的矩陣除法。對於輸入矩陣 AB,結果 XA*X == B,其中 A 為方陣。使用的求解器取決於 A 的結構。如果 A 是上或下三角形(或對角線),則不需要 A 的分解,並且使用前向或後向替換來求解系統。對於非三角形方陣,則使用 LU 分解。

對於矩形 A,結果是基於 R 因數對 A 進行樞紐 QR 分解和秩估計所計算出的最小範數最小平方解。

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
Base.:/方法
A / B

矩陣右除法:A / B 等於 (B' \ A')',其中 \ 是左除法運算子。對於方陣,結果 XA == X*B

另請參閱:rdiv!

範例

julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];

julia> X = A / B
2×3 Matrix{Float64}:
 -0.65   3.75  -1.2
  3.25  -2.75   1.0

julia> isapprox(A, X*B)
true

julia> isapprox(X, A*pinv(B))
true
LinearAlgebra.SingularException類型
SingularException

當輸入矩陣具有至少一個零值特徵值且不可逆時,會擲回此例外。無法計算涉及此類矩陣的線性求解。info 欄位指出(其中一個)奇異值的位置。

LinearAlgebra.PosDefException類型
PosDefException

當輸入矩陣不是 正定的 時,會擲回此例外。某些線性代數函數和分解僅適用於正定矩陣。info 欄位指出(其中一個)小於或等於 0 的特徵值的位置。

LinearAlgebra.ZeroPivotException類型
ZeroPivotException <: Exception

當矩陣分解/求解在樞紐(對角線)位置遇到零值且無法繼續時引發的例外。這可能不表示矩陣是奇異的:切換到不同的分解(例如樞紐 LU),可以重新排序變數以消除虛假的零樞紐,這可能是有效的。info 欄位指出(其中一個)零樞紐的位置。

LinearAlgebra.dot函數
dot(x, y)
x ⋅ y

計算兩個向量的點積。對於複數向量,第一個向量會共軛。

dot 也適用於任意可迭代物件,包括任何維度的陣列,只要 dot 在元素上定義即可。

dot 在語義上等於 sum(dot(vx,vy) for (vx,vy) in zip(x, y)),加上參數長度必須相等的限制。

x ⋅ y(其中 可以透過在 REPL 中按 Tab 補齊 \cdot 來輸入)是 dot(x, y) 的同義詞。

範例

julia> dot([1; 1], [2; 3])
5

julia> dot([im; im], [1; 1])
0 - 2im

julia> dot(1:5, 2:6)
70

julia> x = fill(2., (5,5));

julia> y = fill(3., (5,5));

julia> dot(x, y)
150.0
LinearAlgebra.dot方法
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
LinearAlgebra.cross函數
cross(x, y)
×(x,y)

計算兩個 3 向量的叉積。

範例

julia> a = [0;1;0]
3-element Vector{Int64}:
 0
 1
 0

julia> b = [0;0;1]
3-element Vector{Int64}:
 0
 0
 1

julia> cross(a,b)
3-element Vector{Int64}:
 1
 0
 0
LinearAlgebra.axpy!函數
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
LinearAlgebra.axpby!函數
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
LinearAlgebra.rotate!函數
rotate!(x, y, c, s)

c*x + s*y 覆寫 x,並以 -conj(s)*x + c*y 覆寫 y。傳回 xy

Julia 1.5

rotate! 至少需要 Julia 1.5。

LinearAlgebra.reflect!函數
reflect!(x, y, c, s)

c*x + s*y 覆寫 x,並以 conj(s)*x - c*y 覆寫 y。傳回 xy

Julia 1.5

reflect! 至少需要 Julia 1.5。

LinearAlgebra.factorize函數
factorize(A)

根據輸入矩陣的類型,計算 A 的方便分解。如果 A 作為一般矩陣傳遞,factorize 會檢查 A 以查看它是否對稱/三角形/等。factorize 會檢查 A 的每個元素以驗證/排除每個屬性。它會在排除對稱/三角形結構後立即短路。傳回值可重複用於有效地求解多個系統。例如:A=factorize(A); x=A\b; y=A\C

A 的屬性因式分解類型
正定Cholesky(請參閱 cholesky
密集對稱/厄米Bunch-Kaufman(請參閱 bunchkaufman
稀疏對稱/厄米LDLt(請參閱 ldlt
三角三角
DiagonalDiagonal
BidiagonalBidiagonal
TridiagonalLU(請參閱 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 will check to see that A is already factorized
5×5 Bidiagonal{Float64, Vector{Float64}}:
 1.0  1.0   ⋅    ⋅    ⋅
  ⋅   1.0  1.0   ⋅    ⋅
  ⋅    ⋅   1.0  1.0   ⋅
  ⋅    ⋅    ⋅   1.0  1.0
  ⋅    ⋅    ⋅    ⋅   1.0

這會傳回 5×5 Bidiagonal{Float64},現在可傳遞給其他線性代數函數(例如特徵值求解器),這些函數將使用 Bidiagonal 類型的專業方法。

LinearAlgebra.Diagonal類型
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
Diagonal(A::AbstractMatrix)

A 的對角線建構矩陣。

範例

julia> A = permutedims(reshape(1:15, 5, 3))
3×5 Matrix{Int64}:
  1   2   3   4   5
  6   7   8   9  10
 11  12  13  14  15

julia> Diagonal(A)
3×3 Diagonal{Int64, Vector{Int64}}:
 1  ⋅   ⋅
 ⋅  7   ⋅
 ⋅  ⋅  13

julia> diag(A, 2)
3-element Vector{Int64}:
  3
  9
 15
Diagonal{T}(undef, n)

建構長度為 n 的未初始化 Diagonal{T}。請參閱 undef

LinearAlgebra.Bidiagonal類型
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 is on the first superdiagonal
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  7  ⋅  ⋅
 ⋅  2  8  ⋅
 ⋅  ⋅  3  9
 ⋅  ⋅  ⋅  4

julia> Bl = Bidiagonal(dv, ev, :L) # ev is on the first subdiagonal
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 7  2  ⋅  ⋅
 ⋅  8  3  ⋅
 ⋅  ⋅  9  4
Bidiagonal(A, uplo::Symbol)

A 的主對角線及其第一個超對角線(如果 uplo=:U)或次對角線(如果 uplo=:L)建構一個 Bidiagonal 矩陣。

範例

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

julia> Bidiagonal(A, :U) # contains the main diagonal and first superdiagonal of A
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  1  ⋅  ⋅
 ⋅  2  2  ⋅
 ⋅  ⋅  3  3
 ⋅  ⋅  ⋅  4

julia> Bidiagonal(A, :L) # contains the main diagonal and first subdiagonal of A
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 2  2  ⋅  ⋅
 ⋅  3  3  ⋅
 ⋅  ⋅  4  4
LinearAlgebra.SymTridiagonal類型
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
SymTridiagonal(A::AbstractMatrix)

從對稱矩陣 A 的對角線和第一個超對角線建構一個對稱三對角矩陣。

範例

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

julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅
 2  4  5
 ⋅  5  6

julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);

julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
 [1 2; 2 3]  [1 3; 2 4]
 [1 2; 3 4]  [1 2; 2 3]
LinearAlgebra.Tridiagonal類型
Tridiagonal(dl::V, d::V, du::V) where V <: AbstractVector

分別從第一個次對角線、對角線和第一個超對角線建構一個三對角矩陣。結果為 Tridiagonal 類型,並提供高效的專用線性求解器,但可以使用 convert(Array, _)(或簡寫為 Array(_))將其轉換為常規矩陣。dldu 的長度必須比 d 的長度少一。

範例

julia> dl = [1, 2, 3];

julia> du = [4, 5, 6];

julia> d = [7, 8, 9, 0];

julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 7  4  ⋅  ⋅
 1  8  5  ⋅
 ⋅  2  9  6
 ⋅  ⋅  3  0
Tridiagonal(A)

從矩陣 A 的第一個次對角線、對角線和第一個超對角線建構一個三對角矩陣。

範例

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

julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅  ⋅
 1  2  3  ⋅
 ⋅  2  3  4
 ⋅  ⋅  3  4
LinearAlgebra.Symmetric類型
Symmetric(A, uplo=:U)

建構矩陣 A 的上三角(如果 uplo = :U)或下三角(如果 uplo = :L)的 Symmetric 檢視。

對稱檢視主要用於實對稱矩陣,其中已啟用專門演算法(例如,用於特徵值問題)以取得 對稱類型。更一般地,另請參閱 Hermitian(A) 以取得 Hermitian 矩陣 A == A',這對於實矩陣實際上等於 對稱,但對於複雜矩陣也很有用。(而複雜的 對稱矩陣受支援,但幾乎沒有專門演算法。)

若要計算實矩陣的對稱部分,或更一般地計算實或複雜矩陣 A 的 Hermitian 部分 (A + A') / 2,請使用 hermitianpart

範例

julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> Supper = Symmetric(A)
3×3 Symmetric{Int64, Matrix{Int64}}:
 1  2  3
 2  5  6
 3  6  9

julia> Slower = Symmetric(A, :L)
3×3 Symmetric{Int64, Matrix{Int64}}:
 1  4  7
 4  5  8
 7  8  9

julia> hermitianpart(A)
3×3 Hermitian{Float64, Matrix{Float64}}:
 1.0  3.0  5.0
 3.0  5.0  7.0
 5.0  7.0  9.0

請注意,除非 A 本身是對稱的(例如,如果 A == transpose(A)),否則 Supper 就不會等於 Slower

LinearAlgebra.Hermitian類型
Hermitian(A, uplo=:U)

建構矩陣 A 的上三角(如果 uplo = :U)或下三角(如果 uplo = :L)的 Hermitian 檢視。

若要計算 A 的 Hermitian 部分,請使用 hermitianpart

範例

julia> A = [1 2+2im 3-3im; 4 5 6-6im; 7 8+8im 9]
3×3 Matrix{Complex{Int64}}:
 1+0im  2+2im  3-3im
 4+0im  5+0im  6-6im
 7+0im  8+8im  9+0im

julia> Hupper = Hermitian(A)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  2+2im  3-3im
 2-2im  5+0im  6-6im
 3+3im  6+6im  9+0im

julia> Hlower = Hermitian(A, :L)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  4+0im  7+0im
 4+0im  5+0im  8-8im
 7+0im  8+8im  9+0im

julia> hermitianpart(A)
3×3 Hermitian{ComplexF64, Matrix{ComplexF64}}:
 1.0+0.0im  3.0+1.0im  5.0-1.5im
 3.0-1.0im  5.0+0.0im  7.0-7.0im
 5.0+1.5im  7.0+7.0im  9.0+0.0im

請注意,除非 A 本身是 Hermitian(例如,如果 A == adjoint(A)),否則 Hupper 就不會等於 Hlower

對角線的所有非實部分都將被忽略。

Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular類型
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
LinearAlgebra.UpperTriangular類型
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
LinearAlgebra.UnitLowerTriangular類型
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
LinearAlgebra.UnitUpperTriangular類型
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
LinearAlgebra.UpperHessenberg類型
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
LinearAlgebra.UniformScaling類型
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
LinearAlgebra.I常數
I

一個型別為 UniformScaling 的物件,表示任意大小的單位矩陣。

範例

julia> fill(1, (5,6)) * I == fill(1, (5,6))
true

julia> [1 2im 3; 1im 2 3] * I
2×3 Matrix{Complex{Int64}}:
 1+0im  0+2im  3+0im
 0+1im  2+0im  3+0im
LinearAlgebra.UniformScaling方法
(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
LinearAlgebra.LU型別
LU <: Factorization

方陣 ALU 分解的矩陣分解型別。這是 lu 的回傳型別,對應的矩陣分解函數。

分解 F::LU 的個別組成部分可透過 getproperty 存取

組成部分說明
F.LLUL(單位下三角)部分
F.ULUU(上三角)部分
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); # destructuring via iteration

julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.lu函數
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

計算稀疏矩陣 A 的 LU 分解。

對於具有實數或複數元素類型的稀疏 AF 的回傳類型為 UmfpackLU{Tv, Ti},其中 Tv 分別為 Float64ComplexF64,而 Ti 為整數類型 (Int32Int64).

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

排列 q 可以是排列向量或 nothing。如果未提供排列向量或 qnothing,則使用 UMFPACK 的預設值。如果排列不是以 0 為基礎,則會建立一個以 0 為基礎的副本。

control 向量預設為套件的 UMFPACK 預設組態,但可以透過傳遞長度為 UMFPACK_CONTROL 的向量來變更。請參閱 UMFPACK 手冊以取得可能的組態。對應的變數命名為 JL_UMFPACK_,因為 Julia 使用以 1 為基礎的索引。

分解 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!

注意

lu(A::AbstractSparseMatrixCSC) 使用 SuiteSparse 的一部分 UMFPACK[ACM832] 函式庫。由於此函式庫僅支援具有 Float64ComplexF64 元素的稀疏矩陣,lu 會將 A 轉換為適當的 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64} 類型的副本。

來源
lu(A, pivot = RowMaximum(); check = true) -> F::LU

計算 A 的 LU 分解。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

在大多數情況下,如果 AAbstractMatrix{T} 的子類型 S,其元素類型 T 支援 +-*/,則回傳類型為 LU{T,S{T}}

一般而言,LU 分解會涉及矩陣列的排列(對應於下方說明的 F.p 輸出),稱為「主元選擇」(因為它對應於選擇包含「主元」的列,即 F.U 的對角線輸入)。下列主元選擇策略之一可透過選擇性的 pivot 參數選擇

  • RowMaximum()(預設):標準主元選擇策略;主元對應於剩餘待分解列中絕對值最大的元素。此主元選擇策略要求元素類型也支援 abs<。(這通常是浮點矩陣唯一數值穩定的選項。)
  • RowNonZero():主元對應於剩餘待分解列中的第一個非零元素。(這對應於手動計算中的典型選擇,也適用於支援 iszero 但不支援 abs< 的更通用的代數數字類型。)
  • NoPivot():關閉主元選擇(如果遇到零輸入,可能會失敗)。

分解 F 的個別組成部分可透過 getproperty 存取

組成部分說明
F.LLUL(下三角)部分
F.ULUU(上三角)部分
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> 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); # destructuring via iteration

julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.lu!函數
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU

計算稀疏矩陣 A 的 LU 分解,重複使用儲存在 F 中的既有 LU 分解的符號分解。除非將 reuse_symbolic 設為 false,否則稀疏矩陣 A 必須與用於建立 LU 分解 F 的矩陣具有相同的非零模式,否則會擲回錯誤。如果 AF 的大小不同,所有向量都將依此調整大小。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

排列 q 可以是排列向量或 nothing。如果未提供排列向量或 qnothing,則使用 UMFPACK 的預設值。如果排列不是以零為基準,則會建立一個以零為基準的副本。

另請參閱 lu

注意

lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC) 使用 UMFPACK 函式庫,它是 SuiteSparse 的一部分。由於此函式庫僅支援元素為 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
來源
lu!(A, pivot = RowMaximum(); check = true) -> LU

lu!lu 相同,但會覆寫輸入的 A 以節省空間,而非建立副本。如果分解產生無法以 A 元素類型表示的數字(例如整數類型),則會擲回 InexactError 例外。

範例

julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
 4.0  3.0
 6.0  3.0

julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U factor:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
LinearAlgebra.Cholesky類型
Cholesky <: Factorization

稠密對稱/厄米特正定矩陣 A 的 Cholesky 分解的矩陣分解類型。這是 cholesky 的回傳類型,也就是對應的矩陣分解函式。

三角形的 Cholesky 因子可以透過分解 F::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; # destructuring via iteration

julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted類型
CholeskyPivoted

稠密對稱/厄米特正半定矩陣 A 的樞紐 Cholesky 分解的矩陣分解類型。這是 cholesky(_, ::RowMaximum) 的回傳類型,也就是對應的矩陣分解函式。

三角形的 Cholesky 因子可以透過分解 F::CholeskyPivoted 以及 F.LF.U 取得,而排列則可以透過 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 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
LinearAlgebra.cholesky函數
cholesky(A, NoPivot(); check = true) -> Cholesky

計算稠密對稱正定矩陣 A 的 Cholesky 分解,並傳回 Cholesky 分解。矩陣 A 可以是 SymmetricHermitian AbstractMatrix,或是一個完全對稱或 Hermitian 的 AbstractMatrix

三角形 Cholesky 因子可以透過分解 F 經由 F.LF.U 取得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'

Cholesky 物件可以使用下列函式: size\invdetlogdetisposdef

如果您有一個矩陣 A,由於其建構中的捨入誤差而略微非 Hermitian,請在傳遞給 cholesky 之前將其包覆在 Hermitian(A) 中,以將其視為完全 Hermitian。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

範例

julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
   4.0   12.0  -16.0
  12.0   37.0  -43.0
 -16.0  -43.0   98.0

julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

計算稠密對稱正半定的矩陣 A 的樞紐 Cholesky 分解,並傳回 CholeskyPivoted 分解。矩陣 A 可以是 SymmetricHermitian AbstractMatrix,或是一個完全對稱或 Hermitian 的 AbstractMatrix

三角形 Cholesky 因子可以透過分解 F 經由 F.LF.U 取得,而排列則可以透過 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 決定用於確定秩的容差。對於負值,容差為機器精度。

如果您有一個矩陣 A,由於其建構中的捨入誤差而略微非 Hermitian,請在傳遞給 cholesky 之前將其包覆在 Hermitian(A) 中,以將其視為完全 Hermitian。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

範例

julia> X = [1.0, 2.0, 3.0, 4.0];

julia> A = X * X';

julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # destructuring via iteration

julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor

計算稀疏正定矩陣 A 的 Cholesky 分解。A 必須是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 檢視。請注意,即使 A 沒有類型標籤,它仍然必須是對稱或 Hermitian。如果未提供 perm,則使用減少填充的排列。F = cholesky(A) 最常使用於使用 F\b 解決方程式組,但方法 diagdetlogdet 也定義為 F。您也可以使用 F.LF 中提取個別因子。但是,由於預設開啟樞紐,因此分解在內部表示為 A == P'*L*L'*P,其中排列矩陣為 P;僅使用 L 而未考慮 P 會產生錯誤的答案。若要包含排列的效果,通常最好提取「組合」因子,例如 PtL = F.PtL(等於 P'*L)和 LtP = F.UP(等於 L'*P)。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

設定選用的 shift 關鍵字參數會計算 A+shift*I 而不是 A 的分解。如果提供了 perm 參數,它應該是 1:size(A,1) 的排列,提供要使用的順序(而不是 CHOLMOD 的預設 AMD 順序)。

範例

在以下範例中,使用的減少填充排列為 [3, 2, 1]。如果將 perm 設定為 1:3 以強制不進行排列,則因子中的非零元素數量為 6。

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

julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  5
nnz:     5
success: true

julia> C.p
3-element Vector{Int64}:
 3
 2
 1

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421   0.0       0.0
 0.0       1.41421   0.0
 0.707107  0.707107  1.0

julia> L * L' ≈ A[C.p, C.p]
true

julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
  ⋅    ⋅   1.0
  ⋅   1.0   ⋅
 1.0   ⋅    ⋅

julia> P' * L * L' * P ≈ A
true

julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  6
nnz:     6
success: true

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421    0.0       0.0
 0.707107   1.22474   0.0
 0.707107  -0.408248  1.1547

julia> L * L' ≈ A
true
注意

此方法使用 SuiteSparse 中的 CHOLMOD[ACM887][DavisHager2009] 函式庫。CHOLMOD 僅支援雙倍或複數雙倍元素類型。非這些元素類型的輸入矩陣將適當地轉換為 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

CHOLMOD 中的許多其他函式已封裝,但未從 Base.SparseArrays.CHOLMOD 模組匯出。

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

cholesky 相同,但透過覆寫輸入 A 來節省空間,而不是建立一個副本。如果分解產生一個無法由 A 的元素類型表示的數字(例如對於整數類型),則會擲回 InexactError 例外。

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

計算 A 的 Cholesky ($LL'$) 分解,重複使用符號分解 FA 必須是 SparseMatrixCSCSparseMatrixCSCSymmetric/ Hermitian 檢視。請注意,即使 A 沒有類型標籤,它仍然必須是對稱或 Hermitian。

另請參閱 cholesky

注意

此方法使用 SuiteSparse 中的 CHOLMOD 函式庫,它僅支援雙倍或複數雙倍。非這些元素類型的輸入矩陣將適當地轉換為 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

來源
LinearAlgebra.lowrankupdate函式
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) 運算。

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

取得給定 ALDLtLLt 分解 FA + C*C'LDLt 分解。

傳回的因子永遠是 LDLt 分解。

另請參閱 lowrankupdate!lowrankdowndatelowrankdowndate!

來源
LinearAlgebra.lowrankdowndate函數
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) 個運算。

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

取得給定 ALDLtLLt 分解 FA + C*C'LDLt 分解。

傳回的因子永遠是 LDLt 分解。

另請參閱 lowrankdowndate!lowrankupdatelowrankupdate!

來源
LinearAlgebra.lowrankupdate!函數
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 會在運算期間被銷毀。

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

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

LLt 分解會轉換為 LDLt

另請參閱 lowrankupdatelowrankdowndatelowrankdowndate!

來源
LinearAlgebra.lowrankdowndate!函數
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 會在運算期間被銷毀。

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

ALDLtLLt 因數分解 F 更新為 A - C*C' 的因數分解。

LLt 分解會轉換為 LDLt

另請參閱 lowrankdowndatelowrankupdatelowrankupdate!

來源
LinearAlgebra.LDLt類型
LDLt <: Factorization

實對稱三對角矩陣 SLDLt 因數分解的矩陣因數分解類型,使得 S = L*Diagonal(d)*L',其中 LUnitLowerTriangular 矩陣,而 d 是向量。LDLt 因數分解 F = ldlt(S) 的主要用途是使用 F\b 來求解線性方程組 Sx = b。這是 ldlt(對應的矩陣因數分解函數)的傳回類型。

可以透過 getproperty 存取因數分解 F::LDLt 的個別組成部分

組成部分說明
F.LLDLtL(單位下三角)部分
F.DLDLtD(對角線)部分
F.LtLDLtLt(單位上三角)部分
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
LinearAlgebra.ldlt函數
ldlt(S::SymTridiagonal) -> LDLt

計算實對稱三對角矩陣 SLDLt(亦即 $LDL^T$)因數分解,使得 S = L*Diagonal(d)*L',其中 L 是單位下三角矩陣,而 d 是向量。LDLt 因數分解 F = ldlt(S) 的主要用途是使用 F\b 來求解線性方程組 Sx = b

另請參閱 bunchkaufman,以取得任意對稱或厄米矩陣的類似因數分解,但具有樞紐。

範例

julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0  1.0   ⋅
 1.0  4.0  2.0
  ⋅   2.0  5.0

julia> ldltS = ldlt(S);

julia> b = [6., 7., 8.];

julia> ldltS \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255

julia> S \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor

計算稀疏矩陣 A$LDL'$ 因式分解。A 必須是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 檢視。請注意,即使 A 沒有類型標籤,它仍然必須是對稱或 Hermitian。使用減少填充的排列。F = ldlt(A) 最常使用於使用 F\b 解決方程式組 A*x = 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 順序)。

注意

此方法使用 SuiteSparse 中的 CHOLMOD[ACM887][DavisHager2009] 函式庫。CHOLMOD 僅支援雙倍或複數雙倍元素類型。非這些元素類型的輸入矩陣將適當地轉換為 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

CHOLMOD 中的許多其他函式已封裝,但未從 Base.SparseArrays.CHOLMOD 模組匯出。

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

計算 A$LDL'$ 因式分解,重新使用符號因式分解 FA 必須是 SparseMatrixCSCSparseMatrixCSCSymmetric/Hermitian 檢視。請注意,即使 A 沒有類型標籤,它仍然必須是對稱或 Hermitian。

另請參閱 ldlt

注意

此方法使用 SuiteSparse 中的 CHOLMOD 函式庫,它僅支援雙精度或複雜雙精度。非這些元素類型的輸入矩陣將適當地轉換為 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

來源
LinearAlgebra.QR類型
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

物件有兩個欄位

  • factorsm×n 矩陣。

    • 上三角部分包含 $R$ 的元素,也就是 R = triu(F.factors),其中 FQR 物件。

    • 次對角線部分包含以封裝格式儲存的反射器 $v_i$,其中 $v_i$ 是矩陣 V = I + tril(F.factors, -1) 的第 $i$ 個欄。

  • τ 是長度為 min(m,n) 的向量,包含係數 $au_i$

LinearAlgebra.QRCompactWY類型
QRCompactWY <: Factorization

以封裝區塊格式儲存的 QR 矩陣分解,通常從 qr 取得。如果 $A$m×n 矩陣,則

\[A = Q R\]

其中 $Q$ 是正交/酉矩陣,而 $R$ 是上三角矩陣。它類似於 QR 格式,只是正交/酉矩陣 $Q$ 儲存在精簡 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),其中 FQR 物件。

    • 次對角線部分包含以封裝格式儲存的反射器 $v_i$,使得 V = I + tril(F.factors, -1)

  • T 是如上所述的 $n_b$-by-$\min(m,n)$ 矩陣。每個三角矩陣 $T_j$ 的次對角線元素都會被忽略。

注意

此格式不應與較舊的 WY 表示法混淆 [Bischof1987]

LinearAlgebra.QRPivoted類型
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

物件有三個欄位

  • factorsm×n 矩陣。

    • 上三角部分包含 $R$ 的元素,也就是 R = triu(F.factors),其中 FQR 物件。

    • 次對角線部分包含以封裝格式儲存的反射器 $v_i$,其中 $v_i$ 是矩陣 V = I + tril(F.factors, -1) 的第 $i$ 個欄。

  • τ 是長度為 min(m,n) 的向量,包含係數 $au_i$

  • jpvt 是長度為 n 的整數向量,對應於排列 $P$

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

計算稀疏矩陣 AQR 分解。使用填滿減少的列和欄排列,使得 F.R = F.Q'*A[F.prow,F.pcol]。此類型的主要應用是使用 \ 解決最小平方或未定問題。函數呼叫 C 函式庫 SPQR[ACM933]

注意

qr(A::SparseMatrixCSC) 使用 SPQR 函式庫,它是 SuiteSparse 的一部分。由於此函式庫僅支援元素為 Float64ComplexF64 的稀疏矩陣,因此在 Julia v1.4 中,qr 會將 A 轉換為適當類型的複製,例如 SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

範例

julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
 1.0   ⋅
 1.0   ⋅
  ⋅   1.0
  ⋅   1.0

julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
 -1.41421    ⋅
   ⋅       -1.41421
Row permutation:
4-element Vector{Int64}:
 1
 3
 4
 2
Column permutation:
2-element Vector{Int64}:
 1
 2
來源
qr(A, pivot = NoPivot(); blocksize) -> F

計算矩陣 A 的 QR 分解:正交(如果 A 是複數值)矩陣 Q,以及上三角矩陣 R,使得

\[A = Q R\]

傳回的物件 F 以封裝格式儲存分解

  • 如果 pivot == ColumnNorm(),則 FQRPivoted 物件,

  • 否則,如果 A 的元素類型是 BLAS 類型(Float32Float64ComplexF32ComplexF64),則 FQRCompactWY 物件,

  • 否則 FQR 物件。

分解 F 的個別元件可透過屬性存取器擷取

  • F.Q:正交/酉矩陣 Q
  • F.R:上三角矩陣 R
  • F.p:樞紐的置換向量(僅 QRPivoted
  • F.P:樞紐的置換矩陣(僅 QRPivoted

反覆分解會產生元件 QR,以及如果存在 p

下列函式可供 QR 物件使用:invsize\。當 A 是矩形時,\ 會傳回最小平方解,如果解不唯一,則傳回範數最小的解。當 A 不是滿秩時,需要使用(列)樞紐分解才能取得最小範數解。

允許相對於全/方正或非全/方正的 Q 進行乘法,即同時支援 F.Q*F.RF.Q*AQ 矩陣可以使用 Matrix 轉換為正規矩陣。此操作會傳回「瘦」的 Q 因子,即如果 Am×n,且 m>=n,則 Matrix(F.Q) 會產生一個 m×n 矩陣,其欄位為正交正規。若要擷取「全」的 Q 因子,一個 m×m 正交矩陣,請使用 F.Q*Icollect(F.Q)。如果 m<=n,則 Matrix(F.Q) 會產生一個 m×m 正交矩陣。

pivot == NoPivot()A isa StridedMatrix{<:BlasFloat} 時,可以使用關鍵字參數 blocksize :: Integer 指定 QR 分解的區塊大小。當 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 factor: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

julia> F.Q * F.R == A
true
注意

qr 會傳回多種型別,因為 LAPACK 使用多種表示法來最小化 Householder 基本反射器乘積的記憶體儲存需求,因此 QR 矩陣可以緊湊地儲存,而不是兩個獨立的稠密矩陣。

LinearAlgebra.qr!函式
qr!(A, pivot = NoPivot(); blocksize)

AAbstractMatrix 的子型別時,qr!qr 相同,但透過覆寫輸入 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 factor: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
 -3.16228  -4.42719
  0.0      -0.632456

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

julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
LinearAlgebra.LQ型別
LQ <: Factorization

矩陣 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 factor:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q factor: 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; # destructuring via iteration

julia> l == S.L &&  q == S.Q
true
LinearAlgebra.lq函數
lq(A) -> S::LQ

計算 A 的 LQ 分解。分解的下三角形元件可從 LQ 物件 S 透過 S.L 取得,正交/酉元件可透過 S.Q 取得,使得 A ≈ S.L*S.Q

反覆分解會產生元件 S.LS.Q

LQ 分解是 transpose(A) 的 QR 分解,且可用於計算欠定方程組的最小範數解 lq(A) \ bA 的欄位多於列,但具有滿秩)。

範例

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 factor:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q factor: 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; # destructuring via iteration

julia> l == S.L &&  q == S.Q
true
LinearAlgebra.lq!函數
lq!(A) -> LQ

使用輸入矩陣作為工作區,計算 ALQ 分解。另請參閱 lq

LinearAlgebra.BunchKaufman類型
BunchKaufman <: Factorization

對稱或 Hermitian 矩陣 A 的 Bunch-Kaufman 分解的矩陣分解類型,表示為 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 = [1 2; 2 3]
2×2 Matrix{Int64}:
 1  2
 2  3

julia> S = bunchkaufman(A) # A gets wrapped internally by Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
permutation:
2-element Vector{Int64}:
 1
 2

julia> d, u, p = S; # destructuring via iteration

julia> d == S.D && u == S.U && p == S.p
true

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
permutation:
2-element Vector{Int64}:
 2
 1
LinearAlgebra.bunchkaufman函數
bunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman

計算對稱或 Hermitian 矩陣 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 為 false,則不會使用城堡換位。

check = true 時,如果分解失敗,則會擲回錯誤。當 check = false 時,檢查分解有效性的責任(透過 issuccess)落在使用者身上。

下列函數可供 BunchKaufman 物件使用:size\invissymmetricishermitiangetindex

範例

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

julia> S = bunchkaufman(A) # A gets wrapped internally by Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
permutation:
2-element Vector{Int64}:
 1
 2

julia> d, u, p = S; # destructuring via iteration

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 factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
permutation:
2-element Vector{Int64}:
 2
 1

julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0
LinearAlgebra.bunchkaufman!函數
bunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman

bunchkaufman!bunchkaufman 相同,但透過覆寫輸入 A 而不是建立副本,來節省空間。

LinearAlgebra.Eigen類型
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; # destructuring via iteration

julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen類型
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
LinearAlgebra.eigvals函數
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

對於純量輸入,eigvals 會傳回一個純量。

範例

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

傳回 A 的特徵值。可以透過指定包含已排序特徵值索引的 UnitRange irange 來計算特徵值子集,例如第 2 到第 8 個特徵值。

範例

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A, 2:2)
1-element Vector{Float64}:
 0.9999999999999996

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

傳回 A 的特徵值。可以透過指定特徵值下界和上界的 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
LinearAlgebra.eigvals!函數
eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

eigvals 相同,但透過覆寫輸入 A 來節省空間,而不是建立副本。permutescalesortby 關鍵字與 eigen 相同。

注意

輸入矩陣 A 在呼叫 eigvals! 之後將不包含其特徵值 - A 用作工作空間。

範例

julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> eigvals!(A)
2-element Vector{Float64}:
 -0.3722813232690143
  5.372281323269014

julia> A
2×2 Matrix{Float64}:
 -0.372281  -1.0
  0.0        5.37228
eigvals!(A, B; sortby) -> values

eigvals 相同,但透過覆寫輸入 A(和 B)來節省空間,而不是建立副本。

注意

輸入矩陣 AB 在呼叫 eigvals! 之後將不包含其特徵值。它們用作工作空間。

範例

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> A
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0  -0.0

julia> B
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

eigvals 相同,但透過覆寫輸入 A 來節省空間,而不是建立副本。irange 是要搜尋的特徵值索引範圍 - 例如,第 2 到第 8 個特徵值。

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

eigvals 相同,但透過覆寫輸入 A 來節省空間,而不是建立副本。vl 是要搜尋特徵值的區間下限,而 vu 是上限。

LinearAlgebra.eigmax函數
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` cannot have complex eigenvalues.
Stacktrace:
[...]
LinearAlgebra.eigmin函數
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` cannot have complex eigenvalues.
Stacktrace:
[...]
LinearAlgebra.eigvecs函數
eigvecs(A::SymTridiagonal[, eigvals]) -> Matrix

傳回矩陣 M,其欄位是 A 的特徵向量。(第 k 個特徵向量可從切片 M[:, k] 取得。)

如果指定特徵值 eigvals 的選用向量,eigvecs 會傳回特定對應的特徵向量。

範例

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259

julia> eigvecs(A)
3×3 Matrix{Float64}:
  0.418304  -0.83205      0.364299
 -0.656749  -7.39009e-16  0.754109
  0.627457   0.5547       0.546448

julia> eigvecs(A, [1.])
3×1 Matrix{Float64}:
  0.8320502943378438
  4.263514128092366e-17
 -0.5547001962252291
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix

傳回矩陣 M,其欄位是 A 的特徵向量。(第 k 個特徵向量可從切片 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
eigvecs(A, B) -> Matrix

傳回矩陣 M,其欄位是 AB 的廣義特徵向量。(第 k 個特徵向量可從切片 M[:, k] 取得。)

範例

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> eigvecs(A, B)
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im
LinearAlgebra.eigen函式
eigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen

計算 A 的特徵值分解,傳回 Eigen 因式分解物件 F,其中包含 F.values 中的特徵值和矩陣 F.vectors 欄位中的特徵向量。這對應於求解形式為 Ax = λx 的特徵值問題,其中 A 是矩陣、x 是特徵向量,而 λ 是特徵值。(第 k 個特徵向量可從切片 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; # destructuring via iteration

julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen

計算 AB 的廣義特徵值分解,傳回一個 GeneralizedEigen 因式分解物件 F,其中包含 F.values 中的廣義特徵值和矩陣 F.vectors 中列中的廣義特徵向量。這對應於求解形式為 Ax = λBx 的廣義特徵值問題,其中 A, B 是矩陣,x 是特徵向量,而 λ 是特徵值。(第 k 個廣義特徵向量可以從切片 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; # destructuring via iteration

julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen

計算 A 的特徵值分解,傳回一個 Eigen 因式分解物件 F,其中包含 F.values 中的特徵值和矩陣 F.vectors 中列中的特徵向量。(第 k 個特徵向量可以從切片 F.vectors[:, k] 中取得。)

重複分解會產生組件 F.valuesF.vectors

下列函式可供 Eigen 物件使用:invdetisposdef

UnitRange irange 指定要搜尋的已排序特徵值的索引。

注意

如果 irange 不是 1:n,其中 nA 的維度,則傳回的因式分解將是截斷因式分解。

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 是上限。

注意

如果 [vl, vu] 不包含 A 的所有特徵值,則回傳的分解會是一個截斷分解。

LinearAlgebra.eigen!函式
eigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)

eigen 相同,但透過覆寫輸入 A(和 B)來節省空間,而不是建立一個副本。

LinearAlgebra.Hessenberg類型
Hessenberg <: Factorization

Hessenberg 物件表示方陣的 Hessenberg 分解 QHQ',或其位移 Q(H+μI)Q',由 hessenberg 函式產生。

LinearAlgebra.hessenberg函式
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

請注意,移位因式分解 A+μI = Q (H+μI) Q' 可以使用 UniformScaling 物件 I 有效地透過 F + μ*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; # destructuring via iteration

julia> q == F.Q && h == F.H
true
LinearAlgebra.Schur類型
Schur <: Factorization

矩陣 A 的 Schur 因式分解的矩陣因式分解類型。這是 schur(_) 的回傳類型,它是對應的矩陣因式分解函數。

如果 F::Schur 是因式分解物件,則可以透過 F.SchurF.T 取得(準)三角形 Schur 因子,並透過 F.vectorsF.Z 取得正交/酉 Schur 向量,使得 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
LinearAlgebra.GeneralizedSchur類型
GeneralizedSchur <: Factorization

兩個矩陣 AB 的廣義 Schur 因式分解的矩陣因式分解類型。這是 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'。可透過 F.α./F.β 取得 AB 的廣義特徵值。

重複分解會產生組件 F.SF.TF.QF.ZF.αF.β

LinearAlgebra.schur函數
schur(A) -> F::Schur

計算矩陣 A 的 Schur 分解。可從 Schur 物件 F 透過 F.SchurF.T 取得(準)三角 Schur 因子,並可透過 F.vectorsF.Z 取得正交/酉 Schur 向量,使得 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 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
schur(A, B) -> F::GeneralizedSchur

計算矩陣 AB 的廣義 Schur (或 QZ) 分解。可從 Schur 物件 F 取得(準)三角 Schur 因數,方法為使用 F.SF.T,可使用 F.leftF.Q 取得左邊酉/正交 Schur 向量,並可使用 F.rightF.Z 取得右邊酉/正交 Schur 向量,使得 A=F.left*F.S*F.right'B=F.left*F.T*F.right'。可使用 F.α./F.β 取得 AB 的廣義特徵值。

重複分解會產生組件 F.SF.TF.QF.ZF.αF.β

LinearAlgebra.schur!函數
schur!(A) -> F::Schur

schur 相同,但使用輸入引數 A 作為工作空間。

範例

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> A
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur

schur 相同,但使用輸入矩陣 AB 作為工作空間。

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

根據邏輯陣列 select 重新排列矩陣 A = Z*T*Z' 的 Schur 分解 F,傳回重新排列的分解 F 物件。選取的特徵值會出現在 F.Schur 的領先對角線上,而 F.vectors 對應的領先欄位會形成對應右不變子空間的正交/酉基底。在實數情況下,特徵值複數共軛對必須透過 select 全部包含或全部排除。

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

根據邏輯陣列 select 重新排列矩陣對 (A, B) = (Q*S*Z', Q*T*Z') 的廣義 Schur 分解 F,並傳回廣義 Schur 物件 F。選取的特徵值會出現在 F.SF.T 的領先對角線上,而左右正交/酉 Schur 向量也會重新排列,使得 (A, B) = F.Q*(F.S, F.T)*F.Z' 仍然成立,且仍可使用 F.α./F.β 取得 AB 的廣義特徵值。

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

ordschur 相同,但會覆寫分解 F

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

ordschur 相同,但會覆寫分解 F

LinearAlgebra.SVD類型
SVD <: Factorization

矩陣 A 的奇異值分解 (SVD) 的矩陣分解類型。這是 svd(_) 的回傳類型,對應的矩陣分解函數。

如果 F::SVD 是分解物件,則 USVVt 可透過 F.UF.SF.VF.Vt 取得,使得 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; # destructuring via iteration

julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD類型
GeneralizedSVD <: Factorization

兩個矩陣 AB 的廣義奇異值分解 (SVD) 的矩陣分解類型,使得 A = F.U*F.D1*F.R0*F.Q'B = F.V*F.D2*F.R0*F.Q'。這是 svd(_, _) 的回傳類型,對應的矩陣分解函數。

對於 M-by-N 矩陣 A 和 P-by-N 矩陣 B

  • 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

F.D1F.D2 的條目相關,如 LAPACK 文件中 廣義 SVDxGGSVD3 常式(在 LAPACK 3.6.0 和更新版本中呼叫)所述。

範例

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
V factor:
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0   0.0
Q factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
D1 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
D2 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
R0 factor:
2×2 Matrix{Float64}:
 1.41421   0.0
 0.0      -1.41421

julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
 -0.0  1.0
  1.0  0.0
LinearAlgebra.svd函數
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,因此提取 VtV 更有效率。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); # Store the Factorization Object

julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true

julia> U, S, V = F; # destructuring via iteration

julia> A ≈ U * Diagonal(S) * V'
true

julia> Uonly, = svd(A); # Store U only

julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD

計算 AB 的廣義 SVD,傳回一個廣義 SVD 分解物件 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 用於各種應用中,例如當我們想要比較多少屬於 A 相對於多少屬於 B 時,例如人類與酵母基因組、訊號與雜訊,或群集之間與群集內部。(請參閱 Edelman 和 Wang 的討論:https://arxiv.org/abs/1901.00485)

它將 [A; B] 分解為 [UC; VS]H,其中 [UC; VS][A; B] 的列空間的自然正交基,而 H = RQ'[A;B] 的行空間的自然非正交基,其中最上面的列最接近於 A 矩陣,最下面的列最接近於 B 矩陣。多餘弦/正弦矩陣 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
LinearAlgebra.svd!函數
svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

svd!svd 相同,但透過覆寫輸入 A 而不是建立副本來節省空間。有關詳細資訊,請參閱 svd 的文件。

svd!(A, B) -> GeneralizedSVD

svd!svd 相同,但會修改參數 AB,而不是建立副本。有關詳細資訊,請參閱 svd 的文件。

LinearAlgebra.svdvals函數
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
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
LinearAlgebra.svdvals!函數
svdvals!(A)

傳回 A 的奇異值,透過覆寫輸入來節省空間。另請參閱 svdvalssvd

svdvals!(A, B)

傳回 AB 的廣義奇異值分解中的廣義奇異值,透過覆寫 AB 來節省空間。另請參閱 svdsvdvals

LinearAlgebra.Givens類型
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

LinearAlgebra.givens函數
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

givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)

計算 Givens 旋轉 G 和純量 r,使得乘法的結果

B = G*A

具有以下性質

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

另請參閱 LinearAlgebra.Givens

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

計算 Givens 旋轉 G 和純量 r,使得乘法的結果

B = G*x

具有以下性質

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

另請參閱 LinearAlgebra.Givens

LinearAlgebra.triu函數
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
triu(M, k::Integer)

傳回從第 k 個超對角線開始的 M 上三角。

範例

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> triu(a,3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  1.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0

julia> triu(a,-3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
LinearAlgebra.triu!函數
triu!(M)

矩陣的上三角,在此過程中覆寫 M。另請參閱 triu

triu!(M, k::Integer)

傳回從第 k 個超對角線開始的 M 上三角,在此過程中覆寫 M

範例

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

julia> triu!(M, 1)
5×5 Matrix{Int64}:
 0  2  3  4  5
 0  0  3  4  5
 0  0  0  4  5
 0  0  0  0  5
 0  0  0  0  0
LinearAlgebra.tril函數
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
tril(M, k::Integer)

傳回從第 k 個超對角線開始的 M 下三角。

範例

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,-3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 1.0  0.0  0.0  0.0
LinearAlgebra.tril!函數
tril!(M)

矩陣的下三角,在此過程中覆寫 M。另請參閱 tril

tril!(M, k::Integer)

傳回從第 k 個超對角線開始的 M 下三角,在此過程中覆寫 M

範例

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

julia> tril!(M, 2)
5×5 Matrix{Int64}:
 1  2  3  0  0
 1  2  3  4  0
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
LinearAlgebra.diagind函數
diagind(M, k::Integer=0)

提供矩陣 M 的第 k 個對角線索引的 AbstractRange

另請參閱:diagdiagmDiagonal

範例

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
LinearAlgebra.diag函數
diag(M, k::Integer=0)

矩陣的第 k 個對角線,作為一個向量。

另請參閱 diagmdiagindDiagonalisdiag

範例

julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> diag(A,1)
2-element Vector{Int64}:
 2
 6
LinearAlgebra.diagm函數
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
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)

建構一個矩陣,其元素為向量中的對角線元素。預設情況下,矩陣為正方形,其大小由 length(v) 給定,但可以透過將 m,n 傳遞為第一個參數來指定非正方形大小 m×n

範例

julia> diagm([1,2,3])
3×3 Matrix{Int64}:
 1  0  0
 0  2  0
 0  0  3
LinearAlgebra.rank函數
rank(::QRSparse{Tv,Ti}) -> Ti

傳回 QR 因式分解的秩

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

透過計算 S 的 QR 因式分解來計算秩。小於 tol 的值視為零。請參閱 SPQR 手冊。

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

透過計算 svdvals(A) 有多少個輸出大於 max(atol, rtol*σ₁) 來計算矩陣的數值秩,其中 σ₁A 計算出的最大奇異值。atolrtol 分別是絕對容差和相對容差。預設相對容差為 n*ϵ,其中 nA 最小維度的尺寸,而 ϵA 元素類型的 eps

注意

數值秩對於奇異值接近於閾值容差 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
LinearAlgebra.norm函數
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 |$$a_i$norm$n$$A$ 的長度。由於 p-範數是使用 A 條目的 norm 計算的,因此如果 p != 2,則向量的向量的 p-範數通常與將其解釋為塊向量不兼容。

p 可以假設任何數值(即使並非所有值都能產生數學上有效的向量範數)。特別是,norm(A, Inf) 會傳回 abs.(A) 中的最大值,而 norm(A, -Inf) 會傳回最小值。如果 A 是矩陣且 p=2,則這等於 Frobenius 範數。

第二個參數 p 不一定是 norm 的介面的一部分,也就是說,自訂類型可能只實作 norm(A),而沒有第二個參數。

使用 opnorm 計算矩陣的算子範數。

範例

julia> v = [3, -2, 6]
3-element Vector{Int64}:
  3
 -2
  6

julia> norm(v)
7.0

julia> norm(v, 1)
11.0

julia> norm(v, Inf)
6.0

julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134

julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134

julia> norm(1:9)
16.881943016134134

julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true

julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true

julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
norm(x::Number, p::Real=2)

對於數字,傳回 $\left( |x|^p \right)^{1/p}$

範例

julia> norm(2, 1)
2.0

julia> norm(-2, 1)
2.0

julia> norm(2, 2)
2.0

julia> norm(-2, 2)
2.0

julia> norm(2, Inf)
2.0

julia> norm(-2, Inf)
2.0
LinearAlgebra.opnorm函數
opnorm(A::AbstractMatrix, p::Real=2)

計算由向量 p 範數誘導的算子範數(或矩陣範數),其中 p 的有效值為 12Inf。(請注意,對於稀疏矩陣,目前尚未實作 p=2。)使用 norm 計算弗羅貝尼烏斯範數。

p=1 時,算子範數是 A 的最大絕對欄總和

\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]

其中 $a_{ij}$$A$ 的條目,而 $m$$n$ 是它的維度。

p=2 時,算子範數是譜範數,等於 A 的最大奇異值。

p=Inf 時,算子範數是 A 的最大絕對列總和

\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]

範例

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

julia> opnorm(A, Inf)
6.0

julia> opnorm(A, 1)
5.0
opnorm(x::Number, p::Real=2)

對於數字,傳回 $\left( |x|^p \right)^{1/p}$。這等於 norm

opnorm(A::Adjoint{<:Any,<:AbstracVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstracVector}, q::Real=2)

對於共軛/轉置包裝的向量,傳回 A 的算子 $q$ 範數,這等於值為 p = q/(q-1)p 範數。它們在 p = q = 2 時重合。使用 norm 計算 Ap 範數作為一個向量。

向量空間與其對偶空間之間的範數差異,用於保留對偶性與點積之間的關係,而結果與 1 × n 矩陣的算子 p-範數一致。

範例

julia> v = [1; im];

julia> vc = v';

julia> opnorm(vc, 1)
1.0

julia> norm(vc, 1)
2.0

julia> norm(v, 1)
2.0

julia> opnorm(vc, 2)
1.4142135623730951

julia> norm(vc, 2)
1.4142135623730951

julia> norm(v, 2)
1.4142135623730951

julia> opnorm(vc, Inf)
2.0

julia> norm(vc, Inf)
1.0

julia> norm(v, Inf)
1.0
LinearAlgebra.normalize!函數
normalize!(a::AbstractArray, p::Real=2)

將陣列 a 就地正規化,使其 p-範數等於 1,即 norm(a, p) == 1。另請參閱 normalizenorm

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

矩陣 M 的條件數,使用算子 p-範數計算。p 的有效值為 12(預設)或 Inf

LinearAlgebra.condskeel函數
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 條件數、相對條件數或逐項相對條件數。

LinearAlgebra.tr函數
tr(M)

矩陣跡數。對 M 的對角元素求和。

範例

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

julia> tr(A)
5
LinearAlgebra.det函數
det(M)

矩陣行列式。

另請參閱:logdetlogabsdet

範例

julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
 1  0
 2  2

julia> det(M)
2.0
LinearAlgebra.logdet函數
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
LinearAlgebra.logabsdet函數
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)
Base.inv方法
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
LinearAlgebra.pinv函數
pinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # to be deprecated in Julia 2.0

計算 Moore-Penrose 偽逆矩陣。

對於具有浮點元素的矩陣 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
LinearAlgebra.nullspace函數
nullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # to be deprecated in Julia 2.0

透過納入奇異值小於 max(atol, rtol*σ₁)M 奇異向量,計算 M 的零空間基底,其中 σ₁M 最大奇異值。

預設的相對容差 rtoln*ϵ,其中 nM 最小維度的尺寸,而 ϵM 元素類型的 eps

範例

julia> M = [1 0 0; 0 1 0; 0 0 0]
3×3 Matrix{Int64}:
 1  0  0
 0  1  0
 0  0  0

julia> nullspace(M)
3×1 Matrix{Float64}:
 0.0
 0.0
 1.0

julia> nullspace(M, rtol=3)
3×3 Matrix{Float64}:
 0.0  1.0  0.0
 1.0  0.0  0.0
 0.0  0.0  1.0

julia> nullspace(M, atol=0.95)
3×1 Matrix{Float64}:
 0.0
 0.0
 1.0
Base.kron函數
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
Base.kron!函數
kron!(C, A, B)

計算 AB 的克羅內克積,並將結果儲存在 C 中,覆寫 C 的現有內容。這是 kron 的原地版本。

Julia 1.6

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

Base.exp方法
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
Base.cis方法
cis(A::AbstractMatrix)

更有效率的方法,用於方陣 Aexp(im*A)(特別是如果 AHermitian 或實數 Symmetric)。

另請參閱 cispisincosexp

Julia 1.7

在 Julia 1.7 中新增了使用 cis 與矩陣的支援。

範例

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

矩陣次方,等於 $\exp(p\log(A))$

範例

julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
 1  26
 0  27
Base.:^方法
^(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
Base.log方法
log(A::AbstractMatrix)

如果 A 沒有負實特徵值,則計算 A 的主矩陣對數,即唯一矩陣 $X$,使得 $e^X = A$,且 $-\pi < Im(\lambda) < \pi$ 對於 $X$ 的所有特徵值 $\lambda$。如果 A 有非正特徵值,則在可能的情況下傳回非主矩陣函數。

如果 A 是對稱或 Hermitian,則使用其特徵分解(eigen),如果 A 是三角形,則採用逆向縮放和平方方法的改良版本(請參閱[AH12][AHR13])。如果 A 是實數且沒有負特徵值,則計算實數 Schur 形式。否則,計算複數 Schur 形式。然後在 [AHR13] 中使用上(擬)三角形演算法的上(擬)三角形因子。

範例

julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
 2.71828  0.0
 0.0      2.71828

julia> log(A)
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
Base.sqrt方法
sqrt(x)

傳回 $\sqrt{x}$。對於負Real 參數,會擲回 DomainError。請改用複數負參數。前置運算子 等於 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> .√(1:4)
4-element Vector{Float64}:
 1.0
 1.4142135623730951
 1.7320508075688772
 2.0
來源
sqrt(A::AbstractMatrix)

如果 A 沒有負實特徵值,則計算 A 的主矩陣平方根,即唯一矩陣 $X$,其特徵值具有正實部,使得 $X^2 = A$。否則,傳回非主平方根。

如果 A 是實對稱或 Hermitian,其特徵分解 (eigen) 用於計算平方根。對於此類矩陣,由於捨入誤差而看起來略微為負的特徵值 λ 會被視為零。更精確地說,所有特徵值 ≥ -rtol*(max |λ|) 的矩陣會被視為半正定(產生一個 Hermitian 平方根),負特徵值則視為零。rtolsqrt(僅在 Hermitian/實對稱的情況下)的關鍵字參數,其預設值為機器精度乘以 size(A,1)

否則,平方根會透過 Björck-Hammarling 方法 [BH83] 來決定,該方法會計算複數 Schur 形式 (schur),然後計算三角因子的複數平方根。如果存在實數平方根,則會使用此方法的延伸 [H87],該方法會計算實數 Schur 形式,然後計算準三角因子的實數平方根。

範例

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

julia> sqrt(A)
2×2 Matrix{Float64}:
 2.0  0.0
 0.0  2.0
Base.cos方法
cos(A::AbstractMatrix)

計算方陣 A 的矩陣餘弦。

如果 A 是對稱或 Hermitian,其特徵分解 (eigen) 用於計算餘弦。否則,餘弦會透過呼叫 exp 來決定。

範例

julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
  0.291927  -0.708073
 -0.708073   0.291927
Base.sin方法
sin(A::AbstractMatrix)

計算方陣 A 的矩陣正弦。

如果 A 是對稱或 Hermitian,其特徵分解 (eigen) 用於計算正弦。否則,正弦會透過呼叫 exp 來決定。

範例

julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
 0.454649  0.454649
 0.454649  0.454649
Base.Math.sincos方法
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
Base.tan方法
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
Base.Math.sec方法
sec(A::AbstractMatrix)

計算正方矩陣 A 的矩陣正割。

Base.Math.csc方法
csc(A::AbstractMatrix)

計算正方矩陣 A 的矩陣餘割。

Base.Math.cot方法
cot(A::AbstractMatrix)

計算正方矩陣 A 的矩陣餘切。

Base.cosh方法
cosh(A::AbstractMatrix)

計算正方矩陣 A 的矩陣雙曲餘弦。

Base.sinh方法
sinh(A::AbstractMatrix)

計算方陣 A 的矩陣雙曲正弦。

Base.tanh方法
tanh(A::AbstractMatrix)

計算方陣 A 的矩陣雙曲正切。

Base.Math.sech方法
sech(A::AbstractMatrix)

計算方陣 A 的矩陣雙曲正割。

Base.Math.csch方法
csch(A::AbstractMatrix)

計算方陣 A 的矩陣雙曲餘割。

Base.Math.coth方法
coth(A::AbstractMatrix)

計算方陣 A 的矩陣雙曲餘切。

Base.acos方法
acos(A::AbstractMatrix)

計算方陣 A 的反矩陣餘弦。

如果 A 是對稱或 Hermitian,則其特徵分解 (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
Base.asin方法
asin(A::AbstractMatrix)

計算方陣 A 的反矩陣正弦。

如果 A 是對稱或 Hermitian,其特徵分解 (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
Base.atan方法
atan(A::AbstractMatrix)

計算方陣 A 的反矩陣正切。

如果 A 是對稱或 Hermitian,其特徵分解 (eigen) 會用於計算反正切。否則,反正切會使用 log 確定。有關用於計算此函數的理論和對數公式,請參閱 [AH16_3]

範例

julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
  0.5+1.38778e-17im  0.1-2.77556e-17im
 -0.2+6.93889e-17im  0.3-4.16334e-17im
Base.Math.asec方法
asec(A::AbstractMatrix)

計算 A 的反矩陣正割。

Base.Math.acsc方法
acsc(A::AbstractMatrix)

計算 A 的反矩陣餘割。

Base.Math.acot方法
acot(A::AbstractMatrix)

計算 A 的餘切反矩陣。

Base.acosh方法
acosh(A::AbstractMatrix)

計算正方形矩陣 A 的雙曲餘弦反矩陣。關於計算此函數所使用的理論和對數公式,請參閱 [AH16_4]

Base.asinh方法
asinh(A::AbstractMatrix)

計算正方形矩陣 A 的雙曲正弦反矩陣。關於計算此函數所使用的理論和對數公式,請參閱 [AH16_5]

Base.atanh方法
atanh(A::AbstractMatrix)

計算正方形矩陣 A 的雙曲正切反矩陣。關於計算此函數所使用的理論和對數公式,請參閱 [AH16_6]

Base.Math.asech方法
asech(A::AbstractMatrix)

計算 A 的雙曲正割反矩陣。

Base.Math.acsch方法
acsch(A::AbstractMatrix)

計算 A 的雙曲餘割反矩陣。

Base.Math.acoth方法
acoth(A::AbstractMatrix)

計算 A 的雙曲餘切反矩陣。

LinearAlgebra.lyap函數
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
LinearAlgebra.sylvester函數
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
LinearAlgebra.issuccess函數
issuccess(F::Factorization)

測試矩陣分解是否成功。

Julia 1.6

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

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

julia> issuccess(F)
true

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

julia> issuccess(F)
false
LinearAlgebra.issymmetric函數
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
LinearAlgebra.isposdef函數
isposdef(A) -> Bool

通過嘗試對 A 執行 Cholesky 分解來測試矩陣是否正定(和 Hermitian)。

另請參閱 isposdef!cholesky

範例

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

julia> isposdef(A)
true
LinearAlgebra.isposdef!函數
isposdef!(A) -> Bool

通過嘗試對 A 執行 Cholesky 分解來測試矩陣是否正定(和 Hermitian),在此過程中覆寫 A。另請參閱 isposdef

範例

julia> A = [1. 2.; 2. 50.];

julia> isposdef!(A)
true

julia> A
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  6.78233
LinearAlgebra.istril函數
istril(A::AbstractMatrix, k::Integer = 0) -> Bool

測試從第 k 個超對角線開始的 A 是否為下三角矩陣。

範例

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> istril(a)
false

julia> istril(a, 1)
true

julia> b = [1 0; -im -1]
2×2 Matrix{Complex{Int64}}:
 1+0im   0+0im
 0-1im  -1+0im

julia> istril(b)
true

julia> istril(b, -1)
false
LinearAlgebra.istriu函數
istriu(A::AbstractMatrix, k::Integer = 0) -> Bool

測試從第 k 個超對角線開始的 A 是否為上三角矩陣。

範例

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> istriu(a)
false

julia> istriu(a, -1)
true

julia> b = [1 im; 0 -1]
2×2 Matrix{Complex{Int64}}:
 1+0im   0+1im
 0+0im  -1+0im

julia> istriu(b)
true

julia> istriu(b, 1)
false
LinearAlgebra.isdiag函數
isdiag(A) -> Bool

測試矩陣是否為對角矩陣,意思是 iszero(A[i,j]) 為真,除非 i == j。請注意,A 不一定是方陣;如果您也想檢查這一點,您需要檢查 size(A, 1) == size(A, 2)

範例

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> isdiag(a)
false

julia> b = [im 0; 0 -im]
2×2 Matrix{Complex{Int64}}:
 0+1im  0+0im
 0+0im  0-1im

julia> isdiag(b)
true

julia> c = [1 0 0; 0 2 0]
2×3 Matrix{Int64}:
 1  0  0
 0  2  0

julia> isdiag(c)
true

julia> d = [1 0 0; 0 2 3]
2×3 Matrix{Int64}:
 1  0  0
 0  2  3

julia> isdiag(d)
false
LinearAlgebra.ishermitian函數
ishermitian(A) -> Bool

測試矩陣是否為 Hermitian 矩陣。

範例

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> ishermitian(a)
true

julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
 1+0im  0+1im
 0-1im  1+0im

julia> ishermitian(b)
true
Base.transpose函數
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 # the transpose of a transpose unwraps the parent
true

julia> Transpose(B) # however, the constructor always wraps its argument
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
 3  2
 0  0

julia> B[1,2] = 4; # modifying B will modify A automatically

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) # returns a row-vector
1×3 transpose(::Vector{Int64}) with eltype Int64:
 1  2  3

julia> transpose(v) * v # compute the dot product
14

對於矩陣的矩陣,個別區塊會遞迴操作

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

julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # construct a block matrix
2×2 Matrix{Matrix{Int64}}:
 [1 3; 2 4]  [3 9; 6 12]
 [2 6; 4 8]  [4 12; 8 16]

julia> transpose(D) # blocks are recursively transposed
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
 [1 2; 3 4]   [2 4; 6 8]
 [3 6; 9 12]  [4 8; 12 16]
transpose(F::Factorization)

分解 F 的延遲轉置。預設傳回 TransposeFactorization,但對於 eltype 為實數的 Factorization 除外,這種情況下會傳回 AdjointFactorization

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

轉置矩陣 A 並將其儲存在矩陣 X 中。size(X) 必須等於 size(transpose(A))。除了在需要時調整 X 的 rowval 和 nzval 大小之外,不會分配其他額外的記憶體。

請參閱 halfperm!

來源
transpose!(dest,src)

轉置陣列 src 並將結果儲存在預先配置的陣列 dest 中,其大小應對應於 (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
LinearAlgebra.Transpose類型
Transpose

底層線性代數物件的轉置檢視的惰性包裝器類型,通常是 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
Base.adjoint函數
A'
adjoint(A)

惰性伴隨(共軛轉置)。請注意,adjoint 會遞迴套用至元素。

對於數字類型,adjoint 會傳回複數共軛,因此對於實數而言,它等於身分函數。

此運算用於線性代數用途 - 對於一般資料處理,請參閱 permutedims

範例

julia> A = [3+2im 9+2im; 0  0]
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 0+0im  0+0im

julia> B = A' # equivalently adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 3-2im  0+0im
 9-2im  0+0im

julia> B isa Adjoint
true

julia> adjoint(B) === A # the adjoint of an adjoint unwraps the parent
true

julia> Adjoint(B) # however, the constructor always wraps its argument
2×2 adjoint(adjoint(::Matrix{Complex{Int64}})) with eltype Complex{Int64}:
 3+2im  9+2im
 0+0im  0+0im

julia> B[1,2] = 4 + 5im; # modifying B will modify A automatically

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 4-5im  0+0im

對於實矩陣,adjoint 運算等同於 transpose

julia> A = reshape([x for x in 1:4], 2, 2)
2×2 Matrix{Int64}:
 1  3
 2  4

julia> A'
2×2 adjoint(::Matrix{Int64}) with eltype Int64:
 1  2
 3  4

julia> adjoint(A) == transpose(A)
true

AbstractVector 的伴隨矩陣是一個列向量

julia> x = [3, 4im]
2-element Vector{Complex{Int64}}:
 3 + 0im
 0 + 4im

julia> x'
1×2 adjoint(::Vector{Complex{Int64}}) with eltype Complex{Int64}:
 3+0im  0-4im

julia> x'x # compute the dot product, equivalently x' * x
25 + 0im

對於矩陣的矩陣,個別區塊會遞迴操作

julia> A = reshape([x + im*x for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
 1+1im  3+3im
 2+2im  4+4im

julia> C = reshape([A, 2A, 3A, 4A], 2, 2)
2×2 Matrix{Matrix{Complex{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(::Matrix{Matrix{Complex{Int64}}}) with eltype Adjoint{Complex{Int64}, Matrix{Complex{Int64}}}:
 [1-1im 2-2im; 3-3im 4-4im]    [2-2im 4-4im; 6-6im 8-8im]
 [3-3im 6-6im; 9-9im 12-12im]  [4-4im 8-8im; 12-12im 16-16im]
adjoint(F::Factorization)

分解 F 的惰性伴隨矩陣。預設會傳回一個 AdjointFactorization 封裝器。

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

轉置矩陣 A,並將元素的伴隨矩陣儲存在矩陣 X 中。size(X) 必須等於 size(transpose(A))。除了視需要調整 X 的 rowval 和 nzval 大小之外,不會配置其他額外的記憶體。

請參閱 halfperm!

來源
adjoint!(dest,src)

共軛轉置陣列 src,並將結果儲存在預先配置的陣列 dest 中,其大小應對應於 (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> adjoint!(B, A);

julia> B
2×2 Matrix{Complex{Int64}}:
 3-2im  8-7im
 9-2im  4-6im

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 8+7im  4+6im
LinearAlgebra.Adjoint型別
Adjoint

底層線性代數物件(通常是 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
Base.copy方法
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
LinearAlgebra.stride1函數
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
LinearAlgebra.checksquare函數
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
LinearAlgebra.peakflops函數
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 次試驗中使用最佳計時。如果提供了 ntrials 關鍵字引數,peakflops 會使用這些試驗來挑選最佳計時。

如果關鍵字引數 parallel 設為 truepeakflops 會在所有工作處理器上並行執行。傳回整個平行電腦的浮點運算速率。在並行執行時,只會使用 1 個 BLAS 執行緒。引數 n 仍然是指在每個處理器上求解的問題大小。

Julia 1.1

此函數至少需要 Julia 1.1。在 Julia 1.0 中,它可從標準函式庫 InteractiveUtils 取得。

LinearAlgebra.hermitianpart函數
hermitianpart(A, uplo=:U) -> Hermitian

傳回方陣 A 的 Hermitian 部分,定義為 (A + A') / 2,為 Hermitian 矩陣。對於實數矩陣 A,這也稱為 A 的對稱部分;有時也稱為「算子實數部分」。選用參數 uplo 控制 Hermitian 檢視的對應參數。對於實數矩陣,後者等於 Symmetric 檢視。

另請參閱 hermitianpart! 以取得對應的原位操作。

Julia 1.10

此函式需要 Julia 1.10 或更新版本。

LinearAlgebra.hermitianpart!函式
hermitianpart!(A, uplo=:U) -> Hermitian

以其 Hermitian 部分 (A + A') / 2 原位覆寫方陣 A,並傳回 Hermitian(A, uplo)。對於實數矩陣 A,這也稱為 A 的對稱部分。

另請參閱 hermitianpart 以取得對應的非原位操作。

Julia 1.10

此函式需要 Julia 1.10 或更新版本。

低階矩陣運算

在許多情況下,矩陣運算有原位版本,允許您提供預先配置的輸出向量或矩陣。在最佳化關鍵程式碼時,這很有用,因為可以避免重複配置的開銷。根據慣例,這些原位操作在下方加上 ! 字尾(例如 mul!)。

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

計算矩陣-矩陣或矩陣-向量的乘積 $AB$,並將結果儲存在 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); mul!(Y, A, B);

julia> Y
2×2 Matrix{Float64}:
 3.0  3.0
 7.0  7.0

實作

對於自訂矩陣和向量類型,建議實作 5 個參數的 mul!,而不是直接實作 3 個參數的 mul!(如果可能的話)。

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> mul!(C, A, B, 100.0, 10.0) === C
true

julia> C
2×2 Matrix{Float64}:
 310.0  320.0
 730.0  740.0
LinearAlgebra.lmul!函式
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
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
LinearAlgebra.rmul!函式
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
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
LinearAlgebra.ldiv!函數
ldiv!(Y, A, B) -> Y

計算 A \ B 並儲存在 Y 中,傳回結果。

參數 A 不應 是矩陣。相反地,它不應該是矩陣,而應該是分解物件(例如由 factorizecholesky 產生)。原因在於分解本身既昂貴,通常也會配置記憶體(儘管也可以透過例如 lu! 就地完成),而需要 ldiv! 的效能關鍵情況通常也需要對 A 的分解進行細緻控制。

注意

某些結構化矩陣類型,例如 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
3-element Vector{Float64}:
  0.7128099173553719
 -0.051652892561983674
  0.10020661157024757

julia> A\X
3-element Vector{Float64}:
  0.7128099173553719
 -0.05165289256198333
  0.10020661157024785
ldiv!(A, B)

計算 A \ B 並覆寫 B 以儲存結果。

參數 A 不應 是矩陣。相反地,它不應該是矩陣,而應該是分解物件(例如由 factorizecholesky 產生)。原因在於分解本身既昂貴,通常也會配置記憶體(儘管也可以透過例如 lu! 就地完成),而需要 ldiv! 的效能關鍵情況通常也需要對 A 的分解進行細緻控制。

注意

某些結構化矩陣類型,例如 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
3-element Vector{Float64}:
  0.7128099173553719
 -0.051652892561983674
  0.10020661157024757

julia> A\Y
3-element Vector{Float64}:
  0.7128099173553719
 -0.05165289256198333
  0.10020661157024785
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
LinearAlgebra.rdiv!函數
rdiv!(A, B)

就地計算 A / B 並覆寫 A 以儲存結果。

參數 B 不應 是矩陣。它應為分解物件(例如由 factorizecholesky 產生),而非矩陣。這是因為分解本身既昂貴又通常會配置記憶體(儘管它也可以就地完成,例如透過 lu!),而需要 rdiv! 的效能關鍵情況通常也需要對 B 的分解進行細緻的控制。

注意

某些結構化矩陣類型,例如 DiagonalUpperTriangular,是允許的,因為它們已經是分解形式

rdiv!(A::AbstractArray, b::Number)

將陣列 A 中的每個條目除以純量 b 並就地覆寫 A。使用 ldiv! 從左邊除以純量。

範例

julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
 0.5  1.0
 1.5  2.0

BLAS 函數

在 Julia 中(就像在許多科學運算中一樣),稠密線性代數運算基於 LAPACK 函式庫,而 LAPACK 函式庫又是建立在稱為 BLAS 的基本線性代數構建模組之上。針對每種電腦架構都有高度最佳化的 BLAS 實作,有時在高效能線性代數常式中,直接呼叫 BLAS 函數會很有用。

LinearAlgebra.BLAS 提供一些 BLAS 函數的包裝函數。那些會覆寫輸入陣列之一的 BLAS 函數,其名稱以 '!' 結尾。通常,BLAS 函數有四種已定義的方法,分別適用於 Float32Float64ComplexF32ComplexF64 陣列。

BLAS 字元引數

許多 BLAS 函式接受決定是否轉置引數 (trans)、參考矩陣的哪個三角形 (uploul)、是否可以假設三角形矩陣的對角線全為 1 (dA) 或矩陣乘法的輸入引數屬於哪一側 (side) 的引數。可能性如下

乘法順序

side意義
'L'引數位於矩陣-矩陣運算的左側
'R'引數位於矩陣-矩陣運算的右側

三角形參考

uplo/ul意義
'U'只會使用矩陣的三角形。
'L'只會使用矩陣的三角形。

轉置運算

trans/tX意義
'N'輸入矩陣 X 不會轉置或共軛。
'T'輸入矩陣 X 會轉置。
'C'輸入矩陣 X 會共軛並轉置。

單位對角線

diag/dX意義
'N'會讀取矩陣 X 的對角線值。
'U'矩陣 X 的對角線假設為全為 1。
LinearAlgebra.BLAS.set_num_threads函式
set_num_threads(n::Integer)
set_num_threads(::Nothing)

設定 BLAS 函式庫應使用的執行緒數目等於 n::Integer

也接受 nothing,這種情況下 julia 會嘗試猜測預設執行緒數目。傳遞 nothing 是不建議的,而且主要是出於歷史原因而存在。

BLAS 函式可分為三組,也稱為三個層級,視其首次提出時間、輸入參數類型和運算複雜度而定。

Level 1 BLAS 函式

Level 1 BLAS 函式首次在 [(Lawson, 1979)][Lawson-1979] 中提出,定義了純量和向量之間的運算。

[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847

LinearAlgebra.BLAS.rot!函式
rot!(n, X, incx, Y, incy, c, s)

使用陣列 X 的前 n 個元素(步幅為 incx)和陣列 Y 的前 n 個元素(步幅為 incy),覆寫 Xc*X + s*Y,覆寫 Y-conj(s)*X + c*Y。傳回 XY

Julia 1.5

rot! 至少需要 Julia 1.5。

LinearAlgebra.BLAS.scal!函數
scal!(n, a, X, incx)
scal!(a, X)

以陣列 X 的前 n 個元素的 a*X 覆寫 X,其跨距為 incx。傳回 X

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

LinearAlgebra.BLAS.scal函數
scal(n, a, X, incx)
scal(a, X)

傳回陣列 X 的前 n 個元素乘上 a 的結果,其跨距為 incx

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

LinearAlgebra.BLAS.blascopy!函數
blascopy!(n, X, incx, Y, incy)

將陣列 Xn 個元素,其跨距為 incx,複製到陣列 Y,其跨距為 incy。傳回 Y

LinearAlgebra.BLAS.dot函數
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
LinearAlgebra.BLAS.dotu函數
dotu(n, X, incx, Y, incy)

兩個複數向量的點函數,包含陣列 Xn 個元素,其跨距為 incx,以及陣列 Yn 個元素,其跨距為 incy

範例

julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
-10.0 + 10.0im
LinearAlgebra.BLAS.dotc函數
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
LinearAlgebra.BLAS.nrm2函數
nrm2(n, X, incx)

一個向量的 2-範數,包含陣列 Xn 個元素,其跨距為 incx

範例

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

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

找出 dx 中絕對值最大的元素索引。ndx 的長度,incx 是步幅。如果未提供 nincx,則假設預設值為 n=length(dx)incx=stride1(dx)

Level 2 BLAS 函數

Level 2 BLAS 函數發布於 [(Dongarra, 1988)][Dongarra-1988],並定義矩陣向量運算。

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

傳回一個向量

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

根據 tA 將向量 y 更新為 alpha*A*x + beta*yalpha*A'x + beta*yalphabeta 是純量。傳回更新後的 y

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

根據 trans 將向量 y 更新為 alpha*A*x + beta*yalpha*A'*x + beta*y。矩陣 A 是維度為 m 乘以 size(A,2) 的一般帶狀矩陣,具有 kl 個次對角線和 ku 個超對角線。alphabeta 是純量。傳回更新後的 y

LinearAlgebra.BLAS.gbmv函數
gbmv(trans, m, kl, ku, alpha, A, x)

根據 trans 傳回 alpha*A*xalpha*A'*x。矩陣 A 是維度為 m 乘以 size(A,2) 的一般帶狀矩陣,具有 kl 個次對角線和 ku 個超對角線,而 alpha 是純量。

LinearAlgebra.BLAS.hemv!函數
hemv!(ul, alpha, A, x, beta, y)

將向量 y 更新為 alpha*A*x + beta*y。假設 A 是 Hermitian。只使用 Aul 三角形。alphabeta 是純量。傳回更新後的 y

LinearAlgebra.BLAS.hemv方法
hemv(ul, alpha, A, x)

傳回 alpha*A*x。假設 A 是 Hermitian。只使用 Aul 三角形。alpha 是純量。

LinearAlgebra.BLAS.hpmv!函數
hpmv!(uplo, α, AP, x, β, y)

將向量 y 更新為 α*A*x + β*y,其中 A 為以封裝格式 AP 提供的 Hermitian 矩陣。

uplo = 'U' 時,陣列 AP 必須包含 Hermitian 矩陣的上三角形,以逐欄順序封裝,因此 AP[1] 包含 A[1, 1]AP[2]AP[3] 分別包含 A[1, 2]A[2, 2],依此類推。

uplo = 'L' 時,陣列 AP 必須包含 Hermitian 矩陣的下三角形,以逐欄順序封裝,因此 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。

LinearAlgebra.BLAS.symv!函數
symv!(ul, alpha, A, x, beta, y)

將向量 y 更新為 alpha*A*x + beta*y。假設 A 為對稱。僅使用 Aul 三角形。alphabeta 為純量。傳回已更新的 y

LinearAlgebra.BLAS.symv方法
symv(ul, alpha, A, x)

傳回 alpha*A*x。假設 A 為對稱矩陣。只使用 Aul 三角形。alpha 為一個純量。

LinearAlgebra.BLAS.sbmv!函數
sbmv!(uplo, k, alpha, A, x, beta, y)

將向量 y 更新為 alpha*A*x + beta*y,其中 A 為階數為 size(A,2) 的對稱帶狀矩陣,且 k 個超對角線儲存在參數 A 中。A 的儲存配置如參考 BLAS 模組、第 2 層級 BLAS 所述:http://www.netlib.org/lapack/explore-html/。只使用 Auplo 三角形。

傳回已更新的 y

LinearAlgebra.BLAS.sbmv方法
sbmv(uplo, k, alpha, A, x)

傳回 alpha*A*x,其中 A 為階數為 size(A,2) 的對稱帶狀矩陣,且 k 個超對角線儲存在參數 A 中。只使用 Auplo 三角形。

LinearAlgebra.BLAS.sbmv方法
sbmv(uplo, k, A, x)

傳回 A*x,其中 A 為階數為 size(A,2) 的對稱帶狀矩陣,且 k 個超對角線儲存在參數 A 中。只使用 Auplo 三角形。

LinearAlgebra.BLAS.spmv!函數
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。

LinearAlgebra.BLAS.trmv!函數
trmv!(ul, tA, dA, A, b)

傳回 op(A)*b,其中 optA 決定。僅使用 Aul 三角形。 dA 決定是否讀取對角線值或假設它們全為 1。乘法在 b 上就地進行。

LinearAlgebra.BLAS.trmv函數
trmv(ul, tA, dA, A, b)

傳回 op(A)*b,其中 optA 決定。僅使用 Aul 三角形。 dA 決定是否讀取對角線值或假設它們全為 1。

LinearAlgebra.BLAS.trsv!函數
trsv!(ul, tA, dA, A, b)

A*x = b 或由 tAul 決定之其他兩個變體的解覆寫 bdA 決定是否讀取對角線值或假設所有值都為一。傳回更新後的 b

LinearAlgebra.BLAS.trsv函數
trsv(ul, tA, dA, A, b)

傳回 A*x = b 或由 tAul 決定之其他兩個變體的解。 dA 決定是否讀取對角線值或假設所有值都為一。

傳回矩陣

LinearAlgebra.BLAS.ger!函數
ger!(alpha, x, y, A)

使用向量 xy 將矩陣 A 更新為秩 1,作為 alpha*x*y' + A

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

僅適用於複數陣列的方法。使用向量 x 將 Hermitian 矩陣 A 更新為秩 1,作為 alpha*x*x' + Auplo 控制更新 A 的哪個三角形。傳回 A

LinearAlgebra.BLAS.syr!函數
syr!(uplo, alpha, x, A)

使用向量 x 將對稱矩陣 A 更新為秩 1,作為 alpha*x*transpose(x) + Auplo 控制更新 A 的哪個三角形。傳回 A

LinearAlgebra.BLAS.spr!函數
spr!(uplo, α, x, AP)

將矩陣 A 更新為 A+α*x*x',其中 A 是以封裝格式 AP 提供的對稱矩陣,而 x 是向量。

如果 uplo = 'U',則陣列 AP 必須包含對稱矩陣的上三角部分,按順序封裝,逐欄,因此 AP[1] 包含 A[1, 1]AP[2]AP[3] 分別包含 A[1, 2]A[2, 2],依此類推。

如果 uplo = 'L',則陣列 AP 必須包含對稱矩陣的下三角部分,按順序封裝,逐欄,因此 AP[1] 包含 A[1, 1]AP[2]AP[3] 分別包含 A[2, 1]A[3, 1],依此類推。

純量輸入 α 必須為實數。

陣列輸入 xAP 都必須為 Float32Float64 類型。傳回已更新的 AP

Julia 1.8

spr! 至少需要 Julia 1.8。

Level 3 BLAS 函數

Level 3 BLAS 函數已發布在 [(Dongarra, 1990)][Dongarra-1990] 中,並定義矩陣-矩陣運算。

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

LinearAlgebra.BLAS.gemm!函數
gemm!(tA, tB, alpha, A, B, beta, C)

根據 tAtB,將 C 更新為 alpha*A*B + beta*C 或其他三個變體。傳回已更新的 C

LinearAlgebra.BLAS.symm!函數
symm!(side, ul, alpha, A, B, beta, C)

根據 side,將 C 更新為 alpha*A*B + beta*Calpha*B*A + beta*C。假設 A 為對稱。僅使用 Aul 三角形。傳回已更新的 C

LinearAlgebra.BLAS.symm方法
symm(side, ul, alpha, A, B)

根據 side,傳回 alpha*A*Balpha*B*A。假設 A 為對稱。僅使用 Aul 三角形。

LinearAlgebra.BLAS.hemm!函數
hemm!(side, ul, alpha, A, B, beta, C)

根據 sideC 更新為 alpha*A*B + beta*Calpha*B*A + beta*C。假設 A 為 Hermitian。只使用 Aul 三角形。傳回已更新的 C

LinearAlgebra.BLAS.hemm方法
hemm(side, ul, alpha, A, B)

根據 side 傳回 alpha*A*Balpha*B*A。假設 A 為 Hermitian。只使用 Aul 三角形。

LinearAlgebra.BLAS.syrk!函數
syrk!(uplo, trans, alpha, A, beta, C)

根據 trans 將對稱矩陣 C 的秩 k 更新為 alpha*A*transpose(A) + beta*Calpha*transpose(A)*A + beta*C。只使用 Cuplo 三角形。傳回 C

LinearAlgebra.BLAS.syrk函數
syrk(uplo, trans, alpha, A)

根據 uplo 傳回 A 的上三角形或下三角形,根據 trans 傳回 alpha*A*transpose(A)alpha*transpose(A)*A

LinearAlgebra.BLAS.herk!函數
herk!(uplo, trans, alpha, A, beta, C)

僅限複數陣列的方法。根據 trans 將 Hermitian 矩陣 C 的秩 k 更新為 alpha*A*A' + beta*Calpha*A'*A + beta*C。僅更新 Cuplo 三角形。傳回 C

LinearAlgebra.BLAS.syr2k!函數
syr2k!(uplo, trans, alpha, A, B, beta, C)

根據 trans 將對稱矩陣 C 的秩 2k 更新為 alpha*A*transpose(B) + alpha*B*transpose(A) + beta*Calpha*transpose(A)*B + alpha*transpose(B)*A + beta*C。僅使用 Cuplo 三角形。傳回 C

LinearAlgebra.BLAS.syr2k函數
syr2k(uplo, trans, alpha, A, B)

根據 trans 傳回 alpha*A*transpose(B) + alpha*B*transpose(A)alpha*transpose(A)*B + alpha*transpose(B)*Auplo 三角形。

syr2k(uplo, trans, A, B)

根據 trans 傳回 A*transpose(B) + B*transpose(A)transpose(A)*B + transpose(B)*Auplo 三角形。

LinearAlgebra.BLAS.her2k!函數
her2k!(uplo, trans, alpha, A, B, beta, C)

根據 trans 將 Hermitian 矩陣 C 的秩 2k 更新為 alpha*A*B' + alpha*B*A' + beta*Calpha*A'*B + alpha*B'*A + beta*C。純量 beta 必須為實數。僅使用 Cuplo 三角形。傳回 C

LinearAlgebra.BLAS.her2k函數
her2k(uplo, trans, alpha, A, B)

傳回 uplo 三角形,根據 trans,傳回 alpha*A*B' + alpha*B*A'alpha*A'*B + alpha*B'*A

her2k(uplo, trans, A, B)

傳回 uplo 三角形,根據 trans,傳回 A*B' + B*A'A'*B + B'*A

LinearAlgebra.BLAS.trmm!函數
trmm!(side, ul, tA, dA, alpha, A, B)

更新 Balpha*A*B 或由 sidetA 決定之其他三個變異之一。僅使用 Aul 三角形。dA 決定是否讀取對角線值或假設它們全為 1。傳回已更新的 B

LinearAlgebra.BLAS.trmm函數
trmm(side, ul, tA, dA, alpha, A, B)

傳回 alpha*A*B 或由 sidetA 決定之其他三個變異之一。僅使用 Aul 三角形。dA 決定是否讀取對角線值或假設它們全為 1。

LinearAlgebra.BLAS.trsm!函數
trsm!(side, ul, tA, dA, alpha, A, B)

使用 A*X = alpha*B 的解或由 sidetA 決定的其他三個變體之一覆寫 B。僅使用 Aul 三角形。dA 決定是否讀取對角線值或假設它們全為 1。傳回已更新的 B

LinearAlgebra.BLAS.trsm函數
trsm(side, ul, tA, dA, alpha, A, B)

傳回 A*X = alpha*B 的解或由 sidetA 決定的其他三個變體之一。僅使用 Aul 三角形。dA 決定是否讀取對角線值或假設它們全為 1。

LAPACK 函數

LinearAlgebra.LAPACK 提供一些用於線性代數的 LAPACK 函數的包裝器。那些覆寫其中一個輸入陣列的函數的名稱以 '!' 結尾。

通常,一個函數有 4 個定義的方法,每個方法分別適用於 Float64Float32ComplexF64ComplexF32 陣列。

請注意,Julia 提供的 LAPACK API 可以而且將來會變更。由於此 API 不是使用者介面,因此不承諾在未來的版本中支援/棄用這組特定的函數。

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

計算帶狀矩陣 AB 的 LU 分解。kl 是包含非零帶的第一個次對角線,ku 是包含非零帶的最後一個超對角線,m 是矩陣 AB 的第一個維度。在原處傳回 LU 分解和使用的樞軸向量 ipiv

LinearAlgebra.LAPACK.gbtrs!函數
gbtrs!(trans, kl, ku, m, AB, ipiv, B)

求解方程式 AB * X = Btrans 決定 AB 的方向。它可能是 N(不轉置)、T(轉置)或 C(共軛轉置)。kl 是包含非零帶的第一個次對角線,ku 是包含非零帶的最後一個超對角線,m 是矩陣 AB 的第一個維度。ipiv 是從 gbtrf! 傳回的樞軸向量。傳回向量或矩陣 X,在原處覆寫 B

LinearAlgebra.LAPACK.gebal!函數
gebal!(job, A) -> (ilo, ihi, scale)

在計算特徵系統或 Schur 分解之前,平衡矩陣 Ajob 可以是 NA 沒有經過排序或縮放)、PA 只會經過排序)、SA 只會經過縮放)或 BA 會同時經過排序和縮放)。在原處修改 A,並傳回 iloihiscale。如果啟用排序,則如果 j > i1 < j < iloj > ihi,則 A[i,j] = 0scale 包含執行縮放/排序的資訊。

LinearAlgebra.LAPACK.gebak!函數
gebak!(job, side, ilo, ihi, scale, V)

將使用 gebal! 平衡矩陣的特征向量 V 轉換為原始矩陣的未縮放/未置換特征向量。原地修改 Vside 可以是 L(轉換左特征向量)或 R(轉換右特征向量)。

LinearAlgebra.LAPACK.gebrd!函數
gebrd!(A) -> (A, d, e, tauq, taup)

A 原地簡化為雙對角形式 A = QBP'。傳回 A,其中包含雙對角矩陣 Bd,其中包含 B 的對角元素;e,其中包含 B 的非對角元素;tauq,其中包含表示 Q 的基本反射器;以及 taup,其中包含表示 P 的基本反射器。

LinearAlgebra.LAPACK.gelqf!函數
gelqf!(A, tau)

計算 ALQ 分解,A = LQtau 包含參數化分解基本反射器的純量。tau 的長度必須大於或等於 A 的最小維度。

傳回原地修改的 Atau

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

計算 ALQ 分解,A = LQ

傳回原地修改的 A,以及 tau,其中包含參數化分解基本反射器的純量。

LinearAlgebra.LAPACK.geqlf!函數
geqlf!(A, tau)

計算 AQL 分解,A = QLtau 包含參數化分解基本反射器的純量。tau 的長度必須大於或等於 A 的最小維度。

傳回原地修改的 Atau

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

計算 AQL 分解,A = QL

傳回原地修改的 A,以及 tau,其中包含參數化分解基本反射器的純量。

LinearAlgebra.LAPACK.geqrf!函數
geqrf!(A, tau)

計算 AQR 分解,A = QRtau 包含參數化分解的初等反射器的純量。tau 的長度必須大於或等於 A 的最小維度。

傳回原地修改的 Atau

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

計算 AQR 分解,A = QR

傳回原地修改的 A,以及 tau,其中包含參數化分解基本反射器的純量。

LinearAlgebra.LAPACK.geqp3!函數
geqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)

使用 BLAS 層級 3 計算 A 的樞紐 QR 分解,AP = QRP 是樞紐矩陣,由 jpvt 表示。tau 儲存初等反射器。引數 jpvttau 是選用的,允許傳遞預先配置的陣列。傳遞時,如果 A(m x n) 矩陣,則 jpvt 的長度必須大於或等於 n,而 tau 的長度必須大於或等於 A 的最小維度。

Ajpvttau 會直接修改。

LinearAlgebra.LAPACK.gerqf!函數
gerqf!(A, tau)

計算 ARQ 分解,A = RQtau 包含參數化分解的初等反射器的純量。tau 的長度必須大於或等於 A 的最小維度。

傳回原地修改的 Atau

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

計算 ARQ 分解,A = RQ

傳回原地修改的 A,以及 tau,其中包含參數化分解基本反射器的純量。

LinearAlgebra.LAPACK.geqrt!函數
geqrt!(A, T)

計算 A 的區塊 QR 分解,A = QRT 包含參數化分解基本反射器的上三角區塊反射器。T 的第一個維度設定區塊大小,且必須介於 1 和 n 之間。T 的第二個維度必須等於 A 的最小維度。

傳回修改原地的 AT

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

計算 A 的區塊 QR 分解,A = QRnb 設定區塊大小,且必須介於 1 和 n 之間,也就是 A 的第二個維度。

傳回修改原地的 A,以及 T,其中包含參數化分解基本反射器的上三角區塊反射器。

LinearAlgebra.LAPACK.geqrt3!函數
geqrt3!(A, T)

遞迴計算 A 的區塊 QR 分解,A = QRT 包含參數化分解基本反射器的上三角區塊反射器。T 的第一個維度設定區塊大小,且必須介於 1 和 n 之間。T 的第二個維度必須等於 A 的最小維度。

傳回修改原地的 AT

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

遞迴計算 A 的區塊 QR 分解,A = QR

傳回修改原地的 A,以及 T,其中包含參數化分解基本反射器的上三角區塊反射器。

LinearAlgebra.LAPACK.getrf!函數
getrf!(A) -> (A, ipiv, info)

計算 A 的樞紐 LU 分解,A = LU

傳回修改原地的 A、樞紐資訊 ipiv,以及指示成功(info = 0)、U 中的奇異值(info = i,其中 U[i,i] 為奇異值)或錯誤碼(info < 0)的 info 碼。

LinearAlgebra.LAPACK.tzrzf!函數
tzrzf!(A) -> (A, tau)

將上梯形矩陣 A 轉換為上三角形式。傳回 Atau,也就是轉換基本反射器的純量參數。

LinearAlgebra.LAPACK.ormrz!函數
ormrz!(side, trans, A, tau, C)

使用 tzrzf! 提供的轉換將矩陣 C 乘以 Q。根據 sidetrans,乘法可以是左乘 (side = L, Q*C) 或右乘 (side = R, C*Q),而 Q 可以是不修改 (trans = N)、轉置 (trans = T) 或共軛轉置 (trans = C)。傳回矩陣 C,其會在原處修改為乘法的結果。

LinearAlgebra.LAPACK.gels!函數
gels!(trans, A, B) -> (F, B, ssr)

使用 QR 或 LQ 因式分解來求解線性方程式 A * X = Btranspose(A) * X = Badjoint(A) * X = B。使用解來修改矩陣/向量 BA 會覆寫為其 QRLQ 因式分解。trans 可以是 N (不修改)、T (轉置) 或 C (共軛轉置)。gels! 會尋找最小範數/最小平方解。A 可能為欠定或超定。解會傳回 B

LinearAlgebra.LAPACK.gesv!函數
gesv!(A, B) -> (B, A, ipiv)

使用 ALU 因式分解來求解線性方程式 A * X = B,其中 A 是方陣。A 會覆寫為其 LU 因式分解,而 B 會覆寫為解 Xipiv 包含 ALU 因式分解的樞紐資訊。

LinearAlgebra.LAPACK.getrs!函數
getrs!(trans, A, ipiv, B)

求解線性方程式 A * X = Btranspose(A) * X = Badjoint(A) * X = B,其中 A 為方陣。使用解修改矩陣/向量 BAgetrf! 中的 LU 分解,ipiv 為樞紐資訊。trans 可為 N(無修改)、T(轉置)或 C(共軛轉置)。

LinearAlgebra.LAPACK.getri!函數
getri!(A, ipiv)

使用 getrf! 找到的 LU 分解,計算 A 的逆矩陣。ipiv 為樞紐資訊輸出,而 A 包含 getrf!LU 分解。A 會被其逆矩陣覆寫。

LinearAlgebra.LAPACK.gesvx!函數
gesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)

使用 ALU 分解,求解線性方程式 A * X = B (trans = N)、transpose(A) * X = B (trans = T) 或 adjoint(A) * X = B (trans = C)。fact 可為 E,此時 A 會平衡並複製到 AFF,此時 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 的倒數條件數;ferrX 中每個解向量的正向誤差界限;berrX 中每個解向量的正向誤差界限;以及 work,倒數樞紐成長因子。

gesvx!(A, B)

gesvx! 的無平衡、無轉置簡化版。

LinearAlgebra.LAPACK.gelsd!函數
gelsd!(A, B, rcond) -> (B, rnk)

透過找出 ASVD 分解,然後對問題進行分而治之,計算 A * X = B 的最小範數解。B 會覆寫為解 X。小於 rcond 的奇異值將視為零。傳回 B 中的解和 rnkA 的有效秩。

LinearAlgebra.LAPACK.gelsy!函數
gelsy!(A, B, rcond) -> (B, rnk)

透過找出 A 的完整 QR 分解,然後對問題進行分而治之,計算 A * X = B 的最小範數解。B 會覆寫為解 X。小於 rcond 的奇異值將視為零。傳回 B 中的解和 rnkA 的有效秩。

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

求解方程式 A * x = c,其中 x 受到等式約束 B * x = d 的約束。使用公式 ||c - A*x||^2 = 0 來求解。傳回 X 和殘差平方和。

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

找出 A 的特徵系統。如果 jobvl = N,則不會計算 A 的左特徵向量。如果 jobvr = N,則不會計算 A 的右特徵向量。如果 jobvl = Vjobvr = V,則會計算對應的特徵向量。傳回 W 中的特徵值,VR 中的右特徵向量,以及 VL 中的左特徵向量。

LinearAlgebra.LAPACK.gesdd!函數
gesdd!(job, A) -> (U, S, VT)

使用分治法找出 A 的奇異值分解,A = U * S * V'。如果 job = A,則會計算 U 的所有欄和 V' 的所有列。如果 job = N,則不會計算 U 的任何欄或 V' 的任何列。如果 job = O,則 A 會被覆寫為(瘦)U 的欄和(瘦)V' 的列。如果 job = S,則會計算(瘦)U 的欄和(瘦)V' 的列,並分別傳回。

LinearAlgebra.LAPACK.gesvd!函數
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 的奇異值。

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

找出 AB 的廣義奇異值分解,U'*A*Q = D1*RV'*B*Q = D2*RD1 的對角線上有 alpha,而 D2 的對角線上有 beta。如果 jobu = U,則會計算正交/酉矩陣 U。如果 jobv = V,則會計算正交/酉矩陣 V。如果 jobq = Q,則會計算正交/酉矩陣 Q。如果 jobujobvjobqN,則不會計算該矩陣。此函數僅在 3.6.0 之前的 LAPACK 版本中提供。

LinearAlgebra.LAPACK.ggsvd3!函數
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。

LinearAlgebra.LAPACK.geevx!函式
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,則必須計算右特徵向量和左特徵向量。

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

找出 AB 的廣義特徵分解。如果 jobvl = N,則不會計算左特徵向量。如果 jobvr = N,則不會計算右特徵向量。如果 jobvl = Vjobvr = V,則會計算對應的特徵向量。

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

使用區塊演算法找出 AB 的廣義特徵分解。如果 jobvl = N,則不會計算左特徵向量。如果 jobvr = N,則不會計算右特徵向量。如果 jobvl = Vjobvr = V,則會計算對應的特徵向量。此函數需要 LAPACK 3.6.0。

LinearAlgebra.LAPACK.gtsv!函數
gtsv!(dl, d, du, B)

解方程式 A * X = B,其中 A 是三對角矩陣,其次對角線為 dl、對角線為 d,以及超對角線為 du

以解 X 覆寫 B 並傳回。

LinearAlgebra.LAPACK.gttrf!函數
gttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)

找出三對角矩陣的 LU 分解,其次對角線為 dl、對角線為 d,以及超對角線為 du

修改 dlddu,並傳回它們、第二個超對角線 du2 和樞紐向量 ipiv

LinearAlgebra.LAPACK.gttrs!函數
gttrs!(trans, dl, d, du, du2, ipiv, B)

使用 gttrf! 計算的 LU 分解,解方程式 A * X = B (trans = N)、transpose(A) * X = B (trans = T) 或 adjoint(A) * X = B (trans = C)。以解 X 覆寫 B

LinearAlgebra.LAPACK.orglq!函數
orglq!(A, tau, k = length(tau))

在對 A 呼叫 gelqf! 之後,明確地找出 LQ 分解的矩陣 Q。使用 gelqf! 的輸出。A 會被 Q 覆寫。

LinearAlgebra.LAPACK.orgqr!函數
orgqr!(A, tau, k = length(tau))

在對 A 呼叫 geqrf! 之後,明確地找出 QR 分解的矩陣 Q。使用 geqrf! 的輸出。A 會被 Q 覆寫。

LinearAlgebra.LAPACK.orgql!函數
orgql!(A, tau, k = length(tau))

在對 A 呼叫 geqlf! 之後,明確地找出 QL 分解的矩陣 Q。使用 geqlf! 的輸出。A 會被 Q 覆寫。

LinearAlgebra.LAPACK.orgrq!函數
orgrq!(A, tau, k = length(tau))

在對 A 呼叫 gerqf! 之後,明確地找出 RQ 分解的矩陣 Q。使用 gerqf! 的輸出。A 會被 Q 覆寫。

LinearAlgebra.LAPACK.ormlq!函數
ormlq!(side, trans, A, tau, C)

針對 side = L 計算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),或針對 side = R 計算等效的右側乘法,使用 Q 從使用 gelqf! 計算的 ALQ 分解。C 會被覆寫。

LinearAlgebra.LAPACK.ormqr!函數
ormqr!(side, trans, A, tau, C)

針對 side = L 計算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),或針對 side = R 計算等效的右側乘法,使用 Q 從使用 geqrf! 計算的 AQR 分解。C 會被覆寫。

LinearAlgebra.LAPACK.ormql!函數
ormql!(side, trans, A, tau, C)

計算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),其中 side = L 或等效的右乘運算 side = R 使用 Q,來自使用 geqlf! 計算的 AQL 分解。C 會被覆寫。

LinearAlgebra.LAPACK.ormrq!函數
ormrq!(side, trans, A, tau, C)

計算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),其中 side = L 或等效的右乘運算 side = R 使用 Q,來自使用 gerqf! 計算的 ARQ 分解。C 會被覆寫。

LinearAlgebra.LAPACK.gemqrt!函數
gemqrt!(side, trans, V, T, C)

計算 Q * C (trans = N)、transpose(Q) * C (trans = T)、adjoint(Q) * C (trans = C),其中 side = L 或等效的右乘運算 side = R 使用 Q,來自使用 geqrt! 計算的 AQR 分解。C 會被覆寫。

LinearAlgebra.LAPACK.posv!函數
posv!(uplo, A, B) -> (A, B)

找出 A * X = B 的解,其中 A 是對稱或厄米特正定矩陣。如果 uplo = U,則計算 A 的上 Cholesky 分解。如果 uplo = L,則計算 A 的下 Cholesky 分解。A 會被其 Cholesky 分解覆寫。B 會被解 X 覆寫。

LinearAlgebra.LAPACK.potrf!函數
potrf!(uplo, A)

計算正定矩陣 A 的 Cholesky 分解(如果 uplo = U 則為上三角,如果 uplo = L 則為下三角)。A 會被覆寫並傳回資訊碼。

LinearAlgebra.LAPACK.potri!函數
potri!(uplo, A)

在呼叫 potrf! 找出正定矩陣 A 的 Cholesky 分解(如果 uplo = U 則為上三角,如果 uplo = L 則為下三角)後,計算其逆矩陣。

A 會被其逆矩陣覆寫並傳回。

LinearAlgebra.LAPACK.potrs!函數
potrs!(uplo, A, B)

找出 A * X = B 的解,其中 A 是對稱或厄米特正定矩陣,其 Cholesky 分解是由 potrf! 計算出來的。如果 uplo = U,則計算 A 的上三角 Cholesky 分解。如果 uplo = L,則計算 A 的下三角 Cholesky 分解。B 會被解 X 覆寫。

LinearAlgebra.LAPACK.pstrf!函數
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 是不定或秩虧的。

LinearAlgebra.LAPACK.ptsv!函數
ptsv!(D, E, B)

求解正定三對角矩陣 AA * X = BDA 的對角線,E 是非對角線。B 會被解 X 覆寫並傳回。

LinearAlgebra.LAPACK.pttrf!函數
pttrf!(D, E)

計算正定三對角矩陣的 LDLt 分解,其中 D 為對角線,E 為非對角線。DE 會被覆寫並傳回。

LinearAlgebra.LAPACK.pttrs!函數
pttrs!(D, E, B)

使用 pttrf! 計算正定三對角矩陣 A 的 LDLt 分解後,求解 A * X = B,其中 A 的對角線為 D,非對角線為 EB 會被解 X 覆寫。

LinearAlgebra.LAPACK.trtri!函數
trtri!(uplo, diag, A)

找出三角矩陣 A 的反矩陣(如果 uplo = U 則為上三角,如果 uplo = L 則為下三角)。如果 diag = NA 的對角線元素非單位元素。如果 diag = UA 的所有對角線元素均為 1。A 會被其反矩陣覆寫。

LinearAlgebra.LAPACK.trtrs!函數
trtrs!(uplo, trans, diag, A, B)

求解(如果 uplo = U 則為上三角,如果 uplo = L 則為下三角)三角矩陣 AA * X = B (trans = N)、transpose(A) * X = B (trans = T) 或 adjoint(A) * X = B (trans = C)。如果 diag = NA 的對角線元素非單位元素。如果 diag = UA 的所有對角線元素均為 1。B 會被解 X 覆寫。

LinearAlgebra.LAPACK.trcon!函數
trcon!(norm, uplo, diag, A)

找出(如果 uplo = U 為上三角矩陣,如果 uplo = L 為下三角矩陣)三角矩陣 A 的倒數條件數。如果 diag = NA 具有非單位對角線元素。如果 diag = UA 的所有對角線元素均為 1。如果 norm = I,則會在無限範數中找出條件數。如果 norm = O1,則會在 1 範數中找出條件數。

LinearAlgebra.LAPACK.trevc!函數
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 中值對應的特徵向量。

LinearAlgebra.LAPACK.trrfs!函數
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,或在使用 trtrs! 計算 X 後的等效方程式右邊 side = R X * A。如果 uplo = U,則 A 為上三角矩陣。如果 uplo = L,則 A 為下三角矩陣。如果 diag = N,則 A 具有非單位對角線元素。如果 diag = U,則 A 的所有對角線元素都為一。FerrBerr 是選用輸入。Ferr 是前向誤差,Berr 是後向誤差,每個都是逐個組成部分。

LinearAlgebra.LAPACK.stev!函數
stev!(job, dv, ev) -> (dv, Zmat)

計算對稱三對角矩陣的本徵系統,其中 dv 為對角線,ev 為非對角線。如果 job = N,則僅找到本徵值並傳回 dv。如果 job = V,則也會找到本徵向量並傳回 Zmat

LinearAlgebra.LAPACK.stebz!函數
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 可設定為收斂的容許誤差。

LinearAlgebra.LAPACK.stegr!函數
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

LinearAlgebra.LAPACK.stein!函數
stein!(dv, ev_in, w_in, iblock_in, isplit_in)

計算對稱三對角矩陣的特徵向量,dv 為對角線,ev_in 為非對角線。w_in 指定要找出對應特徵向量的輸入特徵值。iblock_in 指定對應 w_in 中特徵值的子矩陣。isplit_in 指定子矩陣區塊之間的分隔點。

LinearAlgebra.LAPACK.syconv!函數
syconv!(uplo, A, ipiv) -> (A, work)

將對稱矩陣 A (已分解成三角矩陣) 轉換成兩個矩陣 LD。如果 uplo = U,則 A 為上三角矩陣。如果 uplo = L,則為下三角矩陣。ipiv 是三角分解的樞紐向量。A 會被 LD 覆寫。

LinearAlgebra.LAPACK.sysv!函數
sysv!(uplo, A, B) -> (B, A, ipiv)

尋找對稱矩陣 AA * X = B 解。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。B 會被解 X 覆寫。A 會被其 Bunch-Kaufman 分解覆寫。ipiv 包含分解的樞紐資訊。

LinearAlgebra.LAPACK.sytrf!函數
sytrf!(uplo, A) -> (A, ipiv, info)

計算對稱矩陣 A 的 Bunch-Kaufman 分解。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。

傳回由分解覆寫的 A、樞紐向量 ipiv,以及錯誤碼 info,它是非負整數。如果 info 為正數,則矩陣為奇異矩陣,且分解的對角線部分在位置 info 處恰為零。

LinearAlgebra.LAPACK.sytri!函數
sytri!(uplo, A, ipiv)

使用 sytrf! 的結果計算對稱矩陣 A 的反矩陣。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。A 會被其反矩陣覆寫。

LinearAlgebra.LAPACK.sytrs!函數
sytrs!(uplo, A, ipiv, B)

使用 sytrf! 的結果,為對稱矩陣 A 解決方程式 A * X = B。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。B 會被解 X 覆寫。

LinearAlgebra.LAPACK.hesv!函數
hesv!(uplo, A, B) -> (B, A, ipiv)

找出 Hermitian 矩陣 A * X = B 的解。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。B 會被解 X 覆寫。A 會被其 Bunch-Kaufman 因式分解覆寫。ipiv 包含關於因式分解的樞紐資訊。

LinearAlgebra.LAPACK.hetrf!函數
hetrf!(uplo, A) -> (A, ipiv, info)

計算 Hermitian 矩陣 A 的 Bunch-Kaufman 因式分解。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。

傳回由分解覆寫的 A、樞紐向量 ipiv,以及錯誤碼 info,它是非負整數。如果 info 為正數,則矩陣為奇異矩陣,且分解的對角線部分在位置 info 處恰為零。

LinearAlgebra.LAPACK.hetri!函數
hetri!(uplo, A, ipiv)

使用 sytrf! 的結果計算 Hermitian 矩陣 A 的反矩陣。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。A 會被其反矩陣覆寫。

LinearAlgebra.LAPACK.hetrs!函數
hetrs!(uplo, A, ipiv, B)

使用 sytrf! 的結果,為 Hermitian 矩陣 A 解決方程式 A * X = B。如果 uplo = U,則儲存 A 的上半部。如果 uplo = L,則儲存下半部。B 會被解 X 覆寫。

LinearAlgebra.LAPACK.syev!函數
syev!(jobz, uplo, A)

找出對稱矩陣 A 的特徵值 (jobz = N) 或特徵值和特徵向量 (jobz = V)。如果 uplo = U,則使用 A 的上三角。如果 uplo = L,則使用 A 的下三角。

LinearAlgebra.LAPACK.syevr!函數
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

LinearAlgebra.LAPACK.syevd!函數
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),以比較不同方法的準確度和效能。

LinearAlgebra.LAPACK.sygvd!函數
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

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

計算對角線上的 d 和非對角線上的 e_ 的雙對角矩陣的奇異值分解。如果 uplo = U,則 e_ 是超對角線。如果 uplo = L,則 e_ 是次對角線。還可以選擇計算乘積 Q' * C

傳回 d 中的奇異值,以及用 Q' * C 覆寫的矩陣 C

LinearAlgebra.LAPACK.bdsdc!函數
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 中的緊湊奇異向量。

LinearAlgebra.LAPACK.gecon!函數
gecon!(normtype, A, anorm)

找到矩陣 A 的倒數條件數。如果 normtype = I,則在無窮範數中找到條件數。如果 normtype = O1,則在一個範數中找到條件數。A 必須是 getrf! 的結果,而 anormA 在相關範數中的範數。

LinearAlgebra.LAPACK.gehrd!函數
gehrd!(ilo, ihi, A) -> (A, tau)

將矩陣 A 轉換為 Hessenberg 形式。如果 A 已使用 gebal! 平衡,則 iloihigebal! 的輸出。否則,它們應該是 ilo = 1ihi = size(A,2)tau 包含分解的初等反射器。

LinearAlgebra.LAPACK.orghr!函數
orghr!(ilo, ihi, A, tau)

明確找出 Q,即 gehrd! 中的正交/酉矩陣。iloihiAtau 必須對應於 gehrd! 的輸入/輸出。

LinearAlgebra.LAPACK.gees!函數
gees!(jobvs, A) -> (A, vs, w)

計算矩陣 A 的特徵值 (jobvs = N) 或特徵值和 Schur 向量 (jobvs = V)。A 會被其 Schur 形式覆寫。

傳回 A、包含 Schur 向量的 vs,以及包含特徵值的 w

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

計算 AB 的廣義特徵值、廣義 Schur 形式、左 Schur 向量 (jobsvl = V) 或右 Schur 向量 (jobvsr = V)。

廣義特徵值傳回至 alphabeta。左 Schur 向量傳回至 vsl,右 Schur 向量傳回至 vsr

LinearAlgebra.LAPACK.gges3!函數
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

LinearAlgebra.LAPACK.trexc!函數
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 個參數的方法會呼叫具有 compq = V 的 5 個參數的方法。

LinearAlgebra.LAPACK.trsen!函數
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 個參數的方法會呼叫具有 job = Ncompq = V 的 5 個參數的方法。

傳回 TQ、重新排序的 w 中的本徵值、本徵值叢集的條件數 s,以及不變子空間的條件數 sep

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

重新排序廣義 Schur 分解的向量。select 指定每個叢集中的本徵值。

LinearAlgebra.LAPACK.trsyl!函數
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

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

計算所有本徵值和(選擇性地)將矩陣化簡為 Hessenberg 形式的 Schur 分解。如果 H 使用 gebal! 平衡,則 iloihigebal! 的輸出。否則,它們應該是 ilo = 1ihi = size(H,2)tau 包含分解的初等反射器。

  • ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
  • ACM887陳, Y.、戴維斯, T. A.、哈格, W. W. 和拉賈馬尼卡姆, S. (2008)。演算法 887:CHOLMOD,超節點稀疏 Cholesky 因式分解和更新/降級。ACM Trans. Math. Softw.,35(3)。doi:10.1145/1391989.1391995
  • DavisHager2009戴維斯, 提摩西 A. 和哈格, W. W. (2009)。稀疏 Cholesky 更新/降級和三角求解中的動態超節點。ACM Trans. Math. Softw.,35(4)。doi:10.1145/1462173.1462176
  • Bischof1987C Bischof 和 C Van Loan,「豪斯霍爾德矩陣乘積的 WY 表示法」,SIAM J Sci Stat Comput 8 (1987),s2-s13。 doi:10.1137/0908009
  • Schreiber1989R Schreiber 和 C Van Loan,「豪斯霍爾德轉換乘積的儲存效率 WY 表示法」,SIAM J Sci Stat Comput 10 (1989),53-57。 doi:10.1137/0910005
  • ACM933福斯特, L. V. 和戴維斯, T. A. (2013)。演算法 933:使用 SuitesparseQR 可靠地計算數值秩、零空間基底、偽逆解和基本解。ACM Trans. Math. Softw.,40(1)。doi:10.1145/2513109.2513116
  • Bunch1977J R Bunch 和 L Kaufman,一些計算慣量和求解對稱線性系統的穩定方法,計算數學 31:137 (1977),163-179。 網址
  • issue8859問題 8859,「修正最小平方」,https://github.com/JuliaLang/julia/pull/8859
  • B96Åke Björck,〈最少平方問題的數值方法〉,美國費城 SIAM 出版社,1996 年,〈應用數學其他標題〉,第 51 卷。doi:10.1137/1.9781611971484
  • S84G. W. Stewart,〈秩簡併〉,美國科學與統計計算 SIAM 期刊,第 5(2) 卷,1984 年,403-413 頁。doi:10.1137/0905030
  • KY88Konstantinos Konstantinides 和 Kung Yao,〈矩陣秩判定中有效奇異值的統計分析〉,美國電機電子工程師學會聲學、語音與訊號處理期刊,第 36(5) 卷,1988 年,757-763 頁。doi:10.1109/29.1585
  • H05Nicholas J. Higham,〈矩陣指數的平方與縮放方法再探〉,美國科學與統計計算 SIAM 期刊,第 26(4) 卷,2005 年,1179-1193 頁。doi:10.1137/090768539
  • AH12Awad H. Al-Mohy 和 Nicholas J. Higham,〈矩陣對數的改良反向縮放與平方演算法〉,美國科學計算 SIAM 期刊,第 34(4) 卷,2012 年,C153-C169 頁。doi:10.1137/110852553
  • AHR13Awad H. Al-Mohy、Nicholas J. Higham 和 Samuel D. Relton,〈計算矩陣對數的 Fréchet 導數並估計條件數〉,美國科學計算 SIAM 期刊,第 35(4) 卷,2013 年,C394-C410 頁。doi:10.1137/120885991
  • BH83Åke Björck 和 Sven Hammarling,〈矩陣平方根的 Schur 方法〉,線性代數及其應用,第 52-53 卷,1983 年,127-140 頁。doi:10.1016/0024-3795(83)80010-X
  • H87Nicholas J. Higham,〈計算實矩陣的實平方根〉,線性代數及其應用,第 88-89 卷,1987 年,405-430 頁。doi:10.1016/0024-3795(87)90118-2
  • AH16_1Mary Aprahamian 和 Nicholas J. Higham,〈矩陣反三角函數與反雙曲函數:理論與演算法〉,MIMS 電子預印本:2016.4。https://doi.org/10.1137/16M1057577
  • AH16_2Mary Aprahamian 和 Nicholas J. Higham,"矩陣反三角函數和反雙曲函數:理論與演算法",MIMS 電子預印本:2016.4。 https://doi.org/10.1137/16M1057577
  • AH16_3Mary Aprahamian 和 Nicholas J. Higham,"矩陣反三角函數和反雙曲函數:理論與演算法",MIMS 電子預印本:2016.4。 https://doi.org/10.1137/16M1057577
  • AH16_4Mary Aprahamian 和 Nicholas J. Higham,"矩陣反三角函數和反雙曲函數:理論與演算法",MIMS 電子預印本:2016.4。 https://doi.org/10.1137/16M1057577
  • AH16_5Mary Aprahamian 和 Nicholas J. Higham,"矩陣反三角函數和反雙曲函數:理論與演算法",MIMS 電子預印本:2016.4。 https://doi.org/10.1137/16M1057577
  • AH16_6Mary Aprahamian 和 Nicholas J. Higham,"矩陣反三角函數和反雙曲函數:理論與演算法",MIMS 電子預印本:2016.4。 https://doi.org/10.1137/16M1057577