線性代數
除了 (以及作為其中一部分) 支援多維陣列之外,Julia 還提供許多常見且有用的線性代數運算的原生實作,這些運算可以使用 using LinearAlgebra
載入。基本運算,例如 tr
、det
和 inv
都獲得支援
julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
1 2 3
4 1 6
7 8 1
julia> tr(A)
3
julia> det(A)
104.0
julia> inv(A)
3×3 Matrix{Float64}:
-0.451923 0.211538 0.0865385
0.365385 -0.192308 0.0576923
0.240385 0.0576923 -0.0673077
以及其他有用的運算,例如尋找特徵值或特徵向量
julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
-4.0 -17.0
2.0 2.0
julia> eigvals(A)
2-element Vector{ComplexF64}:
-1.0 - 5.0im
-1.0 + 5.0im
julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
0.945905-0.0im 0.945905+0.0im
-0.166924+0.278207im -0.166924-0.278207im
此外,Julia 提供許多 分解,可透過將矩陣預先分解成更適合問題(基於效能或記憶體原因)的格式,來加速線性求解或矩陣指數運算等問題。有關更多資訊,請參閱 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 | MV | inv 、sqrt 、exp | |||
Hermitian | MV | inv 、sqrt 、exp | |||
UpperTriangular | MV | MV | inv 、det 、logdet | ||
UnitUpperTriangular | MV | MV | inv 、det 、logdet | ||
LowerTriangular | MV | MV | inv 、det 、logdet | ||
UnitLowerTriangular | MV | MV | inv 、det 、logdet | ||
UpperHessenberg | MM | inv ,det | |||
SymTridiagonal | M | M | MS | MV | eigmax ,eigmin |
Tridiagonal | M | M | MS | MV | |
Bidiagonal | M | M | MS | MV | |
Diagonal | M | M | MV | MV | inv ,det ,logdet ,/ |
UniformScaling | M | M | MVS | MVS | / |
圖例
關鍵 | 說明 |
---|---|
M(矩陣) | 提供矩陣-矩陣運算的最佳化方法 |
V(向量) | 提供矩陣-向量運算的最佳化方法 |
S(純量) | 提供矩陣-純量運算的最佳化方法 |
矩陣分解
矩陣類型 | LAPACK | eigen | eigvals | eigvecs | svd | svdvals |
---|---|---|---|---|---|---|
Symmetric | SY | ARI | ||||
Hermitian | HE | ARI | ||||
UpperTriangular | TR | A | A | A | ||
UnitUpperTriangular | TR | A | A | A | ||
LowerTriangular | TR | A | A | A | ||
UnitLowerTriangular | TR | A | A | A | ||
SymTridiagonal | ST | A | ARI | AV | ||
Tridiagonal | GT | |||||
Bidiagonal | BD | A | A | |||
Diagonal | DI | A |
圖例
關鍵 | 說明 | 範例 |
---|---|---|
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+I
和 A-I
,這意味著 A
必須是方陣。與單位算子 I
相乘是一個空操作(除了檢查縮放因子是否為一之外),因此幾乎沒有開銷。
要查看 UniformScaling
算子在實際中的應用
julia> U = UniformScaling(2);
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> a + U
2×2 Matrix{Int64}:
3 2
3 6
julia> a * U
2×2 Matrix{Int64}:
2 4
6 8
julia> [a U]
2×4 Matrix{Int64}:
1 2 2 0
3 4 0 2
julia> b = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> b - U
ERROR: DimensionMismatch: matrix is not square: dimensions are (2, 3)
Stacktrace:
[...]
如果你需要為同一個 A
和不同的 μ
求解許多形式為 (A+μI)x = b
的系統,那麼首先通過 hessenberg
函數計算 A
的 Hessenberg 分解 F
可能是有益的。給定 F
,Julia 使用了一個有效的演算法來計算 (F+μ*I) \ b
(等於 (A+μ*I)x \ b
)和相關運算,例如行列式。
矩陣分解
矩陣分解(又稱矩陣分解) 計算一個矩陣分解為一個矩陣乘積,並且是(數值)線性代數中的核心概念之一。
下表總結了在 Julia 中已實現的矩陣分解類型。它們相關方法的詳細資訊可以在線性代數文件中的 標準函數 部分中找到。
類型 | 說明 |
---|---|
BunchKaufman | Bunch-Kaufman 分解 |
Cholesky | Cholesky 分解 |
CholeskyPivoted | 樞紐 Cholesky 分解 |
LDLt | LDL(T) 分解 |
LU | LU 分解 |
QR | QR 分解 |
QRCompactWY | QR 分解的緊湊 WY 形式 |
QRPivoted | 樞紐 QR 分解 |
LQ | transpose(A) 的 QR 分解 |
Hessenberg | Hessenberg 分解 |
Eigen | 譜分解 |
GeneralizedEigen | 廣義譜分解 |
SVD | 奇異值分解 |
GeneralizedSVD | 廣義 SVD |
Schur | Schur 分解 |
GeneralizedSchur | 廣義 Schur 分解 |
Factorization
物件的伴隨和轉置會分別以 AdjointFactorization
和 TransposeFactorization
物件包裝起來。一般而言,實數 Factorization
的轉置會包裝為 AdjointFactorization
。
正交矩陣 (AbstractQ
)
有些矩陣分解會產生正交/酉「矩陣」因子。這些分解包括從呼叫 qr
獲得的 QR 相關分解,例如 QR
、QRCompactWY
和 QRPivoted
,從呼叫 hessenberg
獲得的 Hessenberg 分解,以及從 lq
獲得的 LQ 分解。雖然這些正交/酉因子允許矩陣表示,但它們的內部表示基於效能和記憶體考量而有所不同。因此,應該將它們視為由矩陣支援的函式式線性算子。特別是,例如讀取其矩陣表示的某一欄,需要執行「矩陣」-向量乘法程式碼,而不是僅從記憶體讀取資料 (可能會以結構零填滿向量的部分)。另一個與其他非三角矩陣類型的明顯區別在於,底層乘法程式碼允許在乘法過程中進行原地修改。此外,特定 AbstractQ
子類型的物件,例如透過 qr
、hessenberg
和 lq
建立的物件,可以根據情況表現得像方陣或矩形矩陣
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)
使用多重演算法的矩陣除法。對於輸入矩陣 A
和 B
,結果 X
為 A*X == B
,其中 A
為方陣。使用的求解器取決於 A
的結構。如果 A
是上或下三角形(或對角線),則不需要 A
的分解,並且使用前向或後向替換來求解系統。對於非三角形方陣,則使用 LU 分解。
對於矩形 A
,結果是基於 R 因數對 A
進行樞紐 QR 分解和秩估計所計算出的最小範數最小平方解。
當 A
是稀疏時,會使用類似的多重演算法。對於不定矩陣,LDLt
分解在數值分解期間不會使用樞紐,因此即使對於可逆矩陣,程序也可能會失敗。
範例
julia> A = [1 0; 1 -2]; B = [32; -4];
julia> X = A \ B
2-element Vector{Float64}:
32.0
18.0
julia> A * X == B
true
Base.:/
— 方法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)
計算兩個向量 x
和 y
的廣義點積 dot(x, A*y)
,而不儲存 A*y
的中間結果。至於兩個參數的 dot(_,_)
,此動作會遞迴進行。此外,對於複數向量,第一個向量會共軛。
三個參數的 dot
至少需要 Julia 1.4。
範例
julia> dot([1; 1], [1 2; 3 4], [2; 3])
26
julia> dot(1:5, reshape(1:25, 5, 5), 2:6)
4850
julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6)
true
LinearAlgebra.cross
— 函數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
。如果 x
和 y
具有相同的軸,則等同於 y .+= x .* a
。
範例
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpy!(2, x, y)
3-element Vector{Int64}:
6
9
12
LinearAlgebra.axpby!
— 函數axpby!(α, x::AbstractArray, β, y::AbstractArray)
以 x * α + y * β
覆寫 y
並傳回 y
。如果 x
和 y
具有相同的軸,則等同於 y .= x .* a .+ y .* β
。
範例
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
10
14
18
LinearAlgebra.rotate!
— 函數rotate!(x, y, c, s)
以 c*x + s*y
覆寫 x
,並以 -conj(s)*x + c*y
覆寫 y
。傳回 x
和 y
。
rotate!
至少需要 Julia 1.5。
LinearAlgebra.reflect!
— 函數reflect!(x, y, c, s)
以 c*x + s*y
覆寫 x
,並以 conj(s)*x - c*y
覆寫 y
。傳回 x
和 y
。
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 ) |
三角 | 三角 |
Diagonal | Diagonal |
Bidiagonal | Bidiagonal |
Tridiagonal | LU(請參閱 lu ) |
對稱實三對角 | LDLt(請參閱 ldlt ) |
一般方陣 | LU(請參閱 lu ) |
一般非方陣 | QR(請參閱 qr ) |
如果對厄米正定矩陣呼叫 factorize
,例如,則 factorize
會傳回 Cholesky 因式分解。
範例
julia> A = Array(Bidiagonal(fill(1.0, (5, 5)), :U))
5×5 Matrix{Float64}:
1.0 1.0 0.0 0.0 0.0
0.0 1.0 1.0 0.0 0.0
0.0 0.0 1.0 1.0 0.0
0.0 0.0 0.0 1.0 1.0
0.0 0.0 0.0 0.0 1.0
julia> factorize(A) # factorize 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
以取得惰性單位矩陣 I
,diagm
以建立密集矩陣,以及 diag
以萃取對角線元素。
範例
julia> d = Diagonal([1, 10, 100])
3×3 Diagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅
⋅ 10 ⋅
⋅ ⋅ 100
julia> diagm([7, 13])
2×2 Matrix{Int64}:
7 0
0 13
julia> ans + I
2×2 Matrix{Int64}:
8 0
0 14
julia> I(2)
2×2 Diagonal{Bool, Vector{Bool}}:
1 ⋅
⋅ 1
請注意,一欄矩陣並非被視為向量,而是呼叫方法 Diagonal(A::AbstractMatrix)
,該方法會萃取 1 元素 diag(A)
julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) with eltype Float64:
7.0
13.0
julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
7.0
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(_)
)將其轉換為常規矩陣。dl
和 du
的長度必須比 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)
建構矩陣 A
的 LowerTriangular
檢視。
範例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 5.0 ⋅
7.0 8.0 9.0
LinearAlgebra.UpperTriangular
— 類型UpperTriangular(A::AbstractMatrix)
建構矩陣 A
的 UpperTriangular
檢視。
範例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 5.0 6.0
⋅ ⋅ 9.0
LinearAlgebra.UnitLowerTriangular
— 類型UnitLowerTriangular(A::AbstractMatrix)
建構矩陣 A
的 UnitLowerTriangular
檢視。此檢視在對角線上具有 A
的 eltype
的 oneunit
。
範例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 1.0 ⋅
7.0 8.0 1.0
LinearAlgebra.UnitUpperTriangular
— 類型UnitUpperTriangular(A::AbstractMatrix)
建構矩陣 A
的 UnitUpperTriangular
檢視。此檢視在對角線上具有 A
的 eltype
的 oneunit
。
範例
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 1.0 6.0
⋅ ⋅ 1.0
LinearAlgebra.UpperHessenberg
— 類型UpperHessenberg(A::AbstractMatrix)
建構矩陣 A
的 UpperHessenberg
檢視。忽略 A
低於第一個次對角線的項目。
此類型新增於 Julia 1.3。
已為 H \ b
、det(H)
等實作有效率的演算法。
另請參閱 hessenberg
函數,可將任何矩陣分解為類似的上 Hessenberg 矩陣。
如果 F::Hessenberg
是分解物件,則可使用 F.Q
存取酉矩陣,並使用 F.H
存取 Hessenberg 矩陣。擷取 Q
時,產生的類型為 HessenbergQ
物件,且可以使用 convert(Array, _)
(或簡寫為 Array(_)
) 轉換為一般矩陣。
反覆執行分解會產生因子 F.Q
和 F.H
。
範例
julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
1 2 3 4
5 6 7 8
⋅ 10 11 12
⋅ ⋅ 15 16
LinearAlgebra.UniformScaling
— 類型UniformScaling{T<:Number}
泛型大小的均勻縮放算子,定義為一個標量乘以單位算子 λ*I
。儘管沒有明確的 size
,但在許多情況下,它的作用類似於矩陣,並包含對某些索引的支持。另請參閱 I
。
從 Julia 1.6 開始,可以使用範圍進行索引。
範例
julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> J*A
2×2 Matrix{Float64}:
2.0 4.0
6.0 8.0
julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
LinearAlgebra.I
— 常數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> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
1 ⋅ ⋅
⋅ 1 ⋅
⋅ ⋅ 1
julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
0.7 ⋅ ⋅
⋅ 0.7 ⋅
⋅ ⋅ 0.7
LinearAlgebra.Factorization
— 型別LinearAlgebra.LU
— 型別LU <: Factorization
方陣 A
的 LU
分解的矩陣分解型別。這是 lu
的回傳型別,對應的矩陣分解函數。
分解 F::LU
的個別組成部分可透過 getproperty
存取
組成部分 | 說明 |
---|---|
F.L | LU 的 L (單位下三角)部分 |
F.U | LU 的 U (上三角)部分 |
F.p | (右)排列 Vector |
F.P | (右)排列 Matrix |
迭代分解會產生組成部分 F.L
、F.U
和 F.p
。
範例
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # 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 分解。
對於具有實數或複數元素類型的稀疏 A
,F
的回傳類型為 UmfpackLU{Tv, Ti}
,其中 Tv
分別為 Float64
或 ComplexF64
,而 Ti
為整數類型 (Int32
或 Int64
).
當 check = true
時,如果分解失敗,則會擲回錯誤。當 check = false
時,檢查分解有效性的責任(透過 issuccess
)落在使用者身上。
排列 q
可以是排列向量或 nothing
。如果未提供排列向量或 q
為 nothing
,則使用 UMFPACK 的預設值。如果排列不是以 0 為基礎,則會建立一個以 0 為基礎的副本。
control
向量預設為套件的 UMFPACK 預設組態,但可以透過傳遞長度為 UMFPACK_CONTROL
的向量來變更。請參閱 UMFPACK 手冊以取得可能的組態。對應的變數命名為 JL_UMFPACK_
,因為 Julia 使用以 1 為基礎的索引。
分解 F
的個別組成部分可透過索引存取
組成部分 | 說明 |
---|---|
L | LU 的 L (下三角)部分 |
U | LU 的 U (上三角)部分 |
p | 右排列 Vector |
q | 左排列 Vector |
Rs | 縮放因子的 Vector |
: | (L,U,p,q,Rs) 組成部分 |
F
與 A
之間的關係為
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
進一步支援下列函數
另請參閱 lu!
lu(A::AbstractSparseMatrixCSC)
使用 SuiteSparse 的一部分 UMFPACK[ACM832] 函式庫。由於此函式庫僅支援具有 Float64
或 ComplexF64
元素的稀疏矩陣,lu
會將 A
轉換為適當的 SparseMatrixCSC{Float64}
或 SparseMatrixCSC{ComplexF64}
類型的副本。
lu(A, pivot = RowMaximum(); check = true) -> F::LU
計算 A
的 LU 分解。
當 check = true
時,如果分解失敗,則會擲回錯誤。當 check = false
時,檢查分解有效性的責任(透過 issuccess
)落在使用者身上。
在大多數情況下,如果 A
是 AbstractMatrix{T}
的子類型 S
,其元素類型 T
支援 +
、-
、*
和 /
,則回傳類型為 LU{T,S{T}}
。
一般而言,LU 分解會涉及矩陣列的排列(對應於下方說明的 F.p
輸出),稱為「主元選擇」(因為它對應於選擇包含「主元」的列,即 F.U
的對角線輸入)。下列主元選擇策略之一可透過選擇性的 pivot
參數選擇
RowMaximum()
(預設):標準主元選擇策略;主元對應於剩餘待分解列中絕對值最大的元素。此主元選擇策略要求元素類型也支援abs
和<
。(這通常是浮點矩陣唯一數值穩定的選項。)RowNonZero()
:主元對應於剩餘待分解列中的第一個非零元素。(這對應於手動計算中的典型選擇,也適用於支援iszero
但不支援abs
或<
的更通用的代數數字類型。)NoPivot()
:關閉主元選擇(如果遇到零輸入,可能會失敗)。
分解 F
的個別組成部分可透過 getproperty
存取
組成部分 | 說明 |
---|---|
F.L | LU 的 L (下三角)部分 |
F.U | LU 的 U (上三角)部分 |
F.p | (右)排列 Vector |
F.P | (右)排列 Matrix |
迭代分解會產生組成部分 F.L
、F.U
和 F.p
。
F
和 A
之間的關係為
F.L*F.U == A[F.p, :]
F
進一步支援下列函數
支援函數 | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
範例
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
的矩陣具有相同的非零模式,否則會擲回錯誤。如果 A
和 F
的大小不同,所有向量都將依此調整大小。
當 check = true
時,如果分解失敗,則會擲回錯誤。當 check = false
時,檢查分解有效性的責任(透過 issuccess
)落在使用者身上。
排列 q
可以是排列向量或 nothing
。如果未提供排列向量或 q
為 nothing
,則使用 UMFPACK 的預設值。如果排列不是以零為基準,則會建立一個以零為基準的副本。
另請參閱 lu
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
使用 UMFPACK 函式庫,它是 SuiteSparse 的一部分。由於此函式庫僅支援元素為 Float64
或 ComplexF64
的稀疏矩陣,因此 lu!
會自動將型別轉換為 LU 分解設定的型別或 SparseMatrixCSC{ComplexF64}
(視情況而定)。
UmfpackLU
的 lu!
至少需要 Julia 1.5。
範例
julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);
julia> F = lu(A);
julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);
julia> lu!(F, B);
julia> F \ ones(2)
2-element Vector{Float64}:
0.0
1.0
lu!(A, pivot = RowMaximum(); check = true) -> 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.L
和 F.U
取得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'
。
Cholesky
物件可以使用下列函式: size
、\
、inv
、det
、logdet
和 isposdef
。
迭代分解會產生元件 L
和 U
。
範例
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted
— 類型CholeskyPivoted
稠密對稱/厄米特正半定矩陣 A
的樞紐 Cholesky 分解的矩陣分解類型。這是 cholesky(_, ::RowMaximum)
的回傳類型,也就是對應的矩陣分解函式。
三角形的 Cholesky 因子可以透過分解 F::CholeskyPivoted
以及 F.L
和 F.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
、\
、inv
、det
和 rank
。
迭代分解會產生元件 L
和 U
。
範例
julia> X = [1.0, 2.0, 3.0, 4.0];
julia> A = X * X';
julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U 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
可以是 Symmetric
或 Hermitian
AbstractMatrix
,或是一個完全對稱或 Hermitian 的 AbstractMatrix
。
三角形 Cholesky 因子可以透過分解 F
經由 F.L
和 F.U
取得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'
。
Cholesky
物件可以使用下列函式: size
、\
、inv
、det
、logdet
和 isposdef
。
如果您有一個矩陣 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
可以是 Symmetric
或 Hermitian
AbstractMatrix
,或是一個完全對稱或 Hermitian 的 AbstractMatrix
。
三角形 Cholesky 因子可以透過分解 F
經由 F.L
和 F.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
、\
、inv
、det
和 rank
。
參數 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
必須是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/Hermitian
檢視。請注意,即使 A
沒有類型標籤,它仍然必須是對稱或 Hermitian。如果未提供 perm
,則使用減少填充的排列。F = cholesky(A)
最常使用於使用 F\b
解決方程式組,但方法 diag
、det
和 logdet
也定義為 F
。您也可以使用 F.L
從 F
中提取個別因子。但是,由於預設開啟樞紐,因此分解在內部表示為 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'$) 分解,重複使用符號分解 F
。A
必須是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/ 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
取得給定 A
的 LDLt
或 LLt
分解 F
的 A + C*C'
的 LDLt
分解。
傳回的因子永遠是 LDLt
分解。
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
取得給定 A
的 LDLt
或 LLt
分解 F
的 A + C*C'
的 LDLt
分解。
傳回的因子永遠是 LDLt
分解。
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)
將 A
的 LDLt
或 LLt
分解 F
更新為 A + C*C'
的分解。
LLt
分解會轉換為 LDLt
。
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)
將 A
的 LDLt
或 LLt
因數分解 F
更新為 A - C*C'
的因數分解。
LLt
分解會轉換為 LDLt
。
LinearAlgebra.LDLt
— 類型LDLt <: Factorization
實對稱三對角矩陣 S
的 LDLt
因數分解的矩陣因數分解類型,使得 S = L*Diagonal(d)*L'
,其中 L
是 UnitLowerTriangular
矩陣,而 d
是向量。LDLt
因數分解 F = ldlt(S)
的主要用途是使用 F\b
來求解線性方程組 Sx = b
。這是 ldlt
(對應的矩陣因數分解函數)的傳回類型。
可以透過 getproperty
存取因數分解 F::LDLt
的個別組成部分
組成部分 | 說明 |
---|---|
F.L | LDLt 的 L (單位下三角)部分 |
F.D | LDLt 的 D (對角線)部分 |
F.Lt | LDLt 的 Lt (單位上三角)部分 |
F.d | D 的對角線值,表示為 Vector |
範例
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
L factor:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
D factor:
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldlt
— 函數ldlt(S::SymTridiagonal) -> LDLt
計算實對稱三對角矩陣 S
的 LDLt
(亦即 $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
必須是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/Hermitian
檢視。請注意,即使 A
沒有類型標籤,它仍然必須是對稱或 Hermitian。使用減少填充的排列。F = ldlt(A)
最常使用於使用 F\b
解決方程式組 A*x = b
。傳回的因式分解物件 F
也支援方法 diag
、det
、logdet
和 inv
。你可以使用 F.L
從 F
中擷取個別因子。但是,由於預設會進行樞紐化,因式分解在內部表示為 A == P'*L*D*L'*P
,其中排列矩陣為 P
;僅使用 L
而未考量 P
會得到不正確的答案。若要納入排列的影響,通常較好擷取「組合」因子,例如 PtL = F.PtL
(等於 P'*L
)和 LtP = F.UP
(等於 L'*P
)。支援因子的完整清單為 :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
。
當 check = true
時,如果分解失敗,則會擲回錯誤。當 check = false
時,檢查分解有效性的責任(透過 issuccess
)落在使用者身上。
設定選用的 shift
關鍵字參數會計算 A+shift*I
而不是 A
的分解。如果提供了 perm
參數,它應該是 1:size(A,1)
的排列,提供要使用的順序(而不是 CHOLMOD 的預設 AMD 順序)。
此方法使用 SuiteSparse 中的 CHOLMOD[ACM887][DavisHager2009] 函式庫。CHOLMOD 僅支援雙倍或複數雙倍元素類型。非這些元素類型的輸入矩陣將適當地轉換為 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'$ 因式分解,重新使用符號因式分解 F
。A
必須是 SparseMatrixCSC
或 SparseMatrixCSC
的 Symmetric
/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).\]
反覆分解會產生組成部分 Q
和 R
。
物件有兩個欄位
factors
是m
×n
矩陣。上三角部分包含 $R$ 的元素,也就是
R = triu(F.factors)
,其中F
是QR
物件。次對角線部分包含以封裝格式儲存的反射器 $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)$ 給定。
反覆分解會產生組成部分 Q
和 R
。
物件有兩個欄位
factors
,如同QR
類型,是一個m
×n
矩陣。上三角部分包含 $R$ 的元素,也就是
R = triu(F.factors)
,其中F
是QR
物件。次對角線部分包含以封裝格式儲存的反射器 $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).\]
反覆分解會產生組成部分 Q
、R
和 p
。
物件有三個欄位
factors
是m
×n
矩陣。上三角部分包含 $R$ 的元素,也就是
R = triu(F.factors)
,其中F
是QR
物件。次對角線部分包含以封裝格式儲存的反射器 $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
計算稀疏矩陣 A
的 QR
分解。使用填滿減少的列和欄排列,使得 F.R = F.Q'*A[F.prow,F.pcol]
。此類型的主要應用是使用 \
解決最小平方或未定問題。函數呼叫 C 函式庫 SPQR[ACM933]。
qr(A::SparseMatrixCSC)
使用 SPQR 函式庫,它是 SuiteSparse 的一部分。由於此函式庫僅支援元素為 Float64
或 ComplexF64
的稀疏矩陣,因此在 Julia v1.4 中,qr
會將 A
轉換為適當類型的複製,例如 SparseMatrixCSC{Float64}
或 SparseMatrixCSC{ComplexF64}
。
範例
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
-1.41421 ⋅
⋅ -1.41421
Row permutation:
4-element Vector{Int64}:
1
3
4
2
Column permutation:
2-element Vector{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
計算矩陣 A
的 QR 分解:正交(如果 A
是複數值)矩陣 Q
,以及上三角矩陣 R
,使得
\[A = Q R\]
傳回的物件 F
以封裝格式儲存分解
如果
pivot == ColumnNorm()
,則F
是QRPivoted
物件,否則,如果
A
的元素類型是 BLAS 類型(Float32
、Float64
、ComplexF32
或ComplexF64
),則F
是QRCompactWY
物件,否則
F
是QR
物件。
分解 F
的個別元件可透過屬性存取器擷取
反覆分解會產生元件 Q
、R
,以及如果存在 p
。
下列函式可供 QR
物件使用:inv
、size
和 \
。當 A
是矩形時,\
會傳回最小平方解,如果解不唯一,則傳回範數最小的解。當 A
不是滿秩時,需要使用(列)樞紐分解才能取得最小範數解。
允許相對於全/方正或非全/方正的 Q
進行乘法,即同時支援 F.Q*F.R
和 F.Q*A
。Q
矩陣可以使用 Matrix
轉換為正規矩陣。此操作會傳回「瘦」的 Q 因子,即如果 A
為 m
×n
,且 m>=n
,則 Matrix(F.Q)
會產生一個 m
×n
矩陣,其欄位為正交正規。若要擷取「全」的 Q 因子,一個 m
×m
正交矩陣,請使用 F.Q*I
或 collect(F.Q)
。如果 m<=n
,則 Matrix(F.Q)
會產生一個 m
×m
正交矩陣。
當 pivot == NoPivot()
且 A isa StridedMatrix{<:BlasFloat}
時,可以使用關鍵字參數 blocksize :: Integer
指定 QR 分解的區塊大小。當 blocksize > minimum(size(A))
時,會忽略它。請參閱 QRCompactWY
。
blocksize
關鍵字參數需要 Julia 1.4 或更新版本。
範例
julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
3.0 -6.0
4.0 -8.0
0.0 1.0
julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 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 基本反射器乘積的記憶體儲存需求,因此 Q
和 R
矩陣可以緊湊地儲存,而不是兩個獨立的稠密矩陣。
LinearAlgebra.qr!
— 函式qr!(A, pivot = NoPivot(); blocksize)
當 A
是 AbstractMatrix
的子型別時,qr!
與 qr
相同,但透過覆寫輸入 A
而不是建立副本來節省空間。如果分解產生無法由 A
的元素型別表示的數字,例如對於整數型別,則會擲回 InexactError
例外。
blocksize
關鍵字參數需要 Julia 1.4 或更新版本。
範例
julia> a = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> qr!(a)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 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
矩陣 A
的 LQ
分解的矩陣分解型別。LQ
分解是 transpose(A)
的 QR
分解。這是 lq
的傳回型別,它是對應的矩陣分解函式。
如果 S::LQ
是分解物件,則可透過 S.L
取得下三角形元件,透過 S.Q
取得正交/酉元件,使得 A ≈ S.L*S.Q
。
反覆分解會產生元件 S.L
和 S.Q
。
範例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 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.L
和 S.Q
。
LQ 分解是 transpose(A)
的 QR 分解,且可用於計算欠定方程組的最小範數解 lq(A) \ b
(A
的欄位多於列,但具有滿秩)。
範例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 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!
— 函數LinearAlgebra.BunchKaufman
— 類型BunchKaufman <: Factorization
對稱或 Hermitian 矩陣 A
的 Bunch-Kaufman 分解的矩陣分解類型,表示為 P'UDU'P
或 P'LDL'P
,視 A
中儲存的是上三角形(預設)還是下三角形而定。如果 A
是複數對稱,則 U'
和 L'
表示未共軛轉置,即分別為 transpose(U)
和 transpose(L)
。這是 bunchkaufman
的回傳類型,對應的矩陣分解函數。
如果 S::BunchKaufman
是分解物件,則可透過 S.D
、S.U
或 S.L
(視 S.uplo
和 S.p
而定)取得元件。
重複分解會產生組件 S.D
、S.U
或 S.L
,視 S.uplo
和 S.p
而定。
範例
julia> A = [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'*P
或 P'*L*D*L'*P
,視儲存在 A
中的三角形而定,並傳回 BunchKaufman
物件。請注意,如果 A
是複數對稱,則 U'
和 L'
表示未共軛的轉置,即 transpose(U)
和 transpose(L)
。
重複分解會產生組件 S.D
、S.U
或 S.L
,視 S.uplo
和 S.p
而定。
如果 rook
為 true
,則會使用城堡換位。如果 rook
為 false,則不會使用城堡換位。
當 check = true
時,如果分解失敗,則會擲回錯誤。當 check = false
時,檢查分解有效性的責任(透過 issuccess
)落在使用者身上。
下列函數可供 BunchKaufman
物件使用:size
、\
、inv
、issymmetric
、ishermitian
、getindex
。
範例
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.values
和 F.vectors
。
範例
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen
— 類型GeneralizedEigen <: Factorization
A
和 B
的廣義特徵值/特徵分解的矩陣分解類型。這是 eigen
的回傳類型,當呼叫兩個矩陣引數時,對應的矩陣分解函數。
如果 F::GeneralizedEigen
是分解物件,特徵值可透過 F.values
取得,特徵向量則為矩陣 F.vectors
的欄位。(第 k
個特徵向量可從切片 F.vectors[:, k]
取得。)
重複分解會產生組件 F.values
和 F.vectors
。
範例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B)
GeneralizedEigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
vectors:
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvals
— 函數eigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
傳回 A
的特徵值。
對於一般的非對稱矩陣,可以在特徵值計算前指定矩陣的平衡方式。permute
、scale
和 sortby
關鍵字與 eigen
相同。
範例
julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
1 0
0 4
julia> eigvals(diag_matrix)
2-element Vector{Float64}:
1.0
4.0
對於純量輸入,eigvals
會傳回一個純量。
範例
julia> eigvals(-2)
-2
eigvals(A, B) -> values
計算 A
和 B
的廣義特徵值。
範例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> eigvals(A,B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
傳回 A
的特徵值。可以透過指定包含已排序特徵值索引的 UnitRange
irange
來計算特徵值子集,例如第 2 到第 8 個特徵值。
範例
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, 2:2)
1-element Vector{Float64}:
0.9999999999999996
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
傳回 A
的特徵值。可以透過指定特徵值下界和上界的 vl
和 vu
來計算特徵值子集。
範例
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
1.0000000000000009
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
LinearAlgebra.eigvals!
— 函數eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values
與 eigvals
相同,但透過覆寫輸入 A
來節省空間,而不是建立副本。permute
、scale
和 sortby
關鍵字與 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
)來節省空間,而不是建立副本。
輸入矩陣 A
和 B
在呼叫 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]
取得。)permute
、scale
和 sortby
關鍵字與 eigen
相同。
範例
julia> eigvecs([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
eigvecs(A, B) -> Matrix
傳回矩陣 M
,其欄位是 A
和 B
的廣義特徵向量。(第 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.values
和 F.vectors
。
下列函式可供 Eigen
物件使用:inv
、det
和 isposdef
。
對於一般非對稱矩陣,可以在計算特徵向量之前指定矩陣的平衡方式。選項 permute=true
會將矩陣排列成更接近上三角形,而 scale=true
會根據矩陣的對角線元素縮放矩陣,以使列和行的範數更相等。預設值對這兩個選項都是 true
。
預設情況下,特徵值和特徵向量會根據 (real(λ),imag(λ))
字典順序排序。不同的比較函式 by(λ)
可以傳遞給 sortby
,或者您可以傳遞 sortby=nothing
以任意順序保留特徵值。某些特殊矩陣類型(例如 Diagonal
或 SymTridiagonal
)可能會實作自己的排序慣例,而不接受 sortby
關鍵字。
範例
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen
計算 A
和 B
的廣義特徵值分解,傳回一個 GeneralizedEigen
因式分解物件 F
,其中包含 F.values
中的廣義特徵值和矩陣 F.vectors
中列中的廣義特徵向量。這對應於求解形式為 Ax = λBx
的廣義特徵值問題,其中 A, B
是矩陣,x
是特徵向量,而 λ
是特徵值。(第 k
個廣義特徵向量可以從切片 F.vectors[:, k]
中取得。)
重複分解會產生組件 F.values
和 F.vectors
。
預設情況下,特徵值和特徵向量會根據 (real(λ),imag(λ))
字典順序排序。不同的比較函式 by(λ)
可以傳遞給 sortby
,或者您可以傳遞 sortby=nothing
以任意順序保留特徵值。
範例
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B);
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # 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.values
和 F.vectors
。
下列函式可供 Eigen
物件使用:inv
、det
和 isposdef
。
UnitRange
irange
指定要搜尋的已排序特徵值的索引。
如果 irange
不是 1:n
,其中 n
是 A
的維度,則傳回的因式分解將是截斷因式分解。
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen
計算 A
的特徵值分解,傳回一個 Eigen
因式分解物件 F
,其中包含 F.values
中的特徵值和矩陣 F.vectors
中列中的特徵向量。(第 k
個特徵向量可以從切片 F.vectors[:, k]
中取得。)
重複分解會產生組件 F.values
和 F.vectors
。
下列函式可供 Eigen
物件使用:inv
、det
和 isposdef
。
vl
是要搜尋的特徵值視窗的下限,而 vu
是上限。
如果 [vl
, vu
] 不包含 A
的所有特徵值,則回傳的分解會是一個截斷分解。
LinearAlgebra.eigen!
— 函式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)
轉換為常規矩陣。
如果 A
是 Hermitian
或實數-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.hessenberg!
— 函數hessenberg!(A) -> Hessenberg
hessenberg!
與 hessenberg
相同,但透過覆寫輸入 A
而不是建立副本來節省空間。
LinearAlgebra.Schur
— 類型Schur <: Factorization
矩陣 A
的 Schur 因式分解的矩陣因式分解類型。這是 schur(_)
的回傳類型,它是對應的矩陣因式分解函數。
如果 F::Schur
是因式分解物件,則可以透過 F.Schur
或 F.T
取得(準)三角形 Schur 因子,並透過 F.vectors
或 F.Z
取得正交/酉 Schur 向量,使得 A = F.vectors * F.Schur * F.vectors'
。A
的特徵值可以用 F.values
取得。
反覆運算分解會產生組成部分 F.T
、F.Z
和 F.values
。
範例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
eigenvalues:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # destructuring via iteration
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— 類型GeneralizedSchur <: Factorization
兩個矩陣 A
和 B
的廣義 Schur 因式分解的矩陣因式分解類型。這是 schur(_, _)
的回傳類型,它是對應的矩陣因式分解函數。
如果 F::GeneralizedSchur
是分解物件,則可透過 F.S
和 F.T
取得(準)三角 Schur 因子,透過 F.left
或 F.Q
取得左邊的酉矩陣/正交 Schur 向量,並可透過 F.right
或 F.Z
取得右邊的酉矩陣/正交 Schur 向量,使得 A=F.left*F.S*F.right'
且 B=F.left*F.T*F.right'
。可透過 F.α./F.β
取得 A
和 B
的廣義特徵值。
重複分解會產生組件 F.S
、F.T
、F.Q
、F.Z
、F.α
和 F.β
。
LinearAlgebra.schur
— 函數schur(A) -> F::Schur
計算矩陣 A
的 Schur 分解。可從 Schur
物件 F
透過 F.Schur
或 F.T
取得(準)三角 Schur 因子,並可透過 F.vectors
或 F.Z
取得正交/酉 Schur 向量,使得 A = F.vectors * F.Schur * F.vectors'
。可透過 F.values
取得 A
的特徵值。
對於實數 A
,Schur 分解為「準三角形」,表示它為上三角形,但對於任何共軛複數特徵值對,則為 2×2 對角區塊;這允許分解在存在複數特徵值時仍為純實數。若要從實數準三角形分解取得(複數)純上三角形 Schur 分解,可以使用 Schur{Complex}(schur(A))
。
反覆運算分解會產生組成部分 F.T
、F.Z
和 F.values
。
範例
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T 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
計算矩陣 A
和 B
的廣義 Schur (或 QZ) 分解。可從 Schur
物件 F
取得(準)三角 Schur 因數,方法為使用 F.S
和 F.T
,可使用 F.left
或 F.Q
取得左邊酉/正交 Schur 向量,並可使用 F.right
或 F.Z
取得右邊酉/正交 Schur 向量,使得 A=F.left*F.S*F.right'
和 B=F.left*F.T*F.right'
。可使用 F.α./F.β
取得 A
和 B
的廣義特徵值。
重複分解會產生組件 F.S
、F.T
、F.Q
、F.Z
、F.α
和 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
相同,但使用輸入矩陣 A
和 B
作為工作空間。
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.S
和 F.T
的領先對角線上,而左右正交/酉 Schur 向量也會重新排列,使得 (A, B) = F.Q*(F.S, F.T)*F.Z'
仍然成立,且仍可使用 F.α./F.β
取得 A
和 B
的廣義特徵值。
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
是分解物件,則 U
、S
、V
和 Vt
可透過 F.U
、F.S
、F.V
和 F.Vt
取得,使得 A = U * Diagonal(S) * Vt
。S
中的奇異值會以遞減順序排序。
反覆分解會產生組成部分 U
、S
和 V
。
範例
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> F = svd(A)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×4 Matrix{Float64}:
0.0 1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0
0.0 0.0 -1.0 0.0
singular values:
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
Vt factor:
4×5 Matrix{Float64}:
-0.0 0.0 1.0 -0.0 0.0
0.447214 0.0 0.0 0.0 0.894427
0.0 -1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
julia> F.U * Diagonal(F.S) * F.Vt
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> u, s, v = F; # destructuring via iteration
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD
— 類型GeneralizedSVD <: Factorization
兩個矩陣 A
和 B
的廣義奇異值分解 (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]
的有效數值秩。
重複分解會產生組件 U
、V
、Q
、D1
、D2
和 R0
。
F.D1
和 F.D2
的條目相關,如 LAPACK 文件中 廣義 SVD 和 xGGSVD3 常式(在 LAPACK 3.6.0 和更新版本中呼叫)所述。
範例
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
V factor:
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 0.0
Q factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
D1 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
D2 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
R0 factor:
2×2 Matrix{Float64}:
1.41421 0.0
0.0 -1.41421
julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
-0.0 1.0
1.0 0.0
LinearAlgebra.svd
— 函數svd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
計算 A
的奇異值分解 (SVD),並傳回一個 SVD
物件。
U
、S
、V
和 Vt
可以從分解 F
中透過 F.U
、F.S
、F.V
和 F.Vt
取得,使得 A = U * Diagonal(S) * Vt
。此演算法會產生 Vt
,因此提取 Vt
比 V
更有效率。S
中的奇異值會依遞減順序排序。
反覆分解會產生組成部分 U
、S
和 V
。
如果 full = false
(預設),會傳回「瘦」SVD。對於 $M \times N$ 矩陣 A
,在完整分解中 U
為 $M \times M$,而 V
為 $N \times N$,而在瘦分解中 U
為 $M \times K$,而 V
為 $N \times K$,其中 $K = \min(M,N)$ 為奇異值的數量。
如果 alg = DivideAndConquer()
,會使用分而治之演算法來計算 SVD。另一個(通常較慢但較精確)的選項是 alg = QRIteration()
。
alg
關鍵字引數需要 Julia 1.3 或更新版本。
範例
julia> A = rand(4,3);
julia> F = svd(A); # 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
計算 A
和 B
的廣義 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]
的有效數值秩。
重複分解會產生組件 U
、V
、Q
、D1
、D2
和 R0
。
廣義 SVD 用於各種應用中,例如當我們想要比較多少屬於 A
相對於多少屬於 B
時,例如人類與酵母基因組、訊號與雜訊,或群集之間與群集內部。(請參閱 Edelman 和 Wang 的討論:https://arxiv.org/abs/1901.00485)
它將 [A; B]
分解為 [UC; VS]H
,其中 [UC; VS]
是 [A; B]
的列空間的自然正交基,而 H = RQ'
是 [A;B]
的行空間的自然非正交基,其中最上面的列最接近於 A
矩陣,最下面的列最接近於 B
矩陣。多餘弦/正弦矩陣 C
和 S
提供了 A
與 B
的多重測量,而 U
和 V
則提供了測量這些內容的方向。
範例
julia> A = randn(3,2); B=randn(4,2);
julia> F = svd(A, B);
julia> U,V,Q,C,S,R = F;
julia> H = R*Q';
julia> [A; B] ≈ [U*C; V*S]*H
true
julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true
julia> Uonly, = svd(A,B);
julia> U == Uonly
true
LinearAlgebra.svd!
— 函數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)
傳回 A
和 B
的廣義奇異值分解中的廣義奇異值。另請參閱 svd
。
範例
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> svdvals(A, B)
2-element Vector{Float64}:
1.0
1.0
LinearAlgebra.svdvals!
— 函數LinearAlgebra.Givens
— 類型LinearAlgebra.Givens(i1,i2,c,s) -> G
Givens 旋轉線性算子。欄位 c
和 s
分別代表旋轉角度的餘弦和正弦。Givens
類型支援左乘法 G*A
和共軛轉置右乘法 A*G'
。該類型沒有 size
,因此可以乘以任意大小的矩陣,只要 i2<=size(A,2)
適用於 G*A
或 i2<=size(A,1)
適用於 A*G'
。
另請參閱 givens
。
LinearAlgebra.givens
— 函數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
— 函數LinearAlgebra.diag
— 函數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
建構一個完整矩陣;如果您想要儲存效率高的版本且具有快速算術,請參閱 Diagonal
、Bidiagonal
Tridiagonal
和 SymTridiagonal
。
範例
julia> diagm(1 => [1,2,3])
4×4 Matrix{Int64}:
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
julia> diagm(1 => [1,2,3], -1 => [4,5])
4×4 Matrix{Int64}:
0 1 0 0
4 0 2 0
0 5 0 3
0 0 0 0
julia> diagm(1 => [1,2,3], 1 => [1,2,3])
4×4 Matrix{Int64}:
0 2 0 0
0 0 4 0
0 0 0 6
0 0 0 0
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)
建構一個矩陣,其元素為向量中的對角線元素。預設情況下,矩陣為正方形,其大小由 length(v)
給定,但可以透過將 m,n
傳遞為第一個參數來指定非正方形大小 m
×n
。
範例
julia> diagm([1,2,3])
3×3 Matrix{Int64}:
1 0 0
0 2 0
0 0 3
LinearAlgebra.rank
— 函數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
計算出的最大奇異值。atol
和 rtol
分別是絕對容差和相對容差。預設相對容差為 n*ϵ
,其中 n
是 A
最小維度的尺寸,而 ϵ
是 A
元素類型的 eps
。
數值秩對於奇異值接近於閾值容差 max(atol, rtol*σ₁)
的病態矩陣而言,可能是一種敏感且不精確的表徵。在這種情況下,對奇異值計算或矩陣的輕微擾動可能會通過將一個或多個奇異值推過閾值來改變 rank
的結果。這些變化甚至可能由於不同 Julia 版本、架構、編譯器或作業系統之間浮點錯誤的變化而發生。
atol
和 rtol
關鍵字參數至少需要 Julia 1.1。在 Julia 1.0 中,rtol
可用作位置參數,但這將在 Julia 2.0 中棄用。
範例
julia> rank(Matrix(I, 3, 3))
3
julia> rank(diagm(0 => [1, 0, 2]))
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3
julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5)
1
LinearAlgebra.norm
— 函數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
的有效值為 1
、2
或 Inf
。(請注意,對於稀疏矩陣,目前尚未實作 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
計算 A
的 p
範數作為一個向量。
向量空間與其對偶空間之間的範數差異,用於保留對偶性與點積之間的關係,而結果與 1 × n
矩陣的算子 p
-範數一致。
範例
julia> v = [1; im];
julia> vc = v';
julia> opnorm(vc, 1)
1.0
julia> norm(vc, 1)
2.0
julia> norm(v, 1)
2.0
julia> opnorm(vc, 2)
1.4142135623730951
julia> norm(vc, 2)
1.4142135623730951
julia> norm(v, 2)
1.4142135623730951
julia> opnorm(vc, Inf)
2.0
julia> norm(vc, Inf)
1.0
julia> norm(v, Inf)
1.0
LinearAlgebra.normalize!
— 函數LinearAlgebra.normalize
— 函數normalize(a, p::Real=2)
正規化 a
,使其 p
-範數等於 1,即 norm(a, p) == 1
。對於純量,這類似於 sign(a),但 normalize(0) = NaN。另請參閱 normalize!
、norm
和 sign
。
範例
julia> a = [1,2,4];
julia> b = normalize(a)
3-element Vector{Float64}:
0.2182178902359924
0.4364357804719848
0.8728715609439696
julia> norm(b)
1.0
julia> c = normalize(a, 1)
3-element Vector{Float64}:
0.14285714285714285
0.2857142857142857
0.5714285714285714
julia> norm(c, 1)
1.0
julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
1 2 4
1 2 4
julia> norm(a)
6.48074069840786
julia> normalize(a)
2×3 Matrix{Float64}:
0.154303 0.308607 0.617213
0.154303 0.308607 0.617213
julia> normalize(3, 1)
1.0
julia> normalize(-8, 1)
-1.0
julia> normalize(0, 1)
NaN
LinearAlgebra.cond
— 函數cond(M, p::Real=2)
矩陣 M
的條件數,使用算子 p
-範數計算。p
的有效值為 1
、2
(預設)或 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
的有效值為 1
、2
和 Inf
(預設值)。
這個量在文獻中也稱為 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
— 函數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*ϵ
,其中 n
為 M
最小維度的尺寸,而 ϵ
為 M
元素類型的 eps
。
對於以最小平方意義反轉稠密病態矩陣,建議使用 rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
。
有關更多資訊,請參閱 [issue8859]、[B96]、[S84]、[KY88]。
範例
julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
1.5 1.3
1.2 1.9
julia> N = pinv(M)
2×2 Matrix{Float64}:
1.47287 -1.00775
-0.930233 1.16279
julia> M * N
2×2 Matrix{Float64}:
1.0 -2.22045e-16
4.44089e-16 1.0
LinearAlgebra.nullspace
— 函數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
最大奇異值。
預設的相對容差 rtol
為 n*ϵ
,其中 n
為 M
最小維度的尺寸,而 ϵ
為 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)
計算兩個向量、矩陣或數字的克羅內克積。
對於實數向量 v
和 w
,克羅內克積與外積的關係為 kron(v,w) == vec(w * transpose(v))
或 w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
。請注意 v
和 w
在這些表達式的左右側的順序不同(由於列優先儲存)。對於複數向量,外積 w * v'
也因 v
的共軛而不同。
範例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 1+0im
1+0im 0-1im
julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
0+1im 1+0im 0+2im 2+0im
1+0im 0-1im 2+0im 0-2im
0+3im 3+0im 0+4im 4+0im
3+0im 0-3im 4+0im 0-4im
julia> v = [1, 2]; w = [3, 4, 5];
julia> w*transpose(v)
3×2 Matrix{Int64}:
3 6
4 8
5 10
julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
3 6
4 8
5 10
Base.kron!
— 函數Base.exp
— 方法Base.cis
— 方法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 中新增了將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 平方根),負特徵值則視為零。rtol
是 sqrt
(僅在 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
— 方法Base.sin
— 方法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
— 方法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
— 方法Base.asin
— 方法Base.atan
— 方法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
,其中 A
、B
和 C
具有相容的維度,且 A
和 -B
沒有實部相等的特徵值。
範例
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
1.0 2.0
-2.0 1.0
julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
-4.46667 1.93333
3.73333 -1.8
julia> A*X + X*B ≈ -C
true
LinearAlgebra.issuccess
— 函數issuccess(F::Factorization)
測試矩陣分解是否成功。
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
— 函數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
AbstractVector
的 transpose
是列向量
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))
。不支援原地轉置,如果 src
和 dest
有重疊的記憶體區域,將會發生意外的結果。
範例
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> transpose!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3+2im 8+7im
9+2im 4+6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Transpose
— 類型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
LinearAlgebra.TransposeFactorization
— 類型TransposeFactorization
底層 Factorization
物件轉置的惰性包裝器類型。通常,不應直接呼叫 TransposeFactorization
建構函式,請改用 transpose(:: Factorization)
。
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))
。不支援原地轉置,如果 src
和 dest
有重疊的記憶體區域,將會發生預期之外的結果。
範例
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> 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
LinearAlgebra.AdjointFactorization
— 型別AdjointFactorization
底層 Factorization
物件的伴隨矩陣的惰性封裝器型別。通常不應直接呼叫 AdjointFactorization
建構函式,請改用 adjoint(:: Factorization)
。
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 n
的 Float64
矩陣相乘,其中 n = 4096
。如果底層 BLAS 使用多執行緒,則會實現更高的浮點運算速率。BLAS 執行緒數目可以使用 BLAS.set_num_threads(n)
設定。
如果提供了關鍵字引數 eltype
,peakflops
會建構元素類型為 eltype
的矩陣,以計算峰值浮點運算速率。
預設情況下,peakflops
會從 3 次試驗中使用最佳計時。如果提供了 ntrials
關鍵字引數,peakflops
會使用這些試驗來挑選最佳計時。
如果關鍵字引數 parallel
設為 true
,peakflops
會在所有工作處理器上並行執行。傳回整個平行電腦的浮點運算速率。在並行執行時,只會使用 1 個 BLAS 執行緒。引數 n
仍然是指在每個處理器上求解的問題大小。
此函數至少需要 Julia 1.1。在 Julia 1.0 中,它可從標準函式庫 InteractiveUtils
取得。
LinearAlgebra.hermitianpart
— 函數hermitianpart(A, uplo=:U) -> Hermitian
傳回方陣 A
的 Hermitian 部分,定義為 (A + A') / 2
,為 Hermitian
矩陣。對於實數矩陣 A
,這也稱為 A
的對稱部分;有時也稱為「算子實數部分」。選用參數 uplo
控制 Hermitian
檢視的對應參數。對於實數矩陣,後者等於 Symmetric
檢視。
另請參閱 hermitianpart!
以取得對應的原位操作。
此函式需要 Julia 1.10 或更新版本。
LinearAlgebra.hermitianpart!
— 函式hermitianpart!(A, uplo=:U) -> Hermitian
以其 Hermitian 部分 (A + A') / 2
原位覆寫方陣 A
,並傳回 Hermitian(A, uplo)
。對於實數矩陣 A
,這也稱為 A
的對稱部分。
另請參閱 hermitianpart
以取得對應的非原位操作。
此函式需要 Julia 1.10 或更新版本。
低階矩陣運算
在許多情況下,矩陣運算有原位版本,允許您提供預先配置的輸出向量或矩陣。在最佳化關鍵程式碼時,這很有用,因為可以避免重複配置的開銷。根據慣例,這些原位操作在下方加上 !
字尾(例如 mul!
)。
LinearAlgebra.mul!
— 函式mul!(Y, A, B) -> Y
計算矩陣-矩陣或矩陣-向量的乘積 $AB$,並將結果儲存在 Y
中,覆寫 Y
的現有值。請注意,Y
不能與 A
或 B
別名。
範例
julia> A=[1.0 2.0; 3.0 4.0]; B=[1.0 1.0; 1.0 1.0]; Y = similar(B); 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
不可與 A
或 B
別名。
五個參數的 mul!
至少需要 Julia 1.3。
範例
julia> A=[1.0 2.0; 3.0 4.0]; B=[1.0 1.0; 1.0 1.0]; C=[1.0 2.0; 3.0 4.0];
julia> 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!
從右邊乘以純量。縮放運算會遵循 a
和 B
元素之間乘法 *
的語意。特別是,這也適用於涉及非有限數字(例如 NaN
和 ±Inf
)的乘法。
在 Julia 1.1 之前,B
中的 NaN
和 ±Inf
項目處理不一致。
範例
julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> lmul!(2, B)
2×2 Matrix{Int64}:
2 4
6 8
julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
NaN
lmul!(A, B)
計算矩陣-矩陣乘積 $AB$,覆寫 B
,並傳回結果。在此,A
必須是特殊矩陣類型,例如 Diagonal
、UpperTriangular
或 LowerTriangular
,或某種正交類型,請參閱 QR
。
範例
julia> B = [0 1; 1 0];
julia> A = UpperTriangular([1 2; 0 3]);
julia> lmul!(A, B);
julia> B
2×2 Matrix{Int64}:
2 1
3 0
julia> B = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
3.0 4.0
1.0 2.0
LinearAlgebra.rmul!
— 函式rmul!(A::AbstractArray, b::Number)
使用純量 b
縮放陣列 A
,並覆寫原地的 A
。使用 lmul!
從左邊乘以純量。縮放運算會遵循 A
的元素和 b
之間乘法 *
的語意。特別是,這也適用於涉及非有限數字(例如 NaN
和 ±Inf
)的乘法。
在 Julia 1.1 之前,A
中的 NaN
和 ±Inf
項目會不一致地處理。
範例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> rmul!(A, 2)
2×2 Matrix{Int64}:
2 4
6 8
julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
NaN
rmul!(A, B)
計算矩陣-矩陣乘積 $AB$,覆寫 A
,並傳回結果。在此,B
必須是特殊矩陣類型,例如 Diagonal
、UpperTriangular
或 LowerTriangular
,或某種正交類型,請參閱 QR
。
範例
julia> A = [0 1; 1 0];
julia> B = UpperTriangular([1 2; 0 3]);
julia> rmul!(A, B);
julia> A
2×2 Matrix{Int64}:
0 3
1 2
julia> A = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
2.0 1.0
4.0 3.0
LinearAlgebra.ldiv!
— 函數ldiv!(Y, A, B) -> Y
計算 A \ B
並儲存在 Y
中,傳回結果。
參數 A
不應 是矩陣。相反地,它不應該是矩陣,而應該是分解物件(例如由 factorize
或 cholesky
產生)。原因在於分解本身既昂貴,通常也會配置記憶體(儘管也可以透過例如 lu!
就地完成),而需要 ldiv!
的效能關鍵情況通常也需要對 A
的分解進行細緻控制。
某些結構化矩陣類型,例如 Diagonal
和 UpperTriangular
,是允許的,因為它們已經是分解形式
範例
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = zero(X);
julia> ldiv!(Y, qr(A), X);
julia> Y
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
不應 是矩陣。相反地,它不應該是矩陣,而應該是分解物件(例如由 factorize
或 cholesky
產生)。原因在於分解本身既昂貴,通常也會配置記憶體(儘管也可以透過例如 lu!
就地完成),而需要 ldiv!
的效能關鍵情況通常也需要對 A
的分解進行細緻控制。
某些結構化矩陣類型,例如 Diagonal
和 UpperTriangular
,是允許的,因為它們已經是分解形式
範例
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = copy(X);
julia> ldiv!(qr(A), X);
julia> X
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::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 函數有四種已定義的方法,分別適用於 Float32
、Float64
、ComplexF32
和 ComplexF64
陣列。
BLAS 字元引數
許多 BLAS 函式接受決定是否轉置引數 (trans
)、參考矩陣的哪個三角形 (uplo
或 ul
)、是否可以假設三角形矩陣的對角線全為 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
— 模組BLAS 子程式的介面。
LinearAlgebra.BLAS.set_num_threads
— 函式set_num_threads(n::Integer)
set_num_threads(::Nothing)
設定 BLAS 函式庫應使用的執行緒數目等於 n::Integer
。
也接受 nothing
,這種情況下 julia 會嘗試猜測預設執行緒數目。傳遞 nothing
是不建議的,而且主要是出於歷史原因而存在。
LinearAlgebra.BLAS.get_num_threads
— 函式get_num_threads()
取得 BLAS 函式庫正在使用的執行緒數目。
get_num_threads
至少需要 Julia 1.6。
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
),覆寫 X
為 c*X + s*Y
,覆寫 Y
為 -conj(s)*X + c*Y
。傳回 X
和 Y
。
rot!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.scal!
— 函數scal!(n, a, X, incx)
scal!(a, X)
以陣列 X
的前 n
個元素的 a*X
覆寫 X
,其跨距為 incx
。傳回 X
。
如果未提供 n
和 incx
,則使用 length(X)
和 stride(X,1)
。
LinearAlgebra.BLAS.scal
— 函數scal(n, a, X, incx)
scal(a, X)
傳回陣列 X
的前 n
個元素乘上 a
的結果,其跨距為 incx
。
如果未提供 n
和 incx
,則使用 length(X)
和 stride(X,1)
。
LinearAlgebra.BLAS.blascopy!
— 函數blascopy!(n, X, incx, Y, incy)
將陣列 X
的 n
個元素,其跨距為 incx
,複製到陣列 Y
,其跨距為 incy
。傳回 Y
。
LinearAlgebra.BLAS.dot
— 函數dot(n, X, incx, Y, incy)
兩個向量的點積,包含陣列 X
的 n
個元素,其跨距為 incx
,以及陣列 Y
的 n
個元素,其跨距為 incy
。
範例
julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
LinearAlgebra.BLAS.dotu
— 函數dotu(n, X, incx, Y, incy)
兩個複數向量的點函數,包含陣列 X
的 n
個元素,其跨距為 incx
,以及陣列 Y
的 n
個元素,其跨距為 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)
兩個複數向量的點函數,包含陣列 X
的 n
個元素,其跨距為 incx
,以及陣列 U
的 n
個元素,其跨距為 incy
,並對第一個向量進行共軛。
範例
julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
LinearAlgebra.BLAS.nrm2
— 函數nrm2(n, X, incx)
一個向量的 2-範數,包含陣列 X
的 n
個元素,其跨距為 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
中絕對值最大的元素索引。n
是 dx
的長度,incx
是步幅。如果未提供 n
和 incx
,則假設預設值為 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*y
或 alpha*A'x + beta*y
。alpha
和 beta
是純量。傳回更新後的 y
。
LinearAlgebra.BLAS.gemv
— 方法gemv(tA, alpha, A, x)
根據 tA
傳回 alpha*A*x
或 alpha*A'x
。alpha
是純量。
LinearAlgebra.BLAS.gemv
— 方法gemv(tA, A, x)
根據 tA
傳回 A*x
或 A'x
。
LinearAlgebra.BLAS.gbmv!
— 函數gbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
根據 trans
將向量 y
更新為 alpha*A*x + beta*y
或 alpha*A'*x + beta*y
。矩陣 A
是維度為 m
乘以 size(A,2)
的一般帶狀矩陣,具有 kl
個次對角線和 ku
個超對角線。alpha
和 beta
是純量。傳回更新後的 y
。
LinearAlgebra.BLAS.gbmv
— 函數gbmv(trans, m, kl, ku, alpha, A, x)
根據 trans
傳回 alpha*A*x
或 alpha*A'*x
。矩陣 A
是維度為 m
乘以 size(A,2)
的一般帶狀矩陣,具有 kl
個次對角線和 ku
個超對角線,而 alpha
是純量。
LinearAlgebra.BLAS.hemv!
— 函數hemv!(ul, alpha, A, x, beta, y)
將向量 y
更新為 alpha*A*x + beta*y
。假設 A
是 Hermitian。只使用 A
的 ul
三角形。alpha
和 beta
是純量。傳回更新後的 y
。
LinearAlgebra.BLAS.hemv
— 方法hemv(ul, alpha, A, x)
傳回 alpha*A*x
。假設 A
是 Hermitian。只使用 A
的 ul
三角形。alpha
是純量。
LinearAlgebra.BLAS.hemv
— 方法hemv(ul, A, x)
傳回 A*x
。假設 A
為 Hermitian。僅使用 A
的 ul
三角形。
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]
,依此類推。
純量輸入 α
和 β
必須為複數或實數。
陣列輸入 x
、y
和 AP
都必須為 ComplexF32
或 ComplexF64
類型。
傳回已更新的 y
。
hpmv!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.symv!
— 函數symv!(ul, alpha, A, x, beta, y)
將向量 y
更新為 alpha*A*x + beta*y
。假設 A
為對稱。僅使用 A
的 ul
三角形。alpha
和 beta
為純量。傳回已更新的 y
。
LinearAlgebra.BLAS.symv
— 方法symv(ul, alpha, A, x)
傳回 alpha*A*x
。假設 A
為對稱矩陣。只使用 A
的 ul
三角形。alpha
為一個純量。
LinearAlgebra.BLAS.symv
— 方法symv(ul, A, x)
傳回 A*x
。假設 A
為對稱矩陣。只使用 A
的 ul
三角形。
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/。只使用 A
的 uplo
三角形。
傳回已更新的 y
。
LinearAlgebra.BLAS.sbmv
— 方法sbmv(uplo, k, alpha, A, x)
傳回 alpha*A*x
,其中 A
為階數為 size(A,2)
的對稱帶狀矩陣,且 k
個超對角線儲存在參數 A
中。只使用 A
的 uplo
三角形。
LinearAlgebra.BLAS.sbmv
— 方法sbmv(uplo, k, A, x)
傳回 A*x
,其中 A
為階數為 size(A,2)
的對稱帶狀矩陣,且 k
個超對角線儲存在參數 A
中。只使用 A
的 uplo
三角形。
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]
,依此類推。
純量輸入 α
和 β
必須是實數。
陣列輸入 x
、y
和 AP
都必須為 Float32
或 Float64
類型。
傳回已更新的 y
。
spmv!
至少需要 Julia 1.5。
LinearAlgebra.BLAS.trmv!
— 函數LinearAlgebra.BLAS.trmv
— 函數LinearAlgebra.BLAS.trsv!
— 函數LinearAlgebra.BLAS.trsv
— 函數傳回矩陣
LinearAlgebra.BLAS.ger!
— 函數ger!(alpha, x, y, A)
使用向量 x
和 y
將矩陣 A
更新為秩 1,作為 alpha*x*y' + A
。
LinearAlgebra.BLAS.her!
— 函數her!(uplo, alpha, x, A)
僅適用於複數陣列的方法。使用向量 x
將 Hermitian 矩陣 A
更新為秩 1,作為 alpha*x*x' + A
。 uplo
控制更新 A
的哪個三角形。傳回 A
。
LinearAlgebra.BLAS.syr!
— 函數syr!(uplo, alpha, x, A)
使用向量 x
將對稱矩陣 A
更新為秩 1,作為 alpha*x*transpose(x) + A
。 uplo
控制更新 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]
,依此類推。
純量輸入 α
必須為實數。
陣列輸入 x
和 AP
都必須為 Float32
或 Float64
類型。傳回已更新的 AP
。
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)
根據 tA
和 tB
,將 C
更新為 alpha*A*B + beta*C
或其他三個變體。傳回已更新的 C
。
LinearAlgebra.BLAS.gemm
— 方法gemm(tA, tB, alpha, A, B)
根據 tA
和 tB
,傳回 alpha*A*B
或其他三個變體。
LinearAlgebra.BLAS.gemm
— 方法gemm(tA, tB, A, B)
根據 tA
和 tB
,傳回 A*B
或其他三個變體。
LinearAlgebra.BLAS.symm!
— 函數LinearAlgebra.BLAS.symm
— 方法LinearAlgebra.BLAS.symm
— 方法LinearAlgebra.BLAS.hemm!
— 函數LinearAlgebra.BLAS.hemm
— 方法LinearAlgebra.BLAS.hemm
— 方法LinearAlgebra.BLAS.syrk!
— 函數LinearAlgebra.BLAS.syrk
— 函數LinearAlgebra.BLAS.herk!
— 函數LinearAlgebra.BLAS.herk
— 函數LinearAlgebra.BLAS.syr2k!
— 函數LinearAlgebra.BLAS.syr2k
— 函數LinearAlgebra.BLAS.her2k!
— 函數LinearAlgebra.BLAS.her2k
— 函數LinearAlgebra.BLAS.trmm!
— 函數LinearAlgebra.BLAS.trmm
— 函數LinearAlgebra.BLAS.trsm!
— 函數LinearAlgebra.BLAS.trsm
— 函數LAPACK 函數
LinearAlgebra.LAPACK
提供一些用於線性代數的 LAPACK 函數的包裝器。那些覆寫其中一個輸入陣列的函數的名稱以 '!'
結尾。
通常,一個函數有 4 個定義的方法,每個方法分別適用於 Float64
、Float32
、ComplexF64
和 ComplexF32
陣列。
請注意,Julia 提供的 LAPACK API 可以而且將來會變更。由於此 API 不是使用者介面,因此不承諾在未來的版本中支援/棄用這組特定的函數。
LinearAlgebra.LAPACK
— 模組LAPACK 子程式的介面。
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 = B
。trans
決定 AB
的方向。它可能是 N
(不轉置)、T
(轉置)或 C
(共軛轉置)。kl
是包含非零帶的第一個次對角線,ku
是包含非零帶的最後一個超對角線,m
是矩陣 AB
的第一個維度。ipiv
是從 gbtrf!
傳回的樞軸向量。傳回向量或矩陣 X
,在原處覆寫 B
。
LinearAlgebra.LAPACK.gebal!
— 函數gebal!(job, A) -> (ilo, ihi, scale)
在計算特徵系統或 Schur 分解之前,平衡矩陣 A
。job
可以是 N
(A
沒有經過排序或縮放)、P
(A
只會經過排序)、S
(A
只會經過縮放)或 B
(A
會同時經過排序和縮放)。在原處修改 A
,並傳回 ilo
、ihi
和 scale
。如果啟用排序,則如果 j > i
且 1 < j < ilo
或 j > ihi
,則 A[i,j] = 0
。scale
包含執行縮放/排序的資訊。
LinearAlgebra.LAPACK.gebak!
— 函數gebak!(job, side, ilo, ihi, scale, V)
將使用 gebal!
平衡矩陣的特征向量 V
轉換為原始矩陣的未縮放/未置換特征向量。原地修改 V
。side
可以是 L
(轉換左特征向量)或 R
(轉換右特征向量)。
LinearAlgebra.LAPACK.gebrd!
— 函數gebrd!(A) -> (A, d, e, tauq, taup)
將 A
原地簡化為雙對角形式 A = QBP'
。傳回 A
,其中包含雙對角矩陣 B
;d
,其中包含 B
的對角元素;e
,其中包含 B
的非對角元素;tauq
,其中包含表示 Q
的基本反射器;以及 taup
,其中包含表示 P
的基本反射器。
LinearAlgebra.LAPACK.gelqf!
— 函數gelqf!(A, tau)
計算 A
的 LQ
分解,A = LQ
。tau
包含參數化分解基本反射器的純量。tau
的長度必須大於或等於 A
的最小維度。
傳回原地修改的 A
和 tau
。
gelqf!(A) -> (A, tau)
計算 A
的 LQ
分解,A = LQ
。
傳回原地修改的 A
,以及 tau
,其中包含參數化分解基本反射器的純量。
LinearAlgebra.LAPACK.geqlf!
— 函數geqlf!(A, tau)
計算 A
的 QL
分解,A = QL
。tau
包含參數化分解基本反射器的純量。tau
的長度必須大於或等於 A
的最小維度。
傳回原地修改的 A
和 tau
。
geqlf!(A) -> (A, tau)
計算 A
的 QL
分解,A = QL
。
傳回原地修改的 A
,以及 tau
,其中包含參數化分解基本反射器的純量。
LinearAlgebra.LAPACK.geqrf!
— 函數geqrf!(A, tau)
計算 A
的 QR
分解,A = QR
。tau
包含參數化分解的初等反射器的純量。tau
的長度必須大於或等於 A
的最小維度。
傳回原地修改的 A
和 tau
。
geqrf!(A) -> (A, tau)
計算 A
的 QR
分解,A = QR
。
傳回原地修改的 A
,以及 tau
,其中包含參數化分解基本反射器的純量。
LinearAlgebra.LAPACK.geqp3!
— 函數geqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
使用 BLAS 層級 3 計算 A
的樞紐 QR
分解,AP = QR
。P
是樞紐矩陣,由 jpvt
表示。tau
儲存初等反射器。引數 jpvt
和 tau
是選用的,允許傳遞預先配置的陣列。傳遞時,如果 A
是 (m x n)
矩陣,則 jpvt
的長度必須大於或等於 n
,而 tau
的長度必須大於或等於 A
的最小維度。
A
、jpvt
和 tau
會直接修改。
LinearAlgebra.LAPACK.gerqf!
— 函數gerqf!(A, tau)
計算 A
的 RQ
分解,A = RQ
。tau
包含參數化分解的初等反射器的純量。tau
的長度必須大於或等於 A
的最小維度。
傳回原地修改的 A
和 tau
。
gerqf!(A) -> (A, tau)
計算 A
的 RQ
分解,A = RQ
。
傳回原地修改的 A
,以及 tau
,其中包含參數化分解基本反射器的純量。
LinearAlgebra.LAPACK.geqrt!
— 函數geqrt!(A, T)
計算 A
的區塊 QR
分解,A = QR
。T
包含參數化分解基本反射器的上三角區塊反射器。T
的第一個維度設定區塊大小,且必須介於 1 和 n
之間。T
的第二個維度必須等於 A
的最小維度。
傳回修改原地的 A
和 T
。
geqrt!(A, nb) -> (A, T)
計算 A
的區塊 QR
分解,A = QR
。nb
設定區塊大小,且必須介於 1 和 n
之間,也就是 A
的第二個維度。
傳回修改原地的 A
,以及 T
,其中包含參數化分解基本反射器的上三角區塊反射器。
LinearAlgebra.LAPACK.geqrt3!
— 函數geqrt3!(A, T)
遞迴計算 A
的區塊 QR
分解,A = QR
。T
包含參數化分解基本反射器的上三角區塊反射器。T
的第一個維度設定區塊大小,且必須介於 1 和 n
之間。T
的第二個維度必須等於 A
的最小維度。
傳回修改原地的 A
和 T
。
geqrt3!(A) -> (A, T)
遞迴計算 A
的區塊 QR
分解,A = QR
。
傳回修改原地的 A
,以及 T
,其中包含參數化分解基本反射器的上三角區塊反射器。
LinearAlgebra.LAPACK.getrf!
— 函數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
轉換為上三角形式。傳回 A
和 tau
,也就是轉換基本反射器的純量參數。
LinearAlgebra.LAPACK.ormrz!
— 函數ormrz!(side, trans, A, tau, C)
使用 tzrzf!
提供的轉換將矩陣 C
乘以 Q
。根據 side
或 trans
,乘法可以是左乘 (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 = B
、transpose(A) * X = B
或 adjoint(A) * X = B
。使用解來修改矩陣/向量 B
。A
會覆寫為其 QR
或 LQ
因式分解。trans
可以是 N
(不修改)、T
(轉置) 或 C
(共軛轉置)。gels!
會尋找最小範數/最小平方解。A
可能為欠定或超定。解會傳回 B
。
LinearAlgebra.LAPACK.gesv!
— 函數gesv!(A, B) -> (B, A, ipiv)
使用 A
的 LU
因式分解來求解線性方程式 A * X = B
,其中 A
是方陣。A
會覆寫為其 LU
因式分解,而 B
會覆寫為解 X
。ipiv
包含 A
的 LU
因式分解的樞紐資訊。
LinearAlgebra.LAPACK.getrs!
— 函數getrs!(trans, A, ipiv, B)
求解線性方程式 A * X = B
、transpose(A) * X = B
或 adjoint(A) * X = B
,其中 A
為方陣。使用解修改矩陣/向量 B
。A
為 getrf!
中的 LU
分解,ipiv
為樞紐資訊。trans
可為 N
(無修改)、T
(轉置)或 C
(共軛轉置)。
LinearAlgebra.LAPACK.getri!
— 函數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)
使用 A
的 LU
分解,求解線性方程式 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
) 或 adjoint(A) * X = B
(trans = C
)。fact
可為 E
,此時 A
會平衡並複製到 AF
;F
,此時 AF
和 ipiv
為先前 LU
分解的輸入;或 N
,此時 A
會複製到 AF
,然後分解。如果 fact = F
,equed
可為 N
,表示 A
未平衡;R
,表示 A
已從左方乘以 Diagonal(R)
;C
,表示 A
已從右方乘以 Diagonal(C)
;或 B
,表示 A
已從左方乘以 Diagonal(R)
,並從右方乘以 Diagonal(C)
。如果 fact = F
且 equed = R
或 B
,則 R
的所有元素都必須為正。如果 fact = F
且 equed = C
或 B
,則 C
的所有元素都必須為正。
傳回解 X
;equed
,如果 fact
不是 N
,則為輸出,且描述執行平衡的內容;R
,列平衡對角線;C
,欄平衡對角線;B
,可能會覆寫為其平衡形式 Diagonal(R)*B
(如果 trans = N
且 equed = R,B
) 或 Diagonal(C)*B
(如果 trans = T,C
且 equed = C,B
);rcond
,平衡後的 A
的倒數條件數;ferr
,X
中每個解向量的正向誤差界限;berr
,X
中每個解向量的正向誤差界限;以及 work
,倒數樞紐成長因子。
gesvx!(A, B)
gesvx!
的無平衡、無轉置簡化版。
LinearAlgebra.LAPACK.gelsd!
— 函數gelsd!(A, B, rcond) -> (B, rnk)
透過找出 A
的 SVD
分解,然後對問題進行分而治之,計算 A * X = B
的最小範數解。B
會覆寫為解 X
。小於 rcond
的奇異值將視為零。傳回 B
中的解和 rnk
中 A
的有效秩。
LinearAlgebra.LAPACK.gelsy!
— 函數gelsy!(A, B, rcond) -> (B, rnk)
透過找出 A
的完整 QR
分解,然後對問題進行分而治之,計算 A * X = B
的最小範數解。B
會覆寫為解 X
。小於 rcond
的奇異值將視為零。傳回 B
中的解和 rnk
中 A
的有效秩。
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 = V
或 jobvr = 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'
的列並分別傳回。jobu
和 jobvt
不能同時為 O
。
傳回 U
、S
和 Vt
,其中 S
是 A
的奇異值。
LinearAlgebra.LAPACK.ggsvd!
— 函數ggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
找出 A
和 B
的廣義奇異值分解,U'*A*Q = D1*R
和 V'*B*Q = D2*R
。D1
的對角線上有 alpha
,而 D2
的對角線上有 beta
。如果 jobu = U
,則會計算正交/酉矩陣 U
。如果 jobv = V
,則會計算正交/酉矩陣 V
。如果 jobq = Q
,則會計算正交/酉矩陣 Q
。如果 jobu
、jobv
或 jobq
為 N
,則不會計算該矩陣。此函數僅在 3.6.0 之前的 LAPACK 版本中提供。
LinearAlgebra.LAPACK.ggsvd3!
— 函數ggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
找出 A
和 B
的廣義奇異值分解,U'*A*Q = D1*R
和 V'*B*Q = D2*R
。D1
的對角線上有 alpha
,D2
的對角線上有 beta
。如果 jobu = U
,則會計算正交/酉矩陣 U
。如果 jobv = V
,則會計算正交/酉矩陣 V
。如果 jobq = Q
,則會計算正交/酉矩陣 Q
。如果 jobu
、jobv
或 jobq
為 N
,則不會計算該矩陣。此函式需要 LAPACK 3.6.0。
LinearAlgebra.LAPACK.geevx!
— 函式geevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
找出 A
的特徵系統,並進行矩陣平衡。如果 jobvl = N
,則不會計算 A
的左特徵向量。如果 jobvr = N
,則不會計算 A
的右特徵向量。如果 jobvl = V
或 jobvr = V
,則會計算對應的特徵向量。如果 balanc = N
,則不會執行平衡。如果 balanc = P
,則會對 A
進行置換,但不會縮放。如果 balanc = S
,則會對 A
進行縮放,但不會置換。如果 balanc = B
,則會對 A
進行置換和縮放。如果 sense = N
,則不會計算任何倒數條件數。如果 sense = E
,則只會計算特徵值的倒數條件數。如果 sense = V
,則只會計算右特徵向量的倒數條件數。如果 sense = B
,則會計算右特徵向量和特徵向量的倒數條件數。如果 sense = E,B
,則必須計算右特徵向量和左特徵向量。
LinearAlgebra.LAPACK.ggev!
— 函式ggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
找出 A
和 B
的廣義特徵分解。如果 jobvl = N
,則不會計算左特徵向量。如果 jobvr = N
,則不會計算右特徵向量。如果 jobvl = V
或 jobvr = V
,則會計算對應的特徵向量。
LinearAlgebra.LAPACK.ggev3!
— 函數ggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
使用區塊演算法找出 A
和 B
的廣義特徵分解。如果 jobvl = N
,則不會計算左特徵向量。如果 jobvr = N
,則不會計算右特徵向量。如果 jobvl = V
或 jobvr = V
,則會計算對應的特徵向量。此函數需要 LAPACK 3.6.0。
LinearAlgebra.LAPACK.gtsv!
— 函數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
。
修改 dl
、d
和 du
,並傳回它們、第二個超對角線 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!
計算的 A
的 LQ
分解。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!
計算的 A
的 QR
分解。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!
計算的 A
的 QL
分解。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!
計算的 A
的 RQ
分解。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!
計算的 A
的 QR
分解。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 分解,並使用使用者設定的容差 tol
。A
會被其 Cholesky 分解覆寫。
傳回 A
、主樞軸 piv
、A
的秩,以及 info
碼。如果 info = 0
,則分解成功。如果 info = i > 0
,則 A
是不定或秩虧的。
LinearAlgebra.LAPACK.ptsv!
— 函數ptsv!(D, E, B)
求解正定三對角矩陣 A
的 A * X = B
。D
是 A
的對角線,E
是非對角線。B
會被解 X
覆寫並傳回。
LinearAlgebra.LAPACK.pttrf!
— 函數pttrf!(D, E)
計算正定三對角矩陣的 LDLt 分解,其中 D
為對角線,E
為非對角線。D
和 E
會被覆寫並傳回。
LinearAlgebra.LAPACK.pttrs!
— 函數pttrs!(D, E, B)
使用 pttrf!
計算正定三對角矩陣 A
的 LDLt 分解後,求解 A * X = B
,其中 A
的對角線為 D
,非對角線為 E
。B
會被解 X
覆寫。
LinearAlgebra.LAPACK.trtri!
— 函數trtri!(uplo, diag, A)
找出三角矩陣 A
的反矩陣(如果 uplo = U
則為上三角,如果 uplo = L
則為下三角)。如果 diag = N
,A
的對角線元素非單位元素。如果 diag = U
,A
的所有對角線元素均為 1。A
會被其反矩陣覆寫。
LinearAlgebra.LAPACK.trtrs!
— 函數trtrs!(uplo, trans, diag, A, B)
求解(如果 uplo = U
則為上三角,如果 uplo = L
則為下三角)三角矩陣 A
的 A * X = B
(trans = N
)、transpose(A) * X = B
(trans = T
) 或 adjoint(A) * X = B
(trans = C
)。如果 diag = N
,A
的對角線元素非單位元素。如果 diag = U
,A
的所有對角線元素均為 1。B
會被解 X
覆寫。
LinearAlgebra.LAPACK.trcon!
— 函數trcon!(norm, uplo, diag, A)
找出(如果 uplo = U
為上三角矩陣,如果 uplo = L
為下三角矩陣)三角矩陣 A
的倒數條件數。如果 diag = N
,A
具有非單位對角線元素。如果 diag = U
,A
的所有對角線元素均為 1。如果 norm = I
,則會在無限範數中找出條件數。如果 norm = O
或 1
,則會在 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
,則會找出所有特徵向量,並使用 VL
和 VR
進行反向轉換。如果 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
的所有對角線元素都為一。Ferr
和 Berr
是選用輸入。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
,則會找出索引介於 il
和 iu
之間的特徵值。如果 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
,則會找出索引介於 il
和 iu
之間的特徵值。特徵值會回傳至 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
(已分解成三角矩陣) 轉換成兩個矩陣 L
和 D
。如果 uplo = U
,則 A
為上三角矩陣。如果 uplo = L
,則為下三角矩陣。ipiv
是三角分解的樞紐向量。A
會被 L
和 D
覆寫。
LinearAlgebra.LAPACK.sysv!
— 函數sysv!(uplo, A, B) -> (B, A, ipiv)
尋找對稱矩陣 A
的 A * 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
,則找出索引介於 il
和 iu
之間的特徵值。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
,則使用 A
和 B
的上三角形。如果 uplo = L
,則使用 A
和 B
的下三角形。如果 itype = 1
,則要解的問題為 A * x = lambda * B * x
。如果 itype = 2
,則要解的問題為 A * B * x = lambda * x
。如果 itype = 3
,則要解的問題為 B * A * x = lambda * x
。
LinearAlgebra.LAPACK.bdsqr!
— 函數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 = O
或 1
,則在一個範數中找到條件數。A
必須是 getrf!
的結果,而 anorm
是 A
在相關範數中的範數。
LinearAlgebra.LAPACK.gehrd!
— 函數gehrd!(ilo, ihi, A) -> (A, tau)
將矩陣 A
轉換為 Hessenberg 形式。如果 A
已使用 gebal!
平衡,則 ilo
和 ihi
是 gebal!
的輸出。否則,它們應該是 ilo = 1
和 ihi = size(A,2)
。tau
包含分解的初等反射器。
LinearAlgebra.LAPACK.orghr!
— 函數orghr!(ilo, ihi, A, tau)
明確找出 Q
,即 gehrd!
中的正交/酉矩陣。ilo
、ihi
、A
和 tau
必須對應於 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)
計算 A
和 B
的廣義特徵值、廣義 Schur 形式、左 Schur 向量 (jobsvl = V
) 或右 Schur 向量 (jobvsr = V
)。
廣義特徵值傳回至 alpha
和 beta
。左 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
) 的 A
和 B
。此函數需要 LAPACK 3.6.0。
廣義特徵值傳回至 alpha
和 beta
。左 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 = N
和 compq = V
的 5 個參數的方法。
傳回 T
、Q
、重新排序的 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
,其中 A
和 B
都是準上三角矩陣。如果 transa = N
,則 A
不會修改。如果 transa = T
,則 A
會轉置。如果 transa = C
,則 A
會共軛轉置。transb
和 B
的情況類似。如果 isgn = 1
,則會求解方程式 A * X + X * B = scale * C
。如果 isgn = -1
,則會求解方程式 A * X - X * B = scale * C
。
傳回 X
(覆寫 C
)和 scale
。
LinearAlgebra.LAPACK.hseqr!
— 函數hseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
計算所有本徵值和(選擇性地)將矩陣化簡為 Hessenberg 形式的 Schur 分解。如果 H
使用 gebal!
平衡,則 ilo
和 ihi
是 gebal!
的輸出。否則,它們應該是 ilo = 1
和 ihi = size(H,2)
。tau
包含分解的初等反射器。
- ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- 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