Linear Algebra
다차원 배열에 대한 지원의 일환으로, Julia는 using LinearAlgebra
를 통해 로드할 수 있는 많은 일반적이고 유용한 선형 대수 연산의 네이티브 구현을 제공합니다. tr
, det
, 및 inv
와 같은 기본 연산이 모두 지원됩니다:
julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
1 2 3
4 1 6
7 8 1
julia> tr(A)
3
julia> det(A)
104.0
julia> inv(A)
3×3 Matrix{Float64}:
-0.451923 0.211538 0.0865385
0.365385 -0.192308 0.0576923
0.240385 0.0576923 -0.0673077
고유값이나 고유벡터를 찾는 것과 같은 다른 유용한 작업들:
julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
-4.0 -17.0
2.0 2.0
julia> eigvals(A)
2-element Vector{ComplexF64}:
-1.0 - 5.0im
-1.0 + 5.0im
julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
0.945905-0.0im 0.945905+0.0im
-0.166924+0.278207im -0.166924-0.278207im
또한, Julia는 선형 해결 또는 행렬 지수화와 같은 문제를 가속화하는 데 사용할 수 있는 많은 factorizations를 제공합니다. 이는 문제에 더 적합한 형태로 행렬을 사전 인수 분해하여 성능이나 메모리 측면에서 유리하게 만들 수 있습니다. 자세한 내용은 factorize
에 대한 문서를 참조하십시오. 예를 들어:
julia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
3.0 -1.0 -6.0
-10.0 2.3 4.0
julia> factorize(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.15 1.0 0.0
-0.3 -0.132196 1.0
U factor:
3×3 Matrix{Float64}:
-10.0 2.3 4.0
0.0 2.345 -3.4
0.0 0.0 -5.24947
A
가 에르미트가 아니고, 대칭도 아니며, 삼각형, 삼중 대각선 또는 이중 대각선도 아니기 때문에 LU 분해가 우리가 할 수 있는 최선일 수 있습니다. 다음과 비교하십시오:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> factorize(B)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
3×3 Tridiagonal{Float64, Vector{Float64}}:
-1.64286 0.0 ⋅
0.0 -2.8 0.0
⋅ 0.0 5.0
U factor:
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.142857 -0.8
⋅ 1.0 -0.6
⋅ ⋅ 1.0
permutation:
3-element Vector{Int64}:
1
2
3
여기서 줄리아는 B
가 실제로 대칭임을 감지하고 더 적절한 인수분해를 사용했습니다. 종종 특정 속성을 가진 행렬에 대해 더 효율적인 코드를 작성하는 것이 가능합니다. 예를 들어, 대칭이거나 삼중 대각선인 경우입니다. 줄리아는 이러한 속성을 가진 행렬을 "태그"할 수 있도록 몇 가지 특수 유형을 제공합니다. 예를 들어:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
sB
는 (실수) 대칭 행렬로 태그가 지정되었으므로, 고유 분해나 행렬-벡터 곱과 같은 이후의 작업을 수행할 때, 그 절반만 참조함으로써 효율성을 찾을 수 있습니다. 예를 들어:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> x = [1; 2; 3]
3-element Vector{Int64}:
1
2
3
julia> sB\x
3-element Vector{Float64}:
-1.7391304347826084
-1.1086956521739126
-1.4565217391304346
\
연산자는 여기서 선형 솔루션을 수행합니다. 왼쪽 나눗셈 연산자는 매우 강력하며, 모든 종류의 선형 방정식 시스템을 해결할 수 있을 만큼 유연한 간결하고 읽기 쉬운 코드를 작성하기가 쉽습니다.
Special matrices
Matrices with special symmetries and structures는 선형 대수에서 자주 발생하며 다양한 행렬 분해와 자주 연관됩니다. Julia는 특정 행렬 유형을 위해 특별히 개발된 전문 루틴을 사용하여 빠른 계산을 가능하게 하는 다양한 특수 행렬 유형의 풍부한 컬렉션을 제공합니다.
다음 표는 Julia에서 구현된 특수 행렬의 유형과 LAPACK에서 이를 위한 다양한 최적화된 방법에 대한 후크가 사용 가능한지 여부를 요약합니다.
Type | Description |
---|---|
Symmetric | Symmetric matrix |
Hermitian | Hermitian matrix |
UpperTriangular | Upper triangular matrix |
UnitUpperTriangular | Upper triangular matrix with unit diagonal |
LowerTriangular | Lower triangular matrix |
UnitLowerTriangular | Lower triangular matrix with unit diagonal |
UpperHessenberg | Upper Hessenberg matrix |
Tridiagonal | Tridiagonal matrix |
SymTridiagonal | Symmetric tridiagonal matrix |
Bidiagonal | Upper/lower bidiagonal matrix |
Diagonal | Diagonal matrix |
UniformScaling | Uniform scaling operator |
Elementary operations
Matrix type | + | - | * | \ | Other functions with optimized methods |
---|---|---|---|---|---|
Symmetric | MV | inv , sqrt , cbrt , exp | |||
Hermitian | MV | inv , sqrt , cbrt , exp | |||
UpperTriangular | MV | MV | inv , det , logdet | ||
UnitUpperTriangular | MV | MV | inv , det , logdet | ||
LowerTriangular | MV | MV | inv , det , logdet | ||
UnitLowerTriangular | MV | MV | inv , det , logdet | ||
UpperHessenberg | MM | inv , det | |||
SymTridiagonal | M | M | MS | MV | eigmax , eigmin |
Tridiagonal | M | M | MS | MV | |
Bidiagonal | M | M | MS | MV | |
Diagonal | M | M | MV | MV | inv , det , logdet , / |
UniformScaling | M | M | MVS | MVS | / |
전설:
Key | Description |
---|---|
M (matrix) | An optimized method for matrix-matrix operations is available |
V (vector) | An optimized method for matrix-vector operations is available |
S (scalar) | An optimized method for matrix-scalar operations is available |
Matrix factorizations
Matrix type | LAPACK | eigen | eigvals | eigvecs | svd | svdvals |
---|---|---|---|---|---|---|
Symmetric | SY | ARI | ||||
Hermitian | HE | ARI | ||||
UpperTriangular | TR | A | A | A | ||
UnitUpperTriangular | TR | A | A | A | ||
LowerTriangular | TR | A | A | A | ||
UnitLowerTriangular | TR | A | A | A | ||
SymTridiagonal | ST | A | ARI | AV | ||
Tridiagonal | GT | |||||
Bidiagonal | BD | A | A | |||
Diagonal | DI | A |
전설:
Key | Description | Example |
---|---|---|
A (all) | An optimized method to find all the characteristic values and/or vectors is available | e.g. eigvals(M) |
R (range) | An optimized method to find the il th through the ih th characteristic values are available | eigvals(M, il, ih) |
I (interval) | An optimized method to find the characteristic values in the interval [vl , vh ] is available | eigvals(M, vl, vh) |
V (vectors) | An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is available | eigvecs(M, x) |
The uniform scaling operator
A UniformScaling
연산자는 스칼라와 항등 연산자 λ*I
를 나타냅니다. 항등 연산자 I
는 상수로 정의되며 UniformScaling
의 인스턴스입니다. 이러한 연산자의 크기는 일반적이며 이진 연산 +
, -
, *
및 \
의 다른 행렬과 일치합니다. A+I
및 A-I
의 경우, A
는 정방행렬이어야 합니다. 항등 연산자 I
와의 곱셈은 noop이며 (스케일링 인자가 1인지 확인하는 것을 제외하고) 따라서 거의 오버헤드가 없습니다.
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
의 헤센베르크 분해 F
를 계산하는 것이 유리할 수 있습니다. F
가 주어지면, Julia는 (F+μ*I) \ b
(이는 (A+μ*I)x \ b
와 동등함)에 대한 효율적인 알고리즘과 행렬식과 같은 관련 연산을 사용합니다.
Matrix factorizations
Matrix factorizations (a.k.a. matrix decompositions) 행렬을 행렬의 곱으로 분해하는 것을 계산하며, 이는 (수치) 선형 대수의 중심 개념 중 하나입니다.
다음 표는 Julia에서 구현된 행렬 분해의 유형을 요약한 것입니다. 관련된 방법에 대한 세부정보는 선형 대수 문서의 Standard functions 섹션에서 확인할 수 있습니다.
Type | Description |
---|---|
BunchKaufman | Bunch-Kaufman factorization |
Cholesky | Cholesky factorization |
CholeskyPivoted | Pivoted Cholesky factorization |
LDLt | LDL(T) factorization |
LU | LU factorization |
QR | QR factorization |
QRCompactWY | Compact WY form of the QR factorization |
QRPivoted | Pivoted QR factorization |
LQ | QR factorization of transpose(A) |
Hessenberg | Hessenberg decomposition |
Eigen | Spectral decomposition |
GeneralizedEigen | Generalized spectral decomposition |
SVD | Singular value decomposition |
GeneralizedSVD | Generalized SVD |
Schur | Schur decomposition |
GeneralizedSchur | Generalized Schur decomposition |
Factorization
객체의 어드전트와 전치는 각각 AdjointFactorization
및 TransposeFactorization
객체로 지연 래핑됩니다. 일반적으로, 실수 Factorization
의 전치는 AdjointFactorization
으로 래핑됩니다.
Orthogonal matrices (AbstractQ
)
일부 행렬 분해는 직교/유니타리 "행렬" 요소를 생성합니다. 이러한 분해에는 qr
호출에서 얻은 QR 관련 분해, 즉 QR
, QRCompactWY
및 QRPivoted
, hessenberg
호출에서 얻은 헤센베르크 분해, 그리고 lq
에서 얻은 LQ 분해가 포함됩니다. 이러한 직교/유니타리 요소는 행렬 표현을 허용하지만, 성능 및 메모리 이유로 내부 표현은 다릅니다. 따라서 이들은 행렬 기반의 함수 기반 선형 연산자로 보는 것이 더 적절합니다. 특히, 예를 들어 행렬 표현의 열을 읽는 것은 메모리에서 데이터를 단순히 읽어오는 것이 아니라 "행렬"-벡터 곱셈 코드를 실행해야 합니다(가능한 경우 벡터의 일부를 구조적 제로로 채우는 것). 다른 비삼각형 행렬 유형과의 또 다른 명확한 구별은 기본 곱셈 코드가 곱셈 중에 제자리 수정을 허용한다는 점입니다. 또한 4d61726b646f776e2e436f64652822222c202271722229_40726566
, 4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566
및 4d61726b646f776e2e436f64652822222c20226c712229_40726566
를 통해 생성된 특정 AbstractQ
하위 유형의 객체는 상황에 따라 정사각형 또는 직사각형 행렬처럼 동작할 수 있습니다:
julia> using LinearAlgebra
julia> Q = qr(rand(3,2)).Q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
julia> Matrix(Q)
3×2 Matrix{Float64}:
-0.320597 0.865734
-0.765834 -0.475694
-0.557419 0.155628
julia> Q*I
3×3 Matrix{Float64}:
-0.320597 0.865734 -0.384346
-0.765834 -0.475694 -0.432683
-0.557419 0.155628 0.815514
julia> Q*ones(2)
3-element Vector{Float64}:
0.5451367118802273
-1.241527373086654
-0.40179067589600226
julia> Q*ones(3)
3-element Vector{Float64}:
0.16079054743832022
-1.674209978965636
0.41372375588835797
julia> ones(1,2) * Q'
1×3 Matrix{Float64}:
0.545137 -1.24153 -0.401791
julia> ones(1,3) * Q'
1×3 Matrix{Float64}:
0.160791 -1.67421 0.413724
이 밀집 또는 구조화된 행렬과의 구별로 인해, 추상 AbstractQ
타입은 AbstractMatrix
의 하위 타입이 아니며, 대신 자체 타입 계층을 가지고 있습니다. AbstractQ
를 하위 타입으로 하는 사용자 정의 타입은 다음 인터페이스가 충족되면 일반적인 대체 기능에 의존할 수 있습니다. 예를 들어,
struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
# required fields
end
오버로드 제공하기
Base.size(Q::MyQ) # size of corresponding square matrix representation
Base.convert(::Type{AbstractQ{T}}, Q::MyQ) # eltype promotion [optional]
LinearAlgebra.lmul!(Q::MyQ, x::AbstractVecOrMat) # left-multiplication
LinearAlgebra.rmul!(A::AbstractMatrix, Q::MyQ) # right-multiplication
eltype
승격이 관심이 없다면, convert
메소드는 필요하지 않습니다. 기본적으로 convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})
는 Q
자체를 반환합니다. AbstractQ
타입 객체의 어드전트는 AdjointQ
래퍼 타입으로 지연 래핑되며, 이는 자체 LinearAlgebra.lmul!
및 LinearAlgebra.rmul!
메소드를 필요로 합니다. 이러한 메소드 집합을 고려할 때, 어떤 Q::MyQ
도 행렬처럼 사용할 수 있으며, 특히 곱셈 맥락에서 사용되는 것이 바람직합니다: 스칼라, 벡터 및 행렬과의 왼쪽 및 오른쪽 곱셈을 위한 *
를 통한 곱셈, Matrix(Q)
(또는 Q*I
)를 통해 Q
의 행렬 표현을 얻고, 행렬 표현에 인덱싱하는 모든 작업이 가능합니다. 반면, 덧셈 및 뺄셈, 그리고 행렬 표현의 요소에 대한 브로드캐스팅은 비효율적이기 때문에 실패합니다. 이러한 사용 사례에 대해서는 행렬 표현을 미리 계산하고 향후 재사용을 위해 캐시하는 것을 고려하십시오.
Pivoting Strategies
줄리아의 matrix factorizations 여러 개는 pivoting를 지원하며, 이는 수치적 안정성을 개선하는 데 사용할 수 있습니다. 사실, LU 분해와 같은 일부 행렬 분해는 피벗팅 없이 실패할 수 있습니다.
피벗팅에서 먼저, 피벗팅 전략에 따라 좋은 수치적 특성을 가진 pivot element가 선택됩니다. 다음으로, 원래 행렬의 행과 열이 재배열되어 선택된 요소가 후속 계산을 위해 제자리에 오도록 합니다. 또한, 이 과정은 인수 분해의 각 단계에 대해 반복됩니다.
결과적으로, 기존의 행렬 인수 외에도 피벗 인수 분해 방식의 출력에는 순열 행렬도 포함됩니다.
다음은 Julia에서 구현된 피벗 전략에 대한 간략한 설명입니다. 모든 행렬 분해가 이를 지원하는 것은 아닙니다. 지원되는 피벗 전략에 대한 자세한 내용은 해당 matrix factorization의 문서를 참조하십시오.
또한 LinearAlgebra.ZeroPivotException
를 참조하세요.
LinearAlgebra.NoPivot
— TypeNoPivot
피벗이 수행되지 않습니다. LU 분해와 같은 행렬 분해는 피벗 없이 실패할 수 있으며, 반올림 오류에 직면한 부동 소수점 행렬에 대해 수치적으로 불안정할 수도 있습니다. 이 피벗 전략은 주로 교육적 목적에 유용합니다.
LinearAlgebra.RowNonZero
— TypeRowNonZero
남은 행에서 첫 번째 비영(非零) 요소가 피벗 요소로 선택됩니다.
부동 소수점 행렬의 경우, 결과 LU 알고리즘은 수치적으로 불안정하므로 주의해야 합니다. 이 전략은 주로 수작업 계산(일반적으로 이 전략을 사용함)이나 반올림 오류에 영향을 받지 않는 다른 대수적 유형(예: 유리수)과 비교하는 데 유용합니다. 그렇지 않으면, 가우스 소거법에서는 기본 RowMaximum
피벗 전략이 일반적으로 선호되어야 합니다.
LinearAlgebra.RowMaximum
— TypeRowMaximum
남은 행에서 최대 크기의 요소가 피벗 요소로 선택됩니다. 이것은 부동 소수점 행렬의 LU 분해에 대한 기본 전략이며, 때때로 "부분 피벗팅" 알고리즘이라고도 합니다.
LinearAlgebra.ColumnNorm
— TypeColumnNorm
최대 노름을 가진 열이 이후 계산에 사용됩니다. 이는 피벗 QR 분해에 사용됩니다.
행렬의 요소 유형은 norm
및 abs
메서드를 허용해야 하며, 각 결과 유형은 <
메서드를 허용해야 합니다.
Standard functions
줄리아의 선형 대수 함수는 주로 LAPACK의 함수를 호출하여 구현됩니다. 희소 행렬 분해는 SuiteSparse의 함수를 호출합니다. 다른 희소 솔버는 줄리아 패키지로 제공됩니다.
Base.:*
— Method*(A::AbstractMatrix, B::AbstractMatrix)
행렬 곱셈.
예제
julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
2 1
1 1
Base.:*
— Method*(A, B::AbstractMatrix, C)
A * B * C * D
3개 또는 4개의 행렬의 연쇄 곱셈은 배열의 크기를 기반으로 가장 효율적인 순서로 수행됩니다. 즉, (A * B) * C
(3개의 밀집 행렬을 사용)에서 필요한 스칼라 곱셈의 수는 A * (B * C)
와 비교되어 이 중 어떤 것을 실행할지 선택합니다.
마지막 인자가 벡터이거나 첫 번째 인자가 전치된 벡터인 경우, 이러한 요소를 먼저 처리하는 것이 효율적입니다. 특히 x' * B * y
는 일반적인 열 우선 B::Matrix
에 대해 (x' * B) * y
를 의미합니다. dot(x, B, y)
와는 달리, 이는 중간 배열을 할당합니다.
첫 번째 또는 마지막 인자가 숫자인 경우, 이는 행렬 곱셈과 융합되어 5-인자 mul!
를 사용합니다.
이러한 최적화는 최소한 Julia 1.7이 필요합니다.
Base.:\
— Method\(A, B)
다항 알고리즘을 사용한 행렬 나누기. 입력 행렬 A
와 B
에 대해 결과 X
는 A*X == B
가 성립하도록 하며, A
가 정사각형일 때 적용됩니다. 사용되는 솔버는 A
의 구조에 따라 다릅니다. A
가 상삼각형 또는 하삼각형(또는 대각선)인 경우, A
의 인수분해가 필요 없으며 시스템은 전방 또는 후방 대체를 통해 해결됩니다. 비삼각형 정사각형 행렬의 경우, LU 인수분해가 사용됩니다.
직사각형 A
의 경우 결과는 A
의 피벗 QR 인수분해와 R 인수를 기반으로 한 A
의 랭크 추정에 의해 계산된 최소-노름 최소 제곱 솔루션입니다.
A
가 희소한 경우 유사한 다항 알고리즘이 사용됩니다. 비정방 행렬의 경우, LDLt
인수분해는 수치 인수분해 중 피벗팅을 사용하지 않으므로 절대 가역 행렬에 대해서도 절차가 실패할 수 있습니다.
예제
julia> A = [1 0; 1 -2]; B = [32; -4];
julia> X = A \ B
2-element Vector{Float64}:
32.0
18.0
julia> A * X == B
true
Base.:/
— MethodA / B
행렬 오른쪽 나누기: A / B
는 (B' \ A')'
와 동등하며, 여기서 \
는 왼쪽 나누기 연산자입니다. 정방 행렬의 경우, 결과 X
는 A == X*B
를 만족합니다.
또한: rdiv!
.
예제
julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];
julia> X = A / B
2×3 Matrix{Float64}:
-0.65 3.75 -1.2
3.25 -2.75 1.0
julia> isapprox(A, X*B)
true
julia> isapprox(X, A*pinv(B))
true
LinearAlgebra.SingularException
— TypeSingularException
입력 행렬에 하나 이상의 0 값 고유값이 있을 때 발생하는 예외로, 비가역적입니다. 이러한 행렬을 포함하는 선형 방정식은 계산할 수 없습니다. info
필드는 (하나의) 특이 값의 위치를 나타냅니다.
LinearAlgebra.PosDefException
— TypePosDefException
입력 행렬이 양의 정부호이지 않을 때 발생하는 예외입니다. 일부 선형 대수 함수 및 분해는 양의 정부호 행렬에만 적용 가능합니다. info
필드는 0보다 작거나 같은 고유값 중 하나의 위치를 나타냅니다.
LinearAlgebra.ZeroPivotException
— TypeZeroPivotException <: Exception
행렬 분해/해결 과정에서 피벗(대각선) 위치에 0이 발생하여 진행할 수 없을 때 발생하는 예외입니다. 이는 행렬이 특이하다는 것을 의미하지 않을 수 있습니다: 변수를 재배치하여 잘못된 0 피벗을 제거할 수 있는 피벗 LU와 같은 다른 분해로 전환하는 것이 유익할 수 있습니다. info
필드는 0 피벗 중 하나의 위치를 나타냅니다.
LinearAlgebra.RankDeficientException
— TypeRankDeficientException
입력 행렬이 랭크 결핍일 때 발생하는 예외입니다. Cholesky 분해와 같은 일부 선형 대수 함수는 랭크 결핍이 아닌 행렬에만 적용됩니다. info
필드는 행렬의 계산된 랭크를 나타냅니다.
LinearAlgebra.LAPACKException
— TypeLAPACKException
일반 LAPACK 예외는 LAPACK 함수에 대한 직접 호출 중 또는 LAPACK 함수를 내부적으로 사용하는 다른 함수에 대한 호출 중에 발생하며, 이러한 함수는 전문화된 오류 처리가 부족합니다. info
필드는 기본 오류에 대한 추가 정보를 포함하며 호출된 LAPACK 함수에 따라 다릅니다.
LinearAlgebra.dot
— Functiondot(x, y)
x ⋅ y
두 벡터 간의 내적을 계산합니다. 복소 벡터의 경우, 첫 번째 벡터는 켤레화됩니다.
dot
은 요소에 대해 dot
이 정의되어 있는 한, 모든 차원의 배열을 포함한 임의의 반복 가능한 객체에서도 작동합니다.
dot
은 의미적으로 sum(dot(vx,vy) for (vx,vy) in zip(x, y))
와 동등하지만, 인수는 동일한 길이를 가져야 한다는 추가 제한이 있습니다.
x ⋅ y
(여기서 ⋅
는 REPL에서 \cdot
를 탭 완성하여 입력할 수 있습니다)는 dot(x, y)
의 동의어입니다.
예제
julia> dot([1; 1], [2; 3])
5
julia> dot([im; im], [1; 1])
0 - 2im
julia> dot(1:5, 2:6)
70
julia> x = fill(2., (5,5));
julia> y = fill(3., (5,5));
julia> dot(x, y)
150.0
LinearAlgebra.dot
— Methoddot(x, A, y)
두 벡터 x
와 y
사이의 일반화된 내적 dot(x, A*y)
를 계산하되, A*y
의 중간 결과를 저장하지 않습니다. 두 인수 dot(_,_)
와 마찬가지로, 이 함수는 재귀적으로 작동합니다. 또한, 복소 벡터의 경우 첫 번째 벡터는 켤레화됩니다.
세 인수 dot
는 최소한 Julia 1.4가 필요합니다.
예제
julia> dot([1; 1], [1 2; 3 4], [2; 3])
26
julia> dot(1:5, reshape(1:25, 5, 5), 2:6)
4850
julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6)
true
LinearAlgebra.cross
— Functioncross(x, y)
×(x,y)
두 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!
— Functionaxpy!(α, x::AbstractArray, y::AbstractArray)
y
를 x * α + y
로 덮어쓰고 y
를 반환합니다. x
와 y
가 동일한 축을 가지면, 이는 y .+= x .* a
와 동등합니다.
예제
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpy!(2, x, y)
3-element Vector{Int64}:
6
9
12
LinearAlgebra.axpby!
— Functionaxpby!(α, x::AbstractArray, β, y::AbstractArray)
y
를 x * α + y * β
로 덮어쓰고 y
를 반환합니다. x
와 y
가 동일한 축을 가지면, y .= x .* a .+ y .* β
와 동일합니다.
예제
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
10
14
18
LinearAlgebra.rotate!
— Functionrotate!(x, y, c, s)
x
를 c*x + s*y
로, y
를 -conj(s)*x + c*y
로 덮어씁니다. x
와 y
를 반환합니다.
rotate!
는 최소한 Julia 1.5가 필요합니다.
LinearAlgebra.reflect!
— Functionreflect!(x, y, c, s)
x
를 c*x + s*y
로, y
를 conj(s)*x - c*y
로 덮어씁니다. x
와 y
를 반환합니다.
reflect!
는 최소한 Julia 1.5가 필요합니다.
LinearAlgebra.factorize
— Functionfactorize(A)
입력 행렬의 유형에 따라 A
의 편리한 인수 분해를 계산합니다. factorize
는 A
가 일반 행렬로 전달되면 대칭/삼각형/etc.인지 확인합니다. factorize
는 A
의 각 요소를 확인하여 각 속성을 검증/배제합니다. 대칭/삼각형 구조를 배제할 수 있는 즉시 단축 회로를 사용합니다. 반환 값은 여러 시스템을 효율적으로 해결하는 데 재사용할 수 있습니다. 예를 들어: A=factorize(A); x=A\b; y=A\C
.
A 의 속성 | 인수 분해 유형 |
---|---|
양의 정부호 | Cholesky (see cholesky ) |
밀집 대칭/에르미트 | Bunch-Kaufman (see bunchkaufman ) |
희소 대칭/에르미트 | LDLt (see ldlt ) |
삼각형 | 삼각형 |
대각선 | 대각선 |
이대각선 | 이대각선 |
삼중대각선 | LU (see lu ) |
대칭 실수 삼중대각선 | LDLt (see ldlt ) |
일반 정사각형 | LU (see lu ) |
일반 비정사각형 | QR (see qr ) |
예를 들어 factorize
가 에르미트 양의 정부호 행렬에 호출되면, factorize
는 Cholesky 인수 분해를 반환합니다.
예제
julia> A = Array(Bidiagonal(fill(1.0, (5, 5)), :U))
5×5 Matrix{Float64}:
1.0 1.0 0.0 0.0 0.0
0.0 1.0 1.0 0.0 0.0
0.0 0.0 1.0 1.0 0.0
0.0 0.0 0.0 1.0 1.0
0.0 0.0 0.0 0.0 1.0
julia> factorize(A) # factorize는 A가 이미 인수 분해되었는지 확인합니다
5×5 Bidiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅ ⋅ ⋅
⋅ 1.0 1.0 ⋅ ⋅
⋅ ⋅ 1.0 1.0 ⋅
⋅ ⋅ ⋅ 1.0 1.0
⋅ ⋅ ⋅ ⋅ 1.0
이것은 이제 다른 선형 대수 함수(예: 고유값 해결기)에 전달될 수 있는 5×5 Bidiagonal{Float64}
를 반환하며, 이 함수는 Bidiagonal
유형에 대한 특수화된 방법을 사용할 것입니다.
LinearAlgebra.Diagonal
— TypeDiagonal(V::AbstractVector)
V
를 대각선으로 하는 지연 행렬을 생성합니다.
지연 단위 행렬 I
에 대한 UniformScaling
, 조밀한 행렬을 만들기 위한 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
한 열 행렬은 벡터처럼 처리되지 않고, 대신 1-요소 diag(A)
를 추출하는 Diagonal(A::AbstractMatrix)
메서드를 호출합니다:
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
의 주 대각선으로부터 행렬을 구성합니다. 입력 행렬 A
는 직사각형일 수 있지만, 출력은 정사각형이 됩니다.
예제
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> D = Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 4
julia> A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 5
Diagonal{T}(undef, n)
길이 n
의 초기화되지 않은 Diagonal{T}
를 생성합니다. undef
를 참조하세요.
LinearAlgebra.Bidiagonal
— TypeBidiagonal(dv::V, ev::V, uplo::Symbol) where V <: AbstractVector
주어진 대각선(dv
) 및 비대각선(ev
) 벡터를 사용하여 상부(uplo=:U
) 또는 하부(uplo=:L
) 이중 대각 행렬을 구성합니다. 결과는 Bidiagonal
유형이며 효율적인 특수 선형 솔버를 제공하지만, convert(Array, _)
(또는 짧게 Array(_)
)를 사용하여 일반 행렬로 변환할 수 있습니다. ev
의 길이는 dv
의 길이보다 하나 적어야 합니다.
예제
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> Bu = Bidiagonal(dv, ev, :U) # ev는 첫 번째 초대각선에 있습니다.
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev는 첫 번째 아대각선에 있습니다.
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
7 2 ⋅ ⋅
⋅ 8 3 ⋅
⋅ ⋅ 9 4
Bidiagonal(A, uplo::Symbol)
주어진 행렬 A
의 주 대각선과 첫 번째 초대각선(만약 uplo=:U
인 경우) 또는 첫 번째 아랫대각선(만약 uplo=:L
인 경우)으로부터 Bidiagonal
행렬을 생성합니다.
예제
julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
4×4 Matrix{Int64}:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
julia> Bidiagonal(A, :U) # A의 주 대각선과 첫 번째 초대각선을 포함
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # A의 주 대각선과 첫 번째 아랫대각선을 포함
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonal
— TypeSymTridiagonal(dv::V, ev::V) where V <: AbstractVector
대각선(dv
)과 첫 번째 하위/상위 대각선(ev
)으로부터 대칭 삼대각 행렬을 구성합니다. 결과는 SymTridiagonal
유형이며, 효율적인 특수 고유값 솔버를 제공하지만 convert(Array, _)
(또는 짧게 Array(_)
)를 사용하여 일반 행렬로 변환할 수 있습니다.
SymTridiagonal
블록 행렬의 경우, dv
의 요소는 대칭화됩니다. 인수 ev
는 상위 대각선으로 해석됩니다. 하위 대각선의 블록은 해당 상위 대각선 블록의 (구현된) 전치입니다.
예제
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> SymTridiagonal(dv, ev)
4×4 SymTridiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
7 2 8 ⋅
⋅ 8 3 9
⋅ ⋅ 9 4
julia> A = SymTridiagonal(fill([1 2; 3 4], 3), fill([1 2; 3 4], 2));
julia> A[1,1]
2×2 Symmetric{Int64, Matrix{Int64}}:
1 2
2 4
julia> A[1,2]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[2,1]
2×2 Matrix{Int64}:
1 3
2 4
SymTridiagonal(A::AbstractMatrix)
대칭 행렬 A
의 대각선과 첫 번째 초대각선으로부터 대칭 삼대각 행렬을 구성합니다.
예제
julia> A = [1 2 3; 2 4 5; 3 5 6]
3×3 Matrix{Int64}:
1 2 3
2 4 5
3 5 6
julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
1 2 ⋅
2 4 5
⋅ 5 6
julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);
julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
[1 2; 2 3] [1 3; 2 4]
[1 2; 3 4] [1 2; 2 3]
LinearAlgebra.Tridiagonal
— TypeTridiagonal(dl::V, d::V, du::V) where V <: AbstractVector
첫 번째 하위 대각선, 대각선 및 첫 번째 상위 대각선으로부터 삼중 대각 행렬을 구성합니다. 결과는 Tridiagonal
유형이며 효율적인 특수 선형 솔버를 제공하지만 convert(Array, _)
(또는 짧게 Array(_)
)를 사용하여 일반 행렬로 변환할 수 있습니다. dl
및 du
의 길이는 d
의 길이보다 하나 짧아야 합니다.
하위 대각선 dl
과 상위 대각선 du
는 서로 별칭을 가져서는 안 됩니다. 별칭이 감지되면 생성자는 du
의 복사본을 인수로 사용합니다.
예제
julia> dl = [1, 2, 3];
julia> du = [4, 5, 6];
julia> d = [7, 8, 9, 0];
julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
7 4 ⋅ ⋅
1 8 5 ⋅
⋅ 2 9 6
⋅ ⋅ 3 0
Tridiagonal(A)
행렬 A
의 첫 번째 하삼각 대각선, 대각선 및 첫 번째 상삼각 대각선으로부터 삼대각 행렬을 구성합니다.
예제
julia> A = [1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
4×4 Matrix{Int64}:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
1 2 ⋅ ⋅
1 2 3 ⋅
⋅ 2 3 4
⋅ ⋅ 3 4
LinearAlgebra.Symmetric
— TypeSymmetric(A::AbstractMatrix, uplo::Symbol=:U)
행렬 A
의 상삼각형(만약 uplo = :U
인 경우) 또는 하삼각형(만약 uplo = :L
인 경우)의 Symmetric
뷰를 생성합니다.
Symmetric
뷰는 주로 실수 대칭 행렬에 유용하며, 이 행렬에 대해 특화된 알고리즘(예: 고유 문제 해결을 위한)이 Symmetric
타입에 대해 활성화됩니다. 더 일반적으로, 실수 행렬에 대해 Symmetric
과 사실상 동등하지만 복소수 행렬에도 유용한 에르미트 행렬 A == A'
에 대해서는 Hermitian(A)
도 참조하십시오. (복소수 Symmetric
행렬은 지원되지만 특화된 알고리즘이 거의 없습니다.)
실수 행렬의 대칭 부분을 계산하거나, 더 일반적으로 실수 또는 복소수 행렬 A
의 에르미트 부분 (A + A') / 2
를 계산하려면 hermitianpart
를 사용하십시오.
예제
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> Supper = Symmetric(A)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 2 3
2 5 6
3 6 9
julia> Slower = Symmetric(A, :L)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 4 7
4 5 8
7 8 9
julia> hermitianpart(A)
3×3 Hermitian{Float64, Matrix{Float64}}:
1.0 3.0 5.0
3.0 5.0 7.0
5.0 7.0 9.0
Supper
는 A
가 대칭 행렬(예: A == transpose(A)
)이 아닌 한 Slower
와 같지 않음을 유의하십시오.
LinearAlgebra.Hermitian
— TypeHermitian(A::AbstractMatrix, uplo::Symbol=: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
Hupper
는 A
가 자체적으로 Hermitian이 아닌 한 Hlower
와 같지 않습니다(예: A == adjoint(A)
인 경우).
대각선의 모든 비실수 부분은 무시됩니다.
Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular
— TypeLowerTriangular(A::AbstractMatrix)
행렬 A
의 LowerTriangular
뷰를 생성합니다.
예제
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 5.0 ⋅
7.0 8.0 9.0
LinearAlgebra.UpperTriangular
— TypeUpperTriangular(A::AbstractMatrix)
행렬 A
의 UpperTriangular
뷰를 생성합니다.
예제
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 5.0 6.0
⋅ ⋅ 9.0
LinearAlgebra.UnitLowerTriangular
— TypeUnitLowerTriangular(A::AbstractMatrix)
행렬 A
의 UnitLowerTriangular
뷰를 생성합니다. 이러한 뷰는 A
의 eltype
의 oneunit
을 대각선에 가집니다.
예제
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 1.0 ⋅
7.0 8.0 1.0
LinearAlgebra.UnitUpperTriangular
— TypeUnitUpperTriangular(A::AbstractMatrix)
행렬 A
의 UnitUpperTriangular
뷰를 생성합니다. 이러한 뷰는 A
의 eltype
의 oneunit
을 대각선에 가집니다.
예제
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 1.0 6.0
⋅ ⋅ 1.0
LinearAlgebra.UpperHessenberg
— TypeUpperHessenberg(A::AbstractMatrix)
행렬 A
의 UpperHessenberg
뷰를 생성합니다. 첫 번째 부대각선 아래의 A
의 항목은 무시됩니다.
이 유형은 Julia 1.3에 추가되었습니다.
H \ b
, det(H)
및 유사한 것들에 대해 효율적인 알고리즘이 구현되어 있습니다.
유사한 상부 헤센베르크 행렬로 모든 행렬을 인수분해하는 hessenberg
함수도 참조하십시오.
F::Hessenberg
가 인수분해 객체인 경우, 유니타리 행렬은 F.Q
로 접근할 수 있으며, 헤센베르크 행렬은 F.H
로 접근할 수 있습니다. Q
가 추출되면 결과 유형은 HessenbergQ
객체가 되며, convert(Array, _)
(또는 짧게 Array(_)
)를 사용하여 일반 행렬로 변환할 수 있습니다.
분해를 반복하면 인수 F.Q
와 F.H
가 생성됩니다.
예제
julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
1 2 3 4
5 6 7 8
⋅ 10 11 12
⋅ ⋅ 15 16
LinearAlgebra.UniformScaling
— TypeUniformScaling{T<:Number}
스칼라와 항등 연산자 λ*I
의 곱으로 정의된 일반 크기의 균일 스케일링 연산자입니다. 명시적인 size
가 없지만, 많은 경우에 행렬처럼 작동하며 일부 인덱싱을 지원합니다. I
도 참조하십시오.
범위를 사용한 인덱싱은 Julia 1.6부터 사용할 수 있습니다.
예제
julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> J*A
2×2 Matrix{Float64}:
2.0 4.0
6.0 8.0
julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
LinearAlgebra.I
— ConstantI
UniformScaling
유형의 객체로, 임의의 크기의 단위 행렬을 나타냅니다.
예제
julia> fill(1, (5,6)) * I == fill(1, (5,6))
true
julia> [1 2im 3; 1im 2 3] * I
2×3 Matrix{Complex{Int64}}:
1+0im 0+2im 3+0im
0+1im 2+0im 3+0im
LinearAlgebra.UniformScaling
— Method(I::UniformScaling)(n::Integer)
UniformScaling
에서 Diagonal
행렬을 생성합니다.
이 메서드는 Julia 1.2부터 사용할 수 있습니다.
예제
julia> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
1 ⋅ ⋅
⋅ 1 ⋅
⋅ ⋅ 1
julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
0.7 ⋅ ⋅
⋅ 0.7 ⋅
⋅ ⋅ 0.7
LinearAlgebra.Factorization
— TypeLinearAlgebra.Factorization
행렬 분해(matrix factorizations를 위한 추상 타입입니다. 사용 가능한 행렬 분해 목록은 온라인 문서를 참조하세요.
LinearAlgebra.LU
— TypeLU <: 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); # 반복을 통한 구조 분해
julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.lu
— Functionlu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU
희소 행렬 A
의 LU 분해를 계산합니다.
실수 또는 복소수 요소 유형을 가진 희소 A
의 경우, F
의 반환 유형은 UmfpackLU{Tv, Ti}
이며, 여기서 Tv
는 Float64
또는 ComplexF64
이고, Ti
는 정수 유형 (Int32
또는 Int64
)입니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다 (via issuccess
).
치환 q
는 치환 벡터이거나 nothing
일 수 있습니다. 치환 벡터가 제공되지 않거나 q
가 nothing
인 경우, UMFPACK의 기본값이 사용됩니다. 치환이 0 기반이 아닐 경우, 0 기반 복사가 이루어집니다.
control
벡터는 UMFPACK에 대한 Julia SparseArrays 패키지의 기본 구성으로 기본값이 설정됩니다 (참고: 이는 반복 정제를 비활성화하기 위해 UMFPACK 기본값에서 수정됨), 그러나 UMFPACK_CONTROL
길이의 벡터를 전달하여 변경할 수 있습니다. 가능한 구성에 대해서는 UMFPACK 매뉴얼을 참조하십시오. 예를 들어 반복 정제를 다시 활성화하려면:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # Float64 희소 행렬에 대한 Julia 기본 구성 읽기
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # 선택 사항 - 값 표시
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # 반복 정제 다시 활성화 (2는 UMFPACK 기본 최대 반복 정제 단계)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # Ax = b를 해결하며, UMFPACK 반복 정제를 포함
분해 F
의 개별 구성 요소는 인덱싱하여 접근할 수 있습니다:
구성 요소 | 설명 |
---|---|
L | LU 의 L (하삼각) 부분 |
U | LU 의 U (상삼각) 부분 |
p | 오른쪽 치환 Vector |
q | 왼쪽 치환 Vector |
Rs | 스케일링 계수의 Vector |
: | (L,U,p,q,Rs) 구성 요소 |
F
와 A
간의 관계는 다음과 같습니다.
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
는 다음 함수를 추가로 지원합니다:
또한 lu!
를 참조하십시오.
lu(A::AbstractSparseMatrixCSC)
는 SuiteSparse의 일부인 UMFPACK[ACM832] 라이브러리를 사용합니다. 이 라이브러리는 Float64
또는 ComplexF64
요소를 가진 희소 행렬만 지원하므로, lu
는 A
를 적절하게 SparseMatrixCSC{Float64}
또는 SparseMatrixCSC{ComplexF64}
유형의 복사본으로 변환합니다.
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
행렬 A
의 LU 분해를 계산합니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다 (via issuccess
).
기본적으로, check = true
일 때, 분해가 유효한 요소를 생성하더라도 상삼각 행렬 U
가 랭크 결핍인 경우에도 오류가 발생합니다. 이는 allowsingular = true
를 전달하여 변경할 수 있습니다.
대부분의 경우, A
가 AbstractMatrix{T}
의 하위 유형 S
이고 요소 유형 T
가 +
, -
, *
및 /
를 지원하는 경우, 반환 유형은 LU{T,S{T}}
입니다.
일반적으로 LU 분해는 행렬의 행을 순열하는 것을 포함하며 (아래에 설명된 F.p
출력에 해당), 이를 "피벗팅"이라고 합니다 (이는 "피벗"이 포함된 행, 즉 F.U
의 대각선 항목을 선택하는 것과 관련이 있습니다). 다음의 피벗팅 전략 중 하나를 선택할 수 있습니다:
RowMaximum()
(기본값): 표준 피벗팅 전략; 피벗은 남아 있는, 분해될 행 중 최대 절대값을 가지는 요소에 해당합니다. 이 피벗팅 전략은 요소 유형이abs
및<
도 지원해야 합니다. (이는 일반적으로 부동 소수점 행렬에 대해 유일하게 수치적으로 안정적인 옵션입니다.)RowNonZero()
: 피벗은 남아 있는, 분해될 행 중 첫 번째 비영(非零) 요소에 해당합니다. (이는 수작업 계산에서 일반적인 선택에 해당하며,iszero
를 지원하지만abs
또는<
를 지원하지 않는 보다 일반적인 대수적 수 유형에도 유용합니다.)NoPivot()
: 피벗팅이 꺼집니다 (피벗 위치에서 0 항목이 발견되면 실패하며,allowsingular = true
일 때도 마찬가지입니다).
분해 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 | ✓ | ✓ |
allowsingular
키워드 인자는 Julia 1.11에서 추가되었습니다.
예제
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # 반복을 통한 구조 분해
julia> l == F.L && u == F.U && p == F.p
true
julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U factor (rank-deficient):
2×2 Matrix{Float64}:
1.0 2.0
0.0 0.0
LinearAlgebra.lu!
— Functionlu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU
희소 행렬 A
의 LU 분해를 계산하며, 이미 존재하는 LU 분해가 저장된 F
의 기호 분해를 재사용합니다. reuse_symbolic
이 false로 설정되지 않는 한, 희소 행렬 A
는 LU 분해 F
를 생성하는 데 사용된 행렬과 동일한 비영(非零) 패턴을 가져야 하며, 그렇지 않으면 오류가 발생합니다. A
와 F
의 크기가 다르면 모든 벡터가 그에 맞게 크기가 조정됩니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다 (via issuccess
).
순열 q
는 순열 벡터이거나 nothing
일 수 있습니다. 순열 벡터가 제공되지 않거나 q
가 nothing
인 경우, UMFPACK의 기본값이 사용됩니다. 순열이 0 기반이 아닐 경우, 0 기반 복사가 이루어집니다.
자세한 내용은 lu
를 참조하십시오.
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
는 SuiteSparse의 일부인 UMFPACK 라이브러리를 사용합니다. 이 라이브러리는 Float64
또는 ComplexF64
요소를 가진 희소 행렬만 지원하므로, lu!
는 LU 분해에 의해 설정된 유형이나 적절한 경우 SparseMatrixCSC{ComplexF64}
로 자동 변환됩니다.
UmfpackLU
에 대한 lu!
는 최소한 Julia 1.5가 필요합니다.
예제
julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);
julia> F = lu(A);
julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);
julia> lu!(F, B);
julia> F \ ones(2)
2-element Vector{Float64}:
0.0
1.0
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU
lu!
는 lu
와 동일하지만 입력 A
를 덮어써서 공간을 절약합니다. 인수 분해가 A
의 요소 유형으로 표현할 수 없는 숫자를 생성하는 경우, 예를 들어 정수 유형의 경우, InexactError
예외가 발생합니다.
allowsingular
키워드 인자는 Julia 1.11에서 추가되었습니다.
예제
julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
4.0 3.0
6.0 3.0
julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L 인자:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U 인자:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
LinearAlgebra.Cholesky
— TypeCholesky <: Factorization
밀집 대칭/에르미트 양의 정부호 행렬 A
의 Cholesky 분해의 행렬 분해 유형입니다. 이는 해당 행렬 분해 함수인 cholesky
의 반환 유형입니다.
삼각형 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
— TypeCholeskyPivoted
밀집 대칭/허미티안 양의 준정칙 행렬 A
의 피벗된 콜레스키 분해의 행렬 분해 유형입니다. 이는 cholesky(_, ::RowMaximum)
에서 반환되는 유형으로, 해당 행렬 분해 함수입니다.
삼각형 콜레스키 인자는 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
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
밀집 대칭 양의 정부호 행렬 A
의 Cholesky 분해를 계산하고 Cholesky
분해를 반환합니다. 행렬 A
는 Symmetric
또는 Hermitian
AbstractMatrix
일 수 있으며, 완벽하게 대칭 또는 에르미트 AbstractMatrix
일 수 있습니다.
삼각형 Cholesky 인자는 분해 F
에서 F.L
및 F.U
를 통해 얻을 수 있으며, 여기서 A ≈ F.U' * F.U ≈ F.L * F.L'
입니다.
Cholesky
객체에 대해 사용할 수 있는 함수는 size
, \
, inv
, det
, logdet
및 isposdef
입니다.
구성 과정에서 반올림 오류로 인해 약간 비에르미트인 행렬 A
가 있는 경우, cholesky
에 전달하기 전에 Hermitian(A)
로 감싸서 완벽한 에르미트로 처리하십시오.
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 인자:
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
일 수 있으며, 완벽하게 대칭 또는 허미티안 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
가 있는 경우, cholesky
에 전달하기 전에 Hermitian(A)
로 감싸서 완벽한 허미티안으로 처리하십시오.
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 인자는 랭크 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
순열:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # 반복을 통한 구조 분해
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
희소 양의 정부호 행렬 A
의 Cholesky 분해를 계산합니다. A
는 SparseMatrixCSC
또는 SparseMatrixCSC
의 Symmetric
/Hermitian
뷰여야 합니다. A
가 타입 태그가 없더라도 여전히 대칭 또는 에르미트여야 합니다. perm
이 주어지지 않으면, 채우기 감소 순열이 사용됩니다. F = cholesky(A)
는 F\b
로 방정식 시스템을 해결하는 데 가장 자주 사용되지만, diag
, det
, 및 logdet
와 같은 메서드도 F
에 대해 정의되어 있습니다. F
에서 개별 요소를 추출할 수도 있으며, F.L
을 사용할 수 있습니다. 그러나 피벗이 기본적으로 활성화되어 있기 때문에, 분해는 내부적으로 A == P'*L*L'*P
로 표현되며, 여기서 P
는 순열 행렬입니다. P
를 고려하지 않고 단순히 L
을 사용하면 잘못된 결과가 나옵니다. 순열의 효과를 포함하려면, 일반적으로 PtL = F.PtL
(즉, P'*L
) 및 LtP = F.UP
(즉, L'*P
)와 같은 "결합된" 요소를 추출하는 것이 바람직합니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다(즉, issuccess
사용).
선택적 shift
키워드 인수를 설정하면 A
대신 A+shift*I
의 분해를 계산합니다. perm
인수가 제공되면, 이는 사용해야 할 순서를 제공하는 1:size(A,1)
의 순열이어야 합니다(즉, CHOLMOD의 기본 AMD 순서 대신).
예제
다음 예제에서 사용된 채우기 감소 순열은 [3, 2, 1]
입니다. perm
이 1:3
으로 설정되어 순열이 없도록 강제하면, 요소의 수는 6입니다.
julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
2 1 1
1 2 0
1 0 2
julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 5
nnz: 5
success: true
julia> C.p
3-element Vector{Int64}:
3
2
1
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.0 1.41421 0.0
0.707107 0.707107 1.0
julia> L * L' ≈ A[C.p, C.p]
true
julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
⋅ ⋅ 1.0
⋅ 1.0 ⋅
1.0 ⋅ ⋅
julia> P' * L * L' * P ≈ A
true
julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 6
nnz: 6
success: true
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.707107 1.22474 0.0
0.707107 -0.408248 1.1547
julia> L * L' ≈ A
true
이 방법은 SuiteSparse에서 CHOLMOD[ACM887][DavisHager2009] 라이브러리를 사용합니다. CHOLMOD는 단일 또는 이중 정밀도의 실수 또는 복소수 유형만 지원합니다. 이러한 요소 유형이 아닌 입력 행렬은 적절하게 이러한 유형으로 변환됩니다.
CHOLMOD의 많은 다른 함수가 래핑되었지만 Base.SparseArrays.CHOLMOD
모듈에서 내보내지지는 않았습니다.
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
cholesky
와 동일하지만, 입력 A
를 복사하는 대신 덮어써서 공간을 절약합니다. 인수 분해가 A
의 요소 유형으로 표현할 수 없는 숫자를 생성하는 경우, 예를 들어 정수 유형의 경우, InexactError
예외가 발생합니다.
예제
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> cholesky!(A)
ERROR: InexactError: Int64(6.782329983125268)
Stacktrace:
[...]
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
cholesky
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다. 인수 분해가 A
의 요소 유형으로 표현할 수 없는 숫자를 생성하는 경우, 예를 들어 정수 유형의 경우 InexactError
예외가 발생합니다.
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
A
의 Cholesky ($LL'$) 분해를 계산하고, 기호 분해 F
를 재사용합니다. A
는 SparseMatrixCSC
또는 SparseMatrixCSC
의 Symmetric
/Hermitian
뷰여야 합니다. A
가 타입 태그가 없더라도 여전히 대칭 또는 에르미트여야 합니다.
자세한 내용은 cholesky
를 참조하세요.
이 방법은 SuiteSparse의 CHOLMOD 라이브러리를 사용하며, 이는 단일 또는 이중 정밀도의 실수 또는 복소수 유형만 지원합니다. 해당 요소 유형이 아닌 입력 행렬은 적절하게 이러한 유형으로 변환됩니다.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
벡터 v
로 Cholesky 분해 C
를 업데이트합니다. 만약 A = C.U'C.U
라면 CC = cholesky(C.U'C.U + v*v')
이지만, CC
의 계산은 O(n^2)
연산만 사용합니다.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
주어진 A
의 LDLt
또는 LLt
분해 F
에 대해 A + C*C'
의 LDLt
분해를 가져옵니다.
반환된 인자는 항상 LDLt
분해입니다.
또한 lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
를 참조하십시오.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Cholesky 분해 C
를 벡터 v
로 다운데이트합니다. 만약 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
분해입니다.
또한 lowrankdowndate!
, lowrankupdate
, lowrankupdate!
를 참조하십시오.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
벡터 v
로 Cholesky 분해 C
를 업데이트합니다. 만약 A = C.U'C.U
라면 CC = cholesky(C.U'C.U + v*v')
이지만, CC
의 계산은 O(n^2)
연산만 사용합니다. 입력 분해 C
는 제자리에서 업데이트되어 종료 시 C == CC
가 됩니다. 벡터 v
는 계산 중에 파괴됩니다.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
A
의 LDLt
또는 LLt
분해 F
를 A + C*C'
의 분해로 업데이트합니다.
LLt
분해는 LDLt
로 변환됩니다.
자세한 내용은 lowrankupdate
, lowrankdowndate
, lowrankdowndate!
를 참조하세요.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Cholesky 분해 C
를 벡터 v
로 다운데이트합니다. 만약 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
로 변환됩니다.
자세한 내용은 lowrankdowndate
, lowrankupdate
, lowrankupdate!
를 참조하세요.
LinearAlgebra.LDLt
— TypeLDLt <: Factorization
실수 SymTridiagonal
행렬 S
의 LDLt
분해의 행렬 분해 유형으로, S = L*Diagonal(d)*L'
형태입니다. 여기서 L
은 UnitLowerTriangular
행렬이고, d
는 벡터입니다. LDLt
분해 F = ldlt(S)
의 주요 용도는 선형 방정식 시스템 Sx = b
를 F\b
로 푸는 것입니다. 이는 해당 행렬 분해 함수인 ldlt
의 반환 유형입니다.
분해 F::LDLt
의 개별 구성 요소는 getproperty
를 통해 접근할 수 있습니다:
구성 요소 | 설명 |
---|---|
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
— Functionldlt(S::SymTridiagonal) -> LDLt
실수 대칭 삼중 대각 행렬 S
의 LDLt
(즉, $LDL^T$) 분해를 계산합니다. 여기서 S = L*Diagonal(d)*L'
이며, L
은 단위 하삼각 행렬이고 d
는 벡터입니다. LDLt
분해 F = ldlt(S)
의 주요 용도는 선형 방정식 시스템 Sx = b
를 F\b
로 푸는 것입니다.
유사하지만 피벗된 임의의 대칭 또는 에르미트 행렬의 분해에 대한 bunchkaufman
도 참조하십시오.
예제
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt(S);
julia> b = [6., 7., 8.];
julia> ldltS \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
julia> S \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor
희소 행렬 A
의 $LDL'$ 분해를 계산합니다. A
는 SparseMatrixCSC
또는 SparseMatrixCSC
의 Symmetric
/Hermitian
뷰여야 합니다. A
가 타입 태그가 없더라도 여전히 대칭 또는 에르미트여야 합니다. 채우기 감소 순열이 사용됩니다. F = ldlt(A)
는 시스템의 방정식 A*x = b
를 F\b
로 해결하는 데 가장 자주 사용됩니다. 반환된 분해 객체 F
는 또한 diag
, det
, logdet
, 및 inv
메서드를 지원합니다. F
에서 개별 요소를 추출하려면 F.L
을 사용하면 됩니다. 그러나 피벗이 기본적으로 활성화되어 있기 때문에, 분해는 내부적으로 A == P'*L*D*L'*P
로 표현되며, 여기서 P
는 순열 행렬입니다; P
를 고려하지 않고 단순히 L
을 사용하면 잘못된 결과가 나옵니다. 순열의 효과를 포함하려면, 일반적으로 PtL = F.PtL
(즉, P'*L
에 해당) 및 LtP = F.UP
(즉, L'*P
에 해당)와 같은 "결합된" 요소를 추출하는 것이 바람직합니다. 지원되는 요소의 전체 목록은 :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
입니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다 (via issuccess
).
선택적 shift
키워드 인수를 설정하면 A
대신 A+shift*I
의 분해를 계산합니다. perm
인수가 제공되면, 이는 사용해야 할 순서를 제공하는 1:size(A,1)
의 순열이어야 합니다 (CHOLMOD의 기본 AMD 순서 대신).
이 방법은 SuiteSparse에서 제공하는 CHOLMOD[ACM887][DavisHager2009] 라이브러리를 사용합니다. CHOLMOD는 단일 또는 이중 정밀도의 실수 또는 복소수 타입만 지원합니다. 해당 요소 타입이 아닌 입력 행렬은 적절하게 이러한 타입으로 변환됩니다.
CHOLMOD의 많은 다른 함수가 래핑되었지만 Base.SparseArrays.CHOLMOD
모듈에서 내보내지지는 않았습니다.
LinearAlgebra.ldlt!
— Functionldlt!(S::SymTridiagonal) -> LDLt
ldlt
와 동일하지만, 입력 S
를 덮어써서 복사본을 생성하는 대신 공간을 절약합니다.
예제
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt!(S);
julia> ldltS === S
false
julia> S
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 0.333333 ⋅
0.333333 3.66667 0.545455
⋅ 0.545455 3.90909
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
A
의 $LDL'$ 분해를 계산하며, 기호 분해 F
를 재사용합니다. A
는 SparseMatrixCSC
또는 SparseMatrixCSC
의 Symmetric
/Hermitian
뷰여야 합니다. A
가 타입 태그가 없더라도 여전히 대칭 또는 에르미트여야 합니다.
자세한 내용은 ldlt
를 참조하세요.
이 메서드는 SuiteSparse에서 제공하는 CHOLMOD 라이브러리를 사용하며, 이는 단일 또는 이중 정밀도의 실수 또는 복소수 타입만 지원합니다. 해당 요소 타입이 아닌 입력 행렬은 적절하게 이러한 타입으로 변환됩니다.
LinearAlgebra.QR
— TypeQR <: Factorization
QR 행렬 분해는 일반적으로 qr
에서 얻은 압축 형식으로 저장됩니다. 만약 $A$가 m
×n
행렬이라면
\[A = Q R\]
여기서 $Q$는 직교/유니타리 행렬이고 $R$은 상삼각 행렬입니다. 행렬 $Q$는 Householder 반사기 $v_i$와 계수 $\tau_i$의 시퀀스로 저장됩니다:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
분해를 반복하면 구성 요소 Q
와 R
이 생성됩니다.
객체에는 두 개의 필드가 있습니다:
factors
는m
×n
행렬입니다.- 상삼각 부분은 $R$의 요소를 포함하며, 즉
R = triu(F.factors)
는QR
객체F
에 대해 성립합니다. - 하대각선 부분은 압축 형식으로 저장된 반사기 $v_i$를 포함하며, 여기서 $v_i$는 행렬
V = I + tril(F.factors, -1)
의 $i$번째 열입니다.
- 상삼각 부분은 $R$의 요소를 포함하며, 즉
τ
는 길이가min(m,n)
인 벡터로, 계수 $au_i$를 포함합니다.
LinearAlgebra.QRCompactWY
— TypeQRCompactWY <: Factorization
QR 행렬 분해는 일반적으로 qr
에서 얻어진 압축 블록 형식으로 저장됩니다. 만약 $A$가 m
×n
행렬이라면
\[A = Q R\]
여기서 $Q$는 직교/유니타리 행렬이고 $R$은 상삼각형입니다. 이는 QR
형식과 유사하지만, 직교/유니타리 행렬 $Q$가 Compact WY 형식으로 저장됩니다 [Schreiber1989]. 블록 크기 $n_b$에 대해, 이는 m
×n
하사다리꼴 행렬 $V$와 $b = \lceil \min(m,n) / n_b \rceil$ 개의 크기 $n_b$×$n_b$ 상삼각형 행렬 $T_j$로 구성된 행렬 $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$로 저장됩니다 ($j = 1, ..., b-1$) 및 상하사다리꼴 $n_b$×$\min(m,n) - (b-1) n_b$ 행렬 $T_b'$ ($j=b$)로, 그 상단 정사각형 부분은 $T_b$로 표시되며 다음을 만족합니다.
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T) = \prod_{j=1}^{b} (I - V_j T_j V_j^T)\]
여기서 $v_i$는 $V$의 $i$번째 열, $\tau_i$는 [diag(T_1); diag(T_2); …; diag(T_b)]
의 $i$번째 요소이며, $(V_1 \; V_2 \; ... \; V_b)$는 $V$의 왼쪽 m
×min(m, n)
블록입니다. qr
로 구성할 때, 블록 크기는 $n_b = \min(m, n, 36)$로 주어집니다.
분해를 반복하면 구성 요소 Q
와 R
이 생성됩니다.
객체에는 두 개의 필드가 있습니다:
factors
,QR
유형과 같이,m
×n
행렬입니다.- 상삼각형 부분에는 $R$의 요소가 포함되어 있으며, 즉
R = triu(F.factors)
는QR
객체F
에 대해 성립합니다. - 하대각선 부분에는 패킹 형식으로 저장된 반사기 $v_i$가 포함되어 있으며,
V = I + tril(F.factors, -1)
입니다.
- 상삼각형 부분에는 $R$의 요소가 포함되어 있으며, 즉
T
는 위에서 설명한 대로 $n_b$-by-$\min(m,n)$ 행렬입니다. 각 삼각형 행렬 $T_j$의 하대각선 요소는 무시됩니다.
이 형식은 이전의 WY 표현 [Bischof1987]과 혼동해서는 안 됩니다.
LinearAlgebra.QRPivoted
— TypeQRPivoted <: Factorization
열 피벗이 있는 QR 행렬 분해로, 일반적으로 qr
에서 얻은 압축 형식입니다. 만약 $A$가 m
×n
행렬이라면
\[A P = Q R\]
여기서 $P$는 순열 행렬, $Q$는 직교/유니타리 행렬이며 $R$은 상삼각 행렬입니다. 행렬 $Q$는 하우스홀더 반사기의 시퀀스로 저장됩니다:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
분해를 반복하면 구성 요소 Q
, R
, 및 p
가 생성됩니다.
객체는 세 개의 필드를 가집니다:
factors
는m
×n
행렬입니다.- 상삼각 부분은 $R$의 요소를 포함하며, 즉
R = triu(F.factors)
는QR
객체F
에 대해 성립합니다. - 하대각선 부분은 압축 형식으로 저장된 반사기 $v_i$를 포함하며, 여기서 $v_i$는 행렬
V = I + tril(F.factors, -1)
의 $i$번째 열입니다.
- 상삼각 부분은 $R$의 요소를 포함하며, 즉
τ
는 길이min(m,n)
의 벡터로, 계수 $au_i$를 포함합니다.jpvt
는 순열 $P$에 해당하는 길이n
의 정수 벡터입니다.
LinearAlgebra.qr
— Functionqr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse
희소 행렬 A
의 QR
분해를 계산합니다. F.R = F.Q'*A[F.prow,F.pcol]
가 되도록 행과 열의 채우기 감소 순열이 사용됩니다. 이 유형의 주요 응용 프로그램은 \
를 사용하여 최소 제곱 또는 미결정 문제를 해결하는 것입니다. 이 함수는 C 라이브러리 SPQR[ACM933]를 호출합니다.
qr(A::SparseMatrixCSC)
는 SuiteSparse의 일부인 SPQR 라이브러리를 사용합니다. 이 라이브러리는 Float64
또는 ComplexF64
요소를 가진 희소 행렬만 지원하므로, Julia v1.4부터 qr
는 A
를 SparseMatrixCSC{Float64}
또는 SparseMatrixCSC{ComplexF64}
유형의 복사본으로 변환합니다.
예제
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
-1.41421 ⋅
⋅ -1.41421
Row permutation:
4-element Vector{Int64}:
1
3
4
2
Column permutation:
2-element Vector{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
행렬 A
의 QR 분해를 계산합니다: 직교(또는 A
가 복소수 값일 경우 유니타리) 행렬 Q
와 상삼각 행렬 R
이 있어 다음과 같은 관계를 만족합니다.
\[A = Q R\]
반환된 객체 F
는 패킹된 형식으로 분해를 저장합니다:
pivot == ColumnNorm()
인 경우F
는QRPivoted
객체입니다.- 그렇지 않고
A
의 요소 유형이 BLAS 유형(Float32
,Float64
,ComplexF32
또는ComplexF64
)인 경우,F
는QRCompactWY
객체입니다. - 그렇지 않으면
F
는QR
객체입니다.
분해의 개별 구성 요소 F
는 속성 접근자를 통해 검색할 수 있습니다:
F.R
를 통해 상삼각 요소에 대한 각 참조는 새로운 배열을 할당합니다. 따라서 R = F.R
와 같이 해당 배열을 캐시하고 R
로 계속 작업하는 것이 좋습니다.
분해를 반복하면 구성 요소 Q
, R
, 그리고 존재하는 경우 p
를 생성합니다.
QR
객체에 대해 사용할 수 있는 함수는 다음과 같습니다: inv
, size
, 및 \
. A
가 직사각형인 경우, \
는 최소 제곱 해를 반환하며, 해가 유일하지 않은 경우 가장 작은 노름을 가진 해가 반환됩니다. A
가 풀 랭크가 아닐 경우, 최소 노름 해를 얻기 위해 (열) 피벗을 사용한 분해가 필요합니다.
전체/정사각형 또는 비전체/비정사각형 Q
에 대한 곱셈이 허용됩니다. 즉, F.Q*F.R
와 F.Q*A
모두 지원됩니다. Q
행렬은 Matrix
로 일반 행렬로 변환할 수 있습니다. 이 작업은 "얇은" Q 요소를 반환합니다. 즉, A
가 m
×n
이고 m>=n
인 경우, Matrix(F.Q)
는 직교 정규 열을 가진 m
×n
행렬을 생성합니다. "전체" Q 요소를 검색하려면 F.Q*I
또는 collect(F.Q)
를 사용하십시오. m<=n
인 경우, Matrix(F.Q)
는 m
×m
직교 행렬을 생성합니다.
QR 분해를 위한 블록 크기는 pivot == NoPivot()
이고 A isa StridedMatrix{<:BlasFloat}
일 때 키워드 인수 blocksize :: Integer
로 지정할 수 있습니다. blocksize > minimum(size(A))
인 경우 무시됩니다. QRCompactWY
를 참조하십시오.
blocksize
키워드 인수는 Julia 1.4 이상이 필요합니다.
예제
julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
3.0 -6.0
4.0 -8.0
0.0 1.0
julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 요소: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R 요소:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
는 LAPACK가 Householder 기본 반사체의 곱의 메모리 저장 요구 사항을 최소화하는 여러 표현을 사용하기 때문에 여러 유형을 반환합니다. 따라서 Q
및 R
행렬을 두 개의 개별 밀집 행렬 대신 압축하여 저장할 수 있습니다.
LinearAlgebra.qr!
— Functionqr!(A, pivot = NoPivot(); blocksize)
qr!
는 A
가 AbstractMatrix
의 하위 유형일 때 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 인자: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R 인자:
2×2 Matrix{Float64}:
-3.16228 -4.42719
0.0 -0.632456
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
LinearAlgebra.LQ
— TypeLQ <: 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; # 반복을 통한 구조 분해
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq
— Functionlq(A) -> S::LQ
A
의 LQ 분해를 계산합니다. 분해의 하삼각형 구성 요소는 LQ
객체 S
에서 S.L
을 통해 얻을 수 있으며, 직교/유니타리 구성 요소는 S.Q
를 통해 얻을 수 있습니다. 따라서 A ≈ S.L*S.Q
입니다.
분해를 반복하면 구성 요소 S.L
과 S.Q
를 생성합니다.
LQ 분해는 transpose(A)
의 QR 분해이며, 이는 과소정의 방정식 시스템에 대한 최소 노름 해 lq(A) \ b
를 계산하는 데 유용합니다(A
는 열이 행보다 많지만 전체 행 랭크를 가집니다).
예제
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 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; # 반복을 통한 구조 분해
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!
— FunctionLinearAlgebra.BunchKaufman
— TypeBunchKaufman <: Factorization
대칭 또는 에르미트 행렬 A
의 Bunch-Kaufman 분해의 행렬 분해 유형으로, A
에 상단(기본값) 또는 하단 삼각형이 저장되는지에 따라 P'UDU'P
또는 P'LDL'P
로 표현됩니다. A
가 복소수 대칭인 경우 U'
와 L'
는 비공액 전치(transpose)를 나타내며, 즉 각각 transpose(U)
와 transpose(L)
입니다. 이는 bunchkaufman
함수의 반환 유형입니다.
S::BunchKaufman
이 분해 객체인 경우, 구성 요소는 S.uplo
및 S.p
에 따라 적절하게 S.D
, S.U
또는 S.L
을 통해 얻을 수 있습니다.
분해를 반복하면 S.uplo
및 S.p
에 따라 적절하게 S.D
, S.U
또는 S.L
구성 요소가 생성됩니다.
예제
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A는 내부적으로 Symmetric(A)로 래핑됩니다.
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 인자:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U 인자:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
순열:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # 반복을 통한 구조 분해
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 인자:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L 인자:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
순열:
2-element Vector{Int64}:
2
1
LinearAlgebra.bunchkaufman
— Functionbunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman
대칭 또는 에르미트 행렬 A
의 Bunch-Kaufman [Bunch1977] 분해를 P'*U*D*U'*P
또는 P'*L*D*L'*P
형태로 계산하고, A
에 저장된 삼각형에 따라 BunchKaufman
객체를 반환합니다. A
가 복소수 대칭인 경우 U'
와 L'
는 비공액 전치(transpose)를 나타내며, 즉 transpose(U)
와 transpose(L)
입니다.
분해를 반복하면 S.uplo
에 따라 적절한 구성 요소인 S.D
, S.U
또는 S.L
과 S.p
를 생성합니다.
rook
이 true
이면, rook 피벗팅이 사용됩니다. rook
이 false이면, rook 피벗팅이 사용되지 않습니다.
check = true
일 때, 분해가 실패하면 오류가 발생합니다. check = false
일 때, 분해의 유효성을 확인하는 책임은 사용자에게 있습니다 (via issuccess
).
BunchKaufman
객체에 대해 사용할 수 있는 함수는 다음과 같습니다: size
, \
, inv
, issymmetric
, ishermitian
, getindex
.
예제
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A는 내부적으로 Symmetric(A)에 의해 래핑됩니다.
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 인자:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U 인자:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
순열:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # 반복을 통한 구조 분해
julia> d == S.D && u == S.U && p == S.p
true
julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 인자:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L 인자:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
순열:
2-element Vector{Int64}:
2
1
julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
LinearAlgebra.bunchkaufman!
— Functionbunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman
bunchkaufman!
는 bunchkaufman
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다.
LinearAlgebra.Eigen
— TypeEigen <: Factorization
정방 행렬 A
의 고유값/스펙트럼 분해의 행렬 분해 유형입니다. 이는 해당 행렬 분해 함수인 eigen
의 반환 유형입니다.
F::Eigen
이 분해 객체인 경우, 고유값은 F.values
를 통해 얻을 수 있으며, 고유벡터는 행렬 F.vectors
의 열로 얻을 수 있습니다. (k
번째 고유벡터는 슬라이스 F.vectors[:, k]
를 통해 얻을 수 있습니다.)
분해를 반복하면 구성 요소 F.values
와 F.vectors
가 생성됩니다.
예제
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen
— TypeGeneralizedEigen <: Factorization
A
와 B
의 일반화된 고유값/스펙트럼 분해의 행렬 분해 유형입니다. 이는 두 개의 행렬 인수로 호출될 때 해당 행렬 분해 함수인 eigen
의 반환 유형입니다.
F::GeneralizedEigen
이 분해 객체인 경우, 고유값은 F.values
를 통해 얻을 수 있으며, 고유벡터는 행렬 F.vectors
의 열로 얻을 수 있습니다. (k
번째 고유벡터는 슬라이스 F.vectors[:, k]
를 통해 얻을 수 있습니다.)
분해를 반복하면 구성 요소 F.values
와 F.vectors
가 생성됩니다.
예제
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B)
GeneralizedEigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
vectors:
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvals
— Functioneigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
행렬 A
의 고유값을 반환합니다.
일반 비대칭 행렬의 경우 고유값 계산 전에 행렬이 어떻게 균형을 이루는지 지정할 수 있습니다. permute
, scale
, 및 sortby
키워드는 eigen
와 동일합니다.
예제
julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
1 0
0 4
julia> eigvals(diag_matrix)
2-element Vector{Float64}:
1.0
4.0
스칼라 입력의 경우, eigvals
는 스칼라를 반환합니다.
예제
julia> eigvals(-2)
-2
eigvals(A, B) -> values
A
와 B
의 일반화된 고유값을 계산합니다.
예제
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> eigvals(A,B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
A
의 고유값을 반환합니다. 정렬된 고유값의 인덱스를 포함하는 UnitRange
irange
를 지정하여 고유값의 하위 집합만 계산할 수 있습니다. 예를 들어, 2번째에서 8번째 고유값을 계산할 수 있습니다.
예제
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, 2:2)
1-element Vector{Float64}:
0.9999999999999996
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
A
의 고유값을 반환합니다. 고유값의 하한과 상한을 지정하여 고유값의 하위 집합만 계산하는 것이 가능합니다.
예제
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
1.0000000000000009
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
LinearAlgebra.eigvals!
— Functioneigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values
eigvals
와 동일하지만, 입력 A
를 덮어써서 공간을 절약합니다. permute
, scale
, 및 sortby
키워드는 eigen
와 동일합니다.
eigvals!
가 호출된 후 입력 행렬 A
는 고유값을 포함하지 않습니다 - A
는 작업 공간으로 사용됩니다.
예제
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> eigvals!(A)
2-element Vector{Float64}:
-0.3722813232690143
5.372281323269014
julia> A
2×2 Matrix{Float64}:
-0.372281 -1.0
0.0 5.37228
eigvals!(A, B; sortby) -> values
eigvals
와 동일하지만, 복사본을 생성하는 대신 입력 A
(및 B
)를 덮어써서 공간을 절약합니다.
eigvals!
가 호출된 후 입력 행렬 A
와 B
는 고유값을 포함하지 않습니다. 이들은 작업 공간으로 사용됩니다.
예제
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> A
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 -0.0
julia> B
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
eigvals
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다. irange
는 검색할 고유값 인덱스의 범위입니다 - 예를 들어, 2번째에서 8번째 고유값까지입니다.
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
eigvals
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다. vl
은 고유값을 찾기 위한 구간의 하한이며, vu
는 상한입니다.
LinearAlgebra.eigmax
— Functioneigmax(A; permute::Bool=true, scale::Bool=true)
A
의 가장 큰 고유값을 반환합니다. 옵션 permute=true
는 행렬을 상삼각형에 더 가깝게 만들기 위해 행렬을 재배열하고, scale=true
는 행렬의 대각선 요소로 행렬을 스케일링하여 행과 열의 노름을 더 균등하게 만듭니다. A
의 고유값이 복소수인 경우 이 방법은 실패합니다. 복소수는 정렬할 수 없기 때문입니다.
예제
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmax(A)
1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmax(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A`는 복소수 고유값을 가질 수 없습니다.
Stacktrace:
[...]
LinearAlgebra.eigmin
— Functioneigmin(A; permute::Bool=true, scale::Bool=true)
A
의 가장 작은 고유값을 반환합니다. 옵션 permute=true
는 행렬을 상삼각형에 더 가깝게 만들기 위해 행렬을 재배열하고, scale=true
는 행렬의 대각선 요소로 행렬을 스케일링하여 행과 열의 노름을 더 비슷하게 만듭니다. A
의 고유값이 복소수인 경우 이 방법은 실패합니다. 복소수는 정렬할 수 없기 때문입니다.
예제
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmin(A)
-1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmin(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A`는 복소수 고유값을 가질 수 없습니다.
Stacktrace:
[...]
LinearAlgebra.eigvecs
— Functioneigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
행렬 M
을 반환하며, 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
행렬 A
의 고유벡터로 구성된 행렬 M
을 반환합니다. (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
을 반환하며, 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
— Functioneigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen
행렬 A
의 고유값 분해를 계산하여 고유값이 F.values
에, 고유벡터가 행렬 F.vectors
의 열에 포함된 Eigen
분해 객체 F
를 반환합니다. 이는 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
의 일반화된 고유값 분해를 계산하고, 일반화된 고유값이 F.values
에, 일반화된 고유벡터가 행렬 F.vectors
의 열에 포함된 GeneralizedEigen
분해 객체 F
를 반환합니다. 이는 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; # 반복을 통한 구조 분해
julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen
A
의 고유값 분해를 계산하고, 고유값은 F.values
에, 고유벡터는 행렬 F.vectors
의 열에 포함된 Eigen
분해 객체 F
를 반환합니다. (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
의 고유값 분해를 계산하고, 고유값을 F.values
에, 고유벡터를 행렬 F.vectors
의 열에 포함하는 Eigen
분해 객체 F
를 반환합니다. (k
번째 고유벡터는 슬라이스 F.vectors[:, k]
에서 얻을 수 있습니다.)
분해를 반복하면 구성 요소 F.values
와 F.vectors
를 생성합니다.
Eigen
객체에 대해 사용할 수 있는 함수는 inv
, det
, 및 isposdef
입니다.
vl
은 검색할 고유값의 윈도우의 하한이며, vu
는 상한입니다.
만약 [vl
, vu
]가 A
의 모든 고유값을 포함하지 않는다면, 반환된 분해는 잘린 분해가 됩니다.
LinearAlgebra.eigen!
— Functioneigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)
eigen
와 동일하지만, 복사본을 생성하는 대신 입력 A
(및 B
)를 덮어써서 공간을 절약합니다.
LinearAlgebra.Hessenberg
— TypeHessenberg <: Factorization
Hessenberg
객체는 정방 행렬의 Hessenberg 분해 QHQ'
또는 그에 대한 이동 Q(H+μI)Q'
를 나타내며, 이는 hessenberg
함수에 의해 생성됩니다.
LinearAlgebra.hessenberg
— Functionhessenberg(A) -> Hessenberg
행렬 A
의 헤센베르크 분해를 계산하고 Hessenberg
객체를 반환합니다. 만약 F
가 분해 객체라면, 유니타리 행렬은 F.Q
(타입 LinearAlgebra.HessenbergQ
)로 접근할 수 있으며, 헤센베르크 행렬은 F.H
(타입 UpperHessenberg
)로 접근할 수 있습니다. 이 두 행렬은 각각 Matrix(F.H)
또는 Matrix(F.Q)
를 사용하여 일반 행렬로 변환할 수 있습니다.
만약 A
가 Hermitian
또는 실수-Symmetric
이라면, 헤센베르크 분해는 실수-대칭 삼대각 행렬을 생성하며 F.H
는 타입 SymTridiagonal
입니다.
변형된 분해 A+μI = Q (H+μI) Q'
는 UniformScaling
객체 I
를 사용하여 F + μ*I
로 효율적으로 구성할 수 있으며, 이는 공유 저장소와 수정된 이동을 가진 새로운 Hessenberg
객체를 생성합니다. 주어진 F
의 이동은 F.μ
로 얻을 수 있습니다. 이는 여러 개의 이동된 해를 (F + μ*I) \ b
(다른 μ
및/또는 b
에 대해) 효율적으로 수행할 수 있기 때문에 유용합니다. F
가 생성된 후에 가능합니다.
분해를 반복하면 인수 F.Q, F.H, F.μ
를 생성합니다.
예제
julia> A = [4. 9. 7.; 4. 4. 1.; 4. 3. 2.]
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> F = hessenberg(A)
Hessenberg{Float64, UpperHessenberg{Float64, Matrix{Float64}}, Matrix{Float64}, Vector{Float64}, Bool}
Q factor: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
4.0 -11.3137 -1.41421
-5.65685 5.0 2.0
⋅ -8.88178e-16 1.0
julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> q, h = F; # 반복을 통한 구조 분해
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!
— Functionhessenberg!(A) -> 헤센베르크
hessenberg!
는 hessenberg
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다.
LinearAlgebra.Schur
— TypeSchur <: Factorization
행렬 A
의 슈르 분해의 행렬 분해 유형입니다. 이는 schur(_)
와 해당하는 행렬 분해 함수의 반환 유형입니다.
F::Schur
가 분해 객체인 경우, (준)삼각형 슈르 인자는 F.Schur
또는 F.T
를 통해 얻을 수 있으며, 직교/유니타리 슈르 벡터는 F.vectors
또는 F.Z
를 통해 얻을 수 있습니다. 따라서 A = F.vectors * F.Schur * F.vectors'
입니다. A
의 고유값은 F.values
로 얻을 수 있습니다.
분해를 반복하면 구성 요소 F.T
, F.Z
, 및 F.values
가 생성됩니다.
예제
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T 인자:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z 인자:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
고유값:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # 반복을 통한 구조 분해
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— TypeGeneralizedSchur <: Factorization
두 행렬 A
와 B
의 일반화된 슈르 분해의 행렬 분해 유형입니다. 이는 schur(_, _)
함수의 반환 유형입니다.
F::GeneralizedSchur
가 분해 객체인 경우, (준) 삼각 슈르 인자는 F.S
및 F.T
를 통해 얻을 수 있으며, 왼쪽 유니타리/직교 슈르 벡터는 F.left
또는 F.Q
를 통해, 오른쪽 유니타리/직교 슈르 벡터는 F.right
또는 F.Z
를 통해 얻을 수 있습니다. 이때 A=F.left*F.S*F.right'
및 B=F.left*F.T*F.right'
입니다. A
와 B
의 일반화된 고유값은 F.α./F.β
를 통해 얻을 수 있습니다.
분해를 반복하면 구성 요소 F.S
, F.T
, F.Q
, F.Z
, F.α
및 F.β
가 생성됩니다.
LinearAlgebra.schur
— Functionschur(A) -> F::Schur
행렬 A
의 슈르 분해를 계산합니다. (준)삼각형 슈르 인자는 F
라는 Schur
객체에서 F.Schur
또는 F.T
를 사용하여 얻을 수 있으며, 직교/유니타리 슈르 벡터는 F.vectors
또는 F.Z
를 사용하여 얻을 수 있습니다. 이때 A = F.vectors * F.Schur * F.vectors'
가 성립합니다. A
의 고유값은 F.values
를 사용하여 얻을 수 있습니다.
실수 A
의 경우, 슈르 분해는 "준삼각형"이며, 이는 복소수 고유값의 켤레 쌍에 대해 2×2 대각 블록이 있는 상삼각형임을 의미합니다. 이는 복소수 고유값이 있을 때에도 분해가 순수하게 실수일 수 있도록 합니다. 실수 준삼각형 분해에서 (복소수) 순수 상삼각형 슈르 분해를 얻으려면 Schur{Complex}(schur(A))
를 사용할 수 있습니다.
분해를 반복하면 구성 요소 F.T
, F.Z
, 및 F.values
가 생성됩니다.
예제
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T 인자:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z 인자:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
고유값:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # 반복을 통한 구조 분해
julia> t == F.T && z == F.Z && vals == F.values
true
schur(A, B) -> F::GeneralizedSchur
행렬 A
와 B
의 일반화된 슈르(또는 QZ) 분해를 계산합니다. (준)삼각 슈르 인자는 F
라는 Schur
객체에서 F.S
와 F.T
로 얻을 수 있으며, 왼쪽 유니타리/직교 슈르 벡터는 F.left
또는 F.Q
로, 오른쪽 유니타리/직교 슈르 벡터는 F.right
또는 F.Z
로 얻을 수 있습니다. 이때 A=F.left*F.S*F.right'
및 B=F.left*F.T*F.right'
입니다. A
와 B
의 일반화된 고유값은 F.α./F.β
로 얻을 수 있습니다.
분해를 반복하면 구성 요소 F.S
, F.T
, F.Q
, F.Z
, F.α
및 F.β
가 생성됩니다.
LinearAlgebra.schur!
— Functionschur!(A) -> F::Schur
입력 인수 A
를 작업 공간으로 사용하는 schur
와 동일합니다.
예제
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur!(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T 인자:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z 인자:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
고유값:
2-element Vector{Float64}:
3.0
-2.0
julia> 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
— Functionordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
행렬 A = Z*T*Z'
의 Schur 분해 F
를 논리 배열 select
에 따라 재정렬하여 재정렬된 분해 F
객체를 반환합니다. 선택된 고유값은 F.Schur
의 주 대각선에 나타나며, 해당하는 F.vectors
의 선두 열은 해당하는 오른쪽 불변 부분공간의 직교/유니타리 기저를 형성합니다. 실수의 경우, 복소수 켤레 쌍의 고유값은 select
를 통해 모두 포함되거나 모두 제외되어야 합니다.
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
행렬 쌍 (A, B) = (Q*S*Z', Q*T*Z')
의 일반화된 슈르 분해 F
를 논리 배열 select
에 따라 재정렬하고 일반화된 슈르 객체 F
를 반환합니다. 선택된 고유값은 F.S
와 F.T
의 주 대각선에 나타나며, 왼쪽 및 오른쪽 직교/유니타리 슈르 벡터도 재정렬되어 (A, B) = F.Q*(F.S, F.T)*F.Z'
가 여전히 성립하고 A
와 B
의 일반화된 고유값을 F.α./F.β
로 여전히 얻을 수 있습니다.
LinearAlgebra.ordschur!
— Functionordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
ordschur
와 동일하지만 인수 분해 F
를 덮어씁니다.
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
ordschur
와 동일하지만 인수 분해 F
를 덮어씁니다.
LinearAlgebra.SVD
— TypeSVD <: Factorization
행렬 A
의 특이값 분해(SVD)의 행렬 분해 유형입니다. 이는 svd(_)
함수의 반환 유형입니다.
F::SVD
가 분해 객체인 경우, 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
— TypeGeneralizedSVD <: 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
은 첫 K 항목에 1이 있는 M-by-(K+L) 대각 행렬입니다.D2
는 상단 오른쪽 L-by-L 블록이 대각선인 P-by-(K+L) 행렬입니다.R0
는 가장 오른쪽 (K+L)-by-(K+L) 블록이 비특이 상부 블록 삼각형인 (K+L)-by-N 행렬입니다.
K+L
은 행렬 [A; B]
의 유효 수치적 계수입니다.
분해를 반복하면 구성 요소 U
, V
, Q
, D1
, D2
, 및 R0
가 생성됩니다.
F.D1
과 F.D2
의 항목은 관련이 있으며, 이는 일반화된 SVD 및 그 아래에서 호출되는 xGGSVD3 루틴에 대한 LAPACK 문서에서 설명되어 있습니다( LAPACK 3.6.0 및 이후 버전).
예제
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
V factor:
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 0.0
Q factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
D1 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
D2 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
R0 factor:
2×2 Matrix{Float64}:
1.41421 0.0
0.0 -1.41421
julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
-0.0 1.0
1.0 0.0
LinearAlgebra.svd
— Functionsvd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
행렬 A
의 특이값 분해(SVD)를 계산하고 SVD
객체를 반환합니다.
U
, S
, V
및 Vt
는 F
의 분해에서 F.U
, F.S
, F.V
및 F.Vt
를 사용하여 얻을 수 있으며, 이때 A = U * Diagonal(S) * Vt
입니다. 알고리즘은 Vt
를 생성하므로 Vt
를 추출하는 것이 V
보다 더 효율적입니다. S
의 특이값은 내림차순으로 정렬되어 있습니다.
분해를 반복하면 구성 요소 U
, S
및 V
를 생성합니다.
full = false
(기본값)인 경우 "얇은" SVD가 반환됩니다. $M \times N$ 행렬 A
의 경우, 전체 분해에서 U
는 $M \times M$이고 V
는 $N \times N$이며, 얇은 분해에서 U
는 $M \times K$이고 V
는 $N \times K$입니다. 여기서 $K = \min(M,N)$는 특이값의 수입니다.
alg = DivideAndConquer()
인 경우 분할 정복 알고리즘을 사용하여 SVD를 계산합니다. 또 다른 옵션은 alg = QRIteration()
으로, 일반적으로 더 느리지만 더 정확합니다.
alg
키워드 인수는 Julia 1.3 이상이 필요합니다.
예제
julia> A = rand(4,3);
julia> F = svd(A); # 분해 객체 저장
julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true
julia> U, S, V = F; # 반복을 통한 구조 분해
julia> A ≈ U * Diagonal(S) * V'
true
julia> Uonly, = svd(A); # U만 저장
julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD
A
와 B
의 일반화된 SVD를 계산하여 F
라는 GeneralizedSVD
분해 객체를 반환합니다. 여기서 [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
은 첫 K 항목에 1이 있는 M-by-(K+L) 대각 행렬입니다.D2
는 상단 오른쪽 L-by-L 블록이 대각선인 P-by-(K+L) 행렬입니다.R0
는 가장 오른쪽 (K+L)-by-(K+L) 블록이 비특이 상부 블록 삼각형인 (K+L)-by-N 행렬입니다.
K+L
은 행렬 [A; B]
의 유효 수치적 계수입니다.
분해를 반복하면 구성 요소 U
, V
, Q
, D1
, D2
, 및 R0
가 생성됩니다.
일반화된 SVD는 A
와 B
의 비교가 필요할 때, 예를 들어 인간과 효모 유전체, 신호와 잡음, 또는 클러스터 간과 클러스터 내의 비교와 같은 응용 프로그램에서 사용됩니다. (논의는 Edelman과 Wang을 참조하십시오: https://arxiv.org/abs/1901.00485)
이것은 [A; B]
를 [UC; VS]H
로 분해하며, 여기서 [UC; VS]
는 [A; B]
의 열 공간에 대한 자연스러운 직교 기저이고, H = RQ'
는 [A;B]
의 행 공간에 대한 자연스러운 비직교 기저입니다. 여기서 상단 행은 A
행렬에 가장 밀접하게 귀속되고, 하단 행은 B
행렬에 귀속됩니다. 다중 코사인/사인 행렬 C
와 S
는 A
와 B
의 비율을 측정하는 다중 측정을 제공합니다. U
와 V
는 이러한 측정이 이루어지는 방향을 제공합니다.
예제
julia> A = randn(3,2); B=randn(4,2);
julia> F = svd(A, B);
julia> U,V,Q,C,S,R = F;
julia> H = R*Q';
julia> [A; B] ≈ [U*C; V*S]*H
true
julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true
julia> Uonly, = svd(A,B);
julia> U == Uonly
true
LinearAlgebra.svd!
— Functionsvd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
svd!
는 svd
와 동일하지만, 복사본을 생성하는 대신 입력 A
를 덮어써서 공간을 절약합니다. 자세한 내용은 svd
문서를 참조하세요.
svd!(A, B) -> GeneralizedSVD
svd!
는 svd
와 동일하지만, 복사본을 만드는 대신 인수 A
와 B
를 제자리에서 수정합니다. 자세한 내용은 svd
문서를 참조하십시오.
LinearAlgebra.svdvals
— Functionsvdvals(A)
A
의 특이값을 내림차순으로 반환합니다.
예제
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> svdvals(A)
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
svdvals(A, B)
A
와 B
의 일반화된 특이값 분해에서 일반화된 특이값을 반환합니다. svd
도 참조하십시오.
예제
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> svdvals(A, B)
2-element Vector{Float64}:
1.0
1.0
LinearAlgebra.svdvals!
— FunctionLinearAlgebra.Givens
— TypeLinearAlgebra.Givens(i1,i2,c,s) -> G
Givens 회전 선형 연산자입니다. 필드 c
와 s
는 각각 회전 각도의 코사인과 사인을 나타냅니다. Givens
타입은 왼쪽 곱셈 G*A
와 켤레 전치 오른쪽 곱셈 A*G'
을 지원합니다. 이 타입은 size
가 없으므로 G*A
의 경우 i2<=size(A,2)
또는 A*G'
의 경우 i2<=size(A,1)
인 한 임의의 크기의 행렬과 곱할 수 있습니다.
자세한 내용은 givens
를 참조하세요.
LinearAlgebra.givens
— Functiongivens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)
주어진 f
와 g
에 대해 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
— Functiontriu(M)
행렬의 상삼각.
예제
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
0.0 1.0 1.0 1.0
0.0 0.0 1.0 1.0
0.0 0.0 0.0 1.0
triu(M, k::Integer)
k
번째 초대각선에서 시작하는 M
의 상삼각행렬을 반환합니다.
예제
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a,3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
julia> triu(a,-3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
LinearAlgebra.triu!
— Functiontriu!(M)
행렬의 상삼각을 구하고, 그 과정에서 M
을 덮어씁니다. 또한 triu
를 참조하세요.
triu!(M, k::Integer)
M
의 k
번째 초대각선에서 시작하는 상삼각행렬을 반환하며, 이 과정에서 M
을 덮어씁니다.
예제
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> triu!(M, 1)
5×5 Matrix{Int64}:
0 2 3 4 5
0 0 3 4 5
0 0 0 4 5
0 0 0 0 5
0 0 0 0 0
LinearAlgebra.tril
— Functiontril(M)
행렬의 하삼각.
예제
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a)
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
1.0 1.0 0.0 0.0
1.0 1.0 1.0 0.0
1.0 1.0 1.0 1.0
tril(M, k::Integer)
k
번째 초대각선에서 시작하는 M
의 하삼각형을 반환합니다.
예제
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,-3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
1.0 0.0 0.0 0.0
LinearAlgebra.tril!
— Functiontril!(M)
행렬의 하삼각을 구하고 그 과정에서 M
을 덮어씁니다. 또한 tril
를 참조하세요.
tril!(M, k::Integer)
M
의 k
번째 초대각선에서 시작하는 하삼각행렬을 반환하며, 이 과정에서 M
을 덮어씁니다.
예제
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> tril!(M, 2)
5×5 Matrix{Int64}:
1 2 3 0 0
1 2 3 4 0
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
LinearAlgebra.diagind
— Functiondiagind(M::AbstractMatrix, k::Integer = 0, indstyle::IndexStyle = IndexLinear())
diagind(M::AbstractMatrix, indstyle::IndexStyle = IndexLinear())
행렬 M
의 k
번째 대각선의 인덱스를 제공하는 AbstractRange
입니다. 선택적으로 인덱스 스타일을 지정할 수 있으며, 이는 반환되는 범위의 유형을 결정합니다. indstyle isa IndexLinear
(기본값)인 경우, 이는 AbstractRange{Integer}
를 반환합니다. 반면에 indstyle isa IndexCartesian
인 경우, 이는 AbstractRange{CartesianIndex{2}}
를 반환합니다.
k
가 제공되지 않으면 0
(주 대각선에 해당)으로 간주됩니다.
예제
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diagind(A, -1)
2:4:6
julia> diagind(A, IndexCartesian())
StepRangeLen(CartesianIndex(1, 1), CartesianIndex(1, 1), 3)
IndexStyle
를 지정하려면 최소한 Julia 1.11이 필요합니다.
LinearAlgebra.diag
— Functiondiag(M, k::Integer=0)
행렬의 k
번째 대각선, 벡터로.
또한 diagm
, diagind
, Diagonal
, isdiag
를 참조하세요.
예제
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diag(A,1)
2-element Vector{Int64}:
2
6
LinearAlgebra.diagm
— Functiondiagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
`Pair`의 대각선과 벡터로부터 행렬을 구성합니다. 벡터 `kv.second`는 `kv.first` 대각선에 배치됩니다. 기본적으로 행렬은 정사각형이며 그 크기는 `kv`로부터 유추되지만, 필요에 따라 0으로 패딩된 비정사각형 크기 `m`×`n`을 첫 번째 인수로 `m,n`을 전달하여 지정할 수 있습니다. 반복된 대각선 인덱스 `kv.first`에 대해 해당 벡터 `kv.second`의 값이 더해집니다.
`diagm`은 전체 행렬을 구성합니다; 저장 효율적인 버전과 빠른 산술 연산을 원하신다면 [`Diagonal`](@ref), [`Bidiagonal`](@ref), [`Tridiagonal`](@ref) 및 [`SymTridiagonal`](@ref)를 참조하세요.
# 예제
jldoctest julia> diagm(1 => [1,2,3]) 4×4 Matrix{Int64}: 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0
julia> diagm(1 => [1,2,3], -1 => [4,5]) 4×4 Matrix{Int64}: 0 1 0 0 4 0 2 0 0 5 0 3 0 0 0 0
julia> diagm(1 => [1,2,3], 1 => [1,2,3]) 4×4 Matrix{Int64}: 0 2 0 0 0 0 4 0 0 0 0 6 0 0 0 0 ```
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)
벡터의 요소를 대각선 요소로 갖는 행렬을 생성합니다. 기본적으로 행렬은 정사각형이며 크기는 length(v)
로 주어지지만, 비정사각형 크기 m
×n
는 첫 번째 인수로 m,n
을 전달하여 지정할 수 있습니다.
예제
julia> diagm([1,2,3])
3×3 Matrix{Int64}:
1 0 0
0 2 0
0 0 3
LinearAlgebra.rank
— Functionrank(::QRSparse{Tv,Ti}) -> Ti
QR 분해의 랭크를 반환합니다.
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
S
의 랭크를 QR 분해를 통해 계산합니다. tol
보다 작은 값은 0으로 간주됩니다. SPQR 매뉴얼을 참조하세요.
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)
행렬의 수치적 랭크를 계산하여 svdvals(A)
의 출력 중 max(atol, rtol*σ₁)
보다 큰 값의 개수를 셉니다. 여기서 σ₁
은 A
의 가장 큰 계산된 특이값입니다. atol
과 rtol
은 각각 절대 및 상대 허용오차입니다. 기본 상대 허용오차는 n*ϵ
이며, 여기서 n
은 A
의 가장 작은 차원의 크기이고, ϵ
는 A
의 요소 유형의 eps
입니다.
수치적 랭크는 특이값이 임계 허용오차 max(atol, rtol*σ₁)
에 가까운 잘못된 조건의 행렬에 대해 민감하고 부정확한 특성화가 될 수 있습니다. 이러한 경우, 특이값 계산이나 행렬에 대한 약간의 섭동이 하나 이상의 특이값을 임계값을 넘어 이동시켜 rank
의 결과를 변경할 수 있습니다. 이러한 변동은 서로 다른 Julia 버전, 아키텍처, 컴파일러 또는 운영 체제 간의 부동 소수점 오류의 변화로 인해 발생할 수 있습니다.
atol
및 rtol
키워드 인자는 최소한 Julia 1.1이 필요합니다. Julia 1.0에서는 rtol
이 위치 인자로 사용 가능하지만, 이는 Julia 2.0에서 더 이상 지원되지 않을 예정입니다.
예제
julia> rank(Matrix(I, 3, 3))
3
julia> rank(diagm(0 => [1, 0, 2]))
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3
julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5)
1
LinearAlgebra.norm
— Functionnorm(A, p::Real=2)
어떤 숫자의 반복 가능한 컨테이너 A
(모든 차원의 배열 포함)에 대해 p
-노름(p=2
로 기본 설정됨)을 계산합니다. 이는 A
가 해당 길이의 벡터인 것처럼 처리됩니다.
p
-노름은 다음과 같이 정의됩니다.
\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]
여기서 $a_i$는 A
의 항목, $| a_i |$는 norm
$a_i$의 노름, $n$은 A
의 길이입니다. p
-노름은 A
의 항목의 norm
을 사용하여 계산되므로, p != 2
인 경우 벡터의 벡터로서의 해석과 호환되지 않습니다.
p
는 어떤 숫자 값도 가질 수 있습니다(모든 값이 수학적으로 유효한 벡터 노름을 생성하는 것은 아닙니다). 특히, norm(A, Inf)
는 abs.(A)
에서 가장 큰 값을 반환하고, norm(A, -Inf)
는 가장 작은 값을 반환합니다. 만약 A
가 행렬이고 p=2
라면, 이는 프로베니우스 노름과 동등합니다.
두 번째 인수 p
는 반드시 norm
의 인터페이스의 일부가 아닙니다. 즉, 사용자 정의 유형은 두 번째 인수 없이 norm(A)
만 구현할 수 있습니다.
행렬의 연산자 노름을 계산하려면 opnorm
를 사용하십시오.
예제
julia> v = [3, -2, 6]
3-element Vector{Int64}:
3
-2
6
julia> norm(v)
7.0
julia> norm(v, 1)
11.0
julia> norm(v, Inf)
6.0
julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134
julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134
julia> norm(1:9)
16.881943016134134
julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true
julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true
julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
norm(x::Number, p::Real=2)
숫자의 경우, $\left( |x|^p \right)^{1/p}$를 반환합니다.
예제
julia> norm(2, 1)
2.0
julia> norm(-2, 1)
2.0
julia> norm(2, 2)
2.0
julia> norm(-2, 2)
2.0
julia> norm(2, Inf)
2.0
julia> norm(-2, Inf)
2.0
LinearAlgebra.opnorm
— Functionopnorm(A::AbstractMatrix, p::Real=2)
벡터 p
-노름에 의해 유도된 연산자 노름(또는 행렬 노름)을 계산합니다. 여기서 유효한 p
값은 1
, 2
, 또는 Inf
입니다. (희소 행렬의 경우, 현재 p=2
는 구현되어 있지 않습니다.) 프로베니우스 노름을 계산하기 위해 norm
를 사용하십시오.
p=1
일 때, 연산자 노름은 A
의 최대 절대 열 합계입니다:
\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]
여기서 $a_{ij}$는 $A$의 항목이며, $m$과 $n$은 그 차원입니다.
p=2
일 때, 연산자 노름은 스펙트럴 노름으로, A
의 가장 큰 특이값과 같습니다.
p=Inf
일 때, 연산자 노름은 A
의 최대 절대 행 합계입니다:
\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]
예제
julia> A = [1 -2 -3; 2 3 -1]
2×3 Matrix{Int64}:
1 -2 -3
2 3 -1
julia> opnorm(A, Inf)
6.0
julia> opnorm(A, 1)
5.0
opnorm(x::Number, p::Real=2)
숫자의 경우, $\left( |x|^p \right)^{1/p}$를 반환합니다. 이는 norm
와 동일합니다.
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)
Adjoint/Transpose로 감싸진 벡터의 경우, A
의 연산자 $q$-노름을 반환하며, 이는 p
-노름과 동등하며 값은 p = q/(q-1)
입니다. 이들은 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!
— Functionnormalize!(a::AbstractArray, p::Real=2)
배열 a
를 제자리에서 정규화하여 p
-노름이 1이 되도록 합니다. 즉, norm(a, p) == 1
입니다. 또한 normalize
및 norm
를 참조하십시오.
LinearAlgebra.normalize
— Functionnormalize(a, p::Real=2)
a
를 정규화하여 p
-노름이 1이 되도록 합니다. 즉, norm(a, p) == 1
입니다. 스칼라의 경우, 이는 sign(a)
와 유사하지만, normalize(0) = NaN
입니다. normalize!
, norm
, 및 sign
도 참조하십시오.
예제
julia> a = [1,2,4];
julia> b = normalize(a)
3-element Vector{Float64}:
0.2182178902359924
0.4364357804719848
0.8728715609439696
julia> norm(b)
1.0
julia> c = normalize(a, 1)
3-element Vector{Float64}:
0.14285714285714285
0.2857142857142857
0.5714285714285714
julia> norm(c, 1)
1.0
julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
1 2 4
1 2 4
julia> norm(a)
6.48074069840786
julia> normalize(a)
2×3 Matrix{Float64}:
0.154303 0.308607 0.617213
0.154303 0.308607 0.617213
julia> normalize(3, 1)
1.0
julia> normalize(-8, 1)
-1.0
julia> normalize(0, 1)
NaN
LinearAlgebra.cond
— Functioncond(M, p::Real=2)
행렬 M
의 조건 수로, 연산자 p
-노름을 사용하여 계산됩니다. p
의 유효한 값은 1
, 2
(기본값) 또는 Inf
입니다.
LinearAlgebra.condskeel
— Functioncondskeel(M, [x, p::Real=Inf])
\[\kappa_S(M, p) = \left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \right\Vert_p \\ \kappa_S(M, x, p) = \frac{\left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \left\vert x \right\vert \right\Vert_p}{\left \Vert x \right \Vert_p}\]
행렬 M
의 Skeel 조건 수 $\kappa_S$는 선택적으로 벡터 x
에 대해 계산되며, 연산자 p
-노름을 사용합니다. $\left\vert M \right\vert$는 $M$의 (항목별) 절대값 행렬을 나타내며; \left\vert M \right\vert{ij} = \left\vert M{ij} \right\vert. p
의 유효한 값은 1
, 2
및 Inf
(기본값)입니다.
이 양은 문헌에서 바우어 조건 수, 상대 조건 수 또는 항목별 상대 조건 수로도 알려져 있습니다.
LinearAlgebra.tr
— Functiontr(M)
행렬의 자취. M
의 대각선 요소를 합산합니다.
예제
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.det
— Functiondet(M)
행렬의 행렬식.
예제
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdet
— Functionlogdet(M)
행렬 행렬식의 로그. log(det(M))
와 동등하지만, 정확성을 높이고 오버플로우/언더플로우를 피할 수 있습니다.
예제
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> logdet(M)
0.6931471805599453
julia> logdet(Matrix(I, 3, 3))
0.0
LinearAlgebra.logabsdet
— Functionlogabsdet(M)
행렬 행렬식의 절대값의 로그. (log(abs(det(M))), sign(det(M)))
와 동등하지만, 정확도 및/또는 속도가 향상될 수 있습니다.
예제
julia> A = [-1. 0.; 0. 1.]
2×2 Matrix{Float64}:
-1.0 0.0
0.0 1.0
julia> det(A)
-1.0
julia> logabsdet(A)
(0.0, -1.0)
julia> B = [2. 0.; 0. 1.]
2×2 Matrix{Float64}:
2.0 0.0
0.0 1.0
julia> det(B)
2.0
julia> logabsdet(B)
(0.6931471805599453, 1.0)
Base.inv
— Methodinv(M)
행렬의 역행렬. 행렬 M
에 대해 M * N = I
가 성립하는 행렬 N
을 계산합니다. 여기서 I
는 단위 행렬입니다. 왼쪽 나눗셈 N = M \ I
를 풀어서 계산됩니다.
예제
julia> M = [2 5; 1 3]
2×2 Matrix{Int64}:
2 5
1 3
julia> N = inv(M)
2×2 Matrix{Float64}:
3.0 -5.0
-1.0 2.0
julia> M*N == N*M == Matrix(I, 2, 2)
true
LinearAlgebra.pinv
— Functionpinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # to be deprecated in Julia 2.0
Moore-Penrose 의사역행렬을 계산합니다.
부동 소수점 요소를 가진 행렬 M
의 경우, σ₁
이 M
의 가장 큰 특이값일 때, max(atol, rtol*σ₁)
보다 큰 특이값만 역전시켜 의사역행렬을 계산하는 것이 편리합니다.
절대 허용오차(atol
)와 상대 허용오차(rtol
)의 최적 선택은 M
의 값과 의사역행렬의 의도된 응용에 따라 다릅니다. 기본 상대 허용오차는 n*ϵ
이며, 여기서 n
은 M
의 가장 작은 차원의 크기이고, ϵ
는 M
의 요소 유형의 eps
입니다.
밀집한 조건이 좋지 않은 행렬을 최소 제곱 방식으로 역전할 때는 rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
를 권장합니다.
자세한 내용은 [issue8859], [B96], [S84], [KY88]를 참조하십시오.
예제
julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
1.5 1.3
1.2 1.9
julia> N = pinv(M)
2×2 Matrix{Float64}:
1.47287 -1.00775
-0.930233 1.16279
julia> M * N
2×2 Matrix{Float64}:
1.0 -2.22045e-16
4.44089e-16 1.0
LinearAlgebra.nullspace
— Functionnullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # to be deprecated in Julia 2.0
M
의 널 공간에 대한 기저를 계산합니다. 여기서 M
의 특이값 중 크기가 max(atol, rtol*σ₁)
보다 작은 특이 벡터를 포함합니다. 여기서 σ₁
은 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
— Functionkron(A, B)
두 벡터, 행렬 또는 숫자의 크로네커 곱을 계산합니다.
실수 벡터 v
와 w
에 대해, 크로네커 곱은 외적과 관련이 있으며 kron(v,w) == vec(w * transpose(v))
또는 w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
로 표현됩니다. 이러한 표현의 왼쪽과 오른쪽에서 v
와 w
의 순서가 다름을 주목하세요(열 우선 저장 방식 때문입니다). 복소수 벡터의 경우, 외적 w * v'
는 v
의 켤레에 의해 다릅니다.
예제
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 1+0im
1+0im 0-1im
julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
0+1im 1+0im 0+2im 2+0im
1+0im 0-1im 2+0im 0-2im
0+3im 3+0im 0+4im 4+0im
3+0im 0-3im 4+0im 0-4im
julia> v = [1, 2]; w = [3, 4, 5];
julia> w*transpose(v)
3×2 Matrix{Int64}:
3 6
4 8
5 10
julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
3 6
4 8
5 10
Base.kron!
— Functionkron!(C, A, B)
A
와 B
의 크로네커 곱을 계산하고 결과를 C
에 저장하여 C
의 기존 내용을 덮어씁니다. 이것은 kron
의 제자리 버전입니다.
이 함수는 Julia 1.6 이상이 필요합니다.
Base.exp
— Methodexp(A::AbstractMatrix)
행렬 A
의 지수 행렬을 계산합니다. 이는 다음과 같이 정의됩니다.
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
대칭 또는 에르미트 행렬 A
의 경우 고유 분해(eigen
)가 사용되며, 그렇지 않은 경우 스케일링 및 제곱 알고리즘이 선택됩니다(자세한 내용은 [H05] 참조).
예제
julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
julia> exp(A)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
Base.cis
— Methodcis(A::AbstractMatrix)
정사각형 행렬 A
의 exp(im*A)
에 대한 더 효율적인 방법 (특히 A
가 Hermitian
또는 실수 Symmetric
인 경우).
또한 cispi
, sincos
, exp
를 참조하십시오.
행렬과 함께 cis
를 사용하는 지원이 Julia 1.7에 추가되었습니다.
예제
julia> cis([π 0; 0 π]) ≈ -I
true
Base.:^
— Method^(A::AbstractMatrix, p::Number)
행렬 거듭제곱, $\exp(p\log(A))$와 동등함
예제
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^
— Method^(b::Number, A::AbstractMatrix)
행렬 지수, $\exp(\log(b)A)$와 동등합니다.
Irrational
숫자(예: ℯ
)를 행렬로 올리는 지원이 Julia 1.1에 추가되었습니다.
예제
julia> 2^[1 2; 0 3]
2×2 Matrix{Float64}:
2.0 6.0
0.0 8.0
julia> ℯ^[1 2; 0 3]
2×2 Matrix{Float64}:
2.71828 17.3673
0.0 20.0855
Base.log
— Methodlog(A::AbstractMatrix)
A
에 음의 실 고유값이 없으면, A
의 주 행렬 로그를 계산합니다. 즉, $e^X = A$이고 모든 고유값 $\lambda$에 대해 $-\pi < Im(\lambda) < \pi$인 유일한 행렬 $X$를 계산합니다. A
에 비양수 고유값이 있는 경우, 가능한 경우 비주 행렬 함수가 반환됩니다.
A
가 대칭 또는 에르미트인 경우, 그 고유 분해(eigen
)가 사용되며, A
가 삼각형인 경우에는 개선된 역 스케일링 및 제곱 방법이 사용됩니다(자세한 내용은 [AH12] 및 [AHR13] 참조). A
가 음의 고유값이 없는 실수인 경우, 실 슈르 형식이 계산됩니다. 그렇지 않으면 복소 슈르 형식이 계산됩니다. 그런 다음 [AHR13]의 상부 (준)삼각형 알고리즘이 상부 (준)삼각형 요소에 사용됩니다.
예제
julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
julia> log(A)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
Base.sqrt
— Methodsqrt(x)
Return $\sqrt{x}$.
음수 Real
인수에 대해 DomainError
를 발생시킵니다. 대신 복소수 음수 인수를 사용하세요. sqrt
는 음의 실수 축을 따라 분기 절단이 있음을 유의하세요.
접두사 연산자 √
는 sqrt
와 동일합니다.
참고: hypot
.
예제
julia> sqrt(big(81))
9.0
julia> sqrt(big(-81))
ERROR: DomainError with -81.0:
NaN result for non-NaN input.
Stacktrace:
[1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]
julia> sqrt(big(complex(-81)))
0.0 + 9.0im
julia> sqrt(-81 - 0.0im) # -0.0im은 분기 절단 아래에 있습니다
0.0 - 9.0im
julia> .√(1:4)
4-element Vector{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
sqrt(A::AbstractMatrix)
A
에 음의 실 고유값이 없으면, A
의 주 행렬 제곱근을 계산합니다. 즉, $X^2 = A$를 만족하고 고유값이 양의 실수 부분을 가지는 유일한 행렬 $X$입니다. 그렇지 않으면 비주 행렬 제곱근이 반환됩니다.
A
가 실 대칭 행렬이거나 에르미트 행렬인 경우, 고유 분해(eigen
)를 사용하여 제곱근을 계산합니다. 이러한 행렬의 경우, 반올림 오류로 인해 약간 음수로 나타나는 고유값 λ는 0으로 간주됩니다. 보다 정확하게, 모든 고유값이 ≥ -rtol*(max |λ|)
인 행렬은 반정의로 간주되어 (에르미트 제곱근을 생성함) 음의 고유값은 0으로 취급됩니다. rtol
은 sqrt
의 키워드 인수(에르미트/실 대칭 경우에만)로, 기본값은 size(A,1)
에 의해 조정된 기계 정밀도입니다.
그렇지 않은 경우, 제곱근은 Björck-Hammarling 방법 [BH83]에 의해 결정되며, 이는 복소수 슈르 형식(schur
)을 계산한 다음 삼각 인자의 복소수 제곱근을 계산합니다. 실 제곱근이 존재하는 경우, 이 방법의 확장 [H87]이 사용되어 실 슈르 형식을 계산한 다음 준삼각 인자의 실 제곱근을 계산합니다.
예제
julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
4 0
0 4
julia> sqrt(A)
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
Base.Math.cbrt
— Methodcbrt(A::AbstractMatrix{<:Real})
실수 행렬 A
의 실수 값 세제곱근을 계산합니다. T = cbrt(A)
인 경우, T*T*T ≈ A
가 성립합니다. 아래에 주어진 예를 참조하십시오.
A
가 대칭인 경우, 즉 HermOrSym{<:Real}
유형인 경우 (eigen
)를 사용하여 세제곱근을 찾습니다. 그렇지 않으면, p-번째 근 알고리즘의 특수화된 버전 [S03]이 사용되며, 이는 실수 값 슈르 분해 (schur
)를 활용하여 세제곱근을 계산합니다.
예제
julia> A = [0.927524 -0.15857; -1.3677 -1.01172]
2×2 Matrix{Float64}:
0.927524 -0.15857
-1.3677 -1.01172
julia> T = cbrt(A)
2×2 Matrix{Float64}:
0.910077 -0.151019
-1.30257 -0.936818
julia> T*T*T ≈ A
true
Base.cos
— Methodcos(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 코사인을 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 코사인을 계산합니다. 그렇지 않으면, 코사인은 exp
를 호출하여 결정됩니다.
예제
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sin
— Methodsin(A::AbstractMatrix)
정방 행렬 A
의 행렬 사인 값을 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 사인을 계산합니다. 그렇지 않으면, exp
를 호출하여 사인을 결정합니다.
예제
julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
Base.Math.sincos
— Methodsincos(A::AbstractMatrix)
정사각 행렬 A
의 행렬 사인과 코사인을 계산합니다.
예제
julia> S, C = sincos(fill(1.0, (2,2)));
julia> S
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
julia> C
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.tan
— Methodtan(A::AbstractMatrix)
정방 행렬 A
의 행렬 탄젠트를 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 탄젠트를 계산합니다. 그렇지 않으면, exp
를 호출하여 탄젠트를 결정합니다.
예제
julia> tan(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
-1.09252 -1.09252
-1.09252 -1.09252
Base.Math.sec
— Methodsec(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 시컨트를 계산합니다.
Base.Math.csc
— Methodcsc(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 코시컨을 계산합니다.
Base.Math.cot
— Methodcot(A::AbstractMatrix)
정사각 행렬 A
의 행렬 코탄젠트를 계산합니다.
Base.cosh
— Methodcosh(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 쌍곡선 코사인 값을 계산합니다.
Base.sinh
— Methodsinh(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 쌍곡선 사인(hyperbolic sine)을 계산합니다.
Base.tanh
— Methodtanh(A::AbstractMatrix)
정사각형 행렬 A
의 행렬 쌍곡선 탄젠트를 계산합니다.
Base.Math.sech
— Methodsech(A::AbstractMatrix)
정방 행렬 A
의 행렬 쌍곡선 시컨트를 계산합니다.
Base.Math.csch
— Methodcsch(A::AbstractMatrix)
정방 행렬 A
의 행렬 쌍곡선 코시컨트를 계산합니다.
Base.Math.coth
— Methodcoth(A::AbstractMatrix)
정방 행렬 A
의 행렬 쌍곡선 코탄젠트를 계산합니다.
Base.acos
— Methodacos(A::AbstractMatrix)
정사각형 행렬 A
의 역행렬 코사인을 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 역 코사인을 계산합니다. 그렇지 않은 경우, 역 코사인은 log
와 sqrt
를 사용하여 결정됩니다. 이 함수를 계산하는 데 사용되는 이론 및 로그 공식에 대한 내용은 [AH16_1]을 참조하십시오.
예제
julia> acos(cos([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-8.32667e-17im 0.1+0.0im
-0.2+2.63678e-16im 0.3-3.46945e-16im
Base.asin
— Methodasin(A::AbstractMatrix)
정사각형 행렬 A
의 역행렬 사인 값을 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 역 사인을 계산합니다. 그렇지 않으면, 역 사인은 log
와 sqrt
를 사용하여 결정됩니다. 이 함수의 계산에 사용되는 이론과 로그 공식에 대한 내용은 [AH16_2]를 참조하십시오.
예제
julia> asin(sin([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-4.16334e-17im 0.1-5.55112e-17im
-0.2+9.71445e-17im 0.3-1.249e-16im
Base.atan
— Methodatan(A::AbstractMatrix)
정방 행렬 A
의 역행렬 탄젠트를 계산합니다.
A
가 대칭 또는 에르미트인 경우, 고유 분해(eigen
)를 사용하여 역 탄젠트를 계산합니다. 그렇지 않은 경우, 역 탄젠트는 log
를 사용하여 결정됩니다. 이 함수의 계산에 사용되는 이론 및 로그 공식에 대한 내용은 [AH16_3]을 참조하십시오.
예제
julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5+1.38778e-17im 0.1-2.77556e-17im
-0.2+6.93889e-17im 0.3-4.16334e-17im
Base.Math.asec
— Methodasec(A::AbstractMatrix)
행렬 A
의 역행렬 시컨트를 계산합니다.
Base.Math.acsc
— Methodacsc(A::AbstractMatrix)
행렬 A
의 역행렬 코시컨트를 계산합니다.
Base.Math.acot
— Methodacot(A::AbstractMatrix)
행렬 A
의 역행렬 코탄젠트를 계산합니다.
Base.acosh
— Methodacosh(A::AbstractMatrix)
정사각형 행렬 A
의 역 쌍곡선 코사인 행렬을 계산합니다. 이 함수를 계산하는 데 사용되는 이론 및 로그 공식에 대해서는 [AH16_4]를 참조하십시오.
Base.asinh
— Methodasinh(A::AbstractMatrix)
정사각형 행렬 A
의 역쌍곡선 행렬 사인 값을 계산합니다. 이 함수를 계산하는 데 사용되는 이론 및 로그 공식에 대해서는 [AH16_5]를 참조하십시오.
Base.atanh
— Methodatanh(A::AbstractMatrix)
정사각형 행렬 A
의 역 쌍곡선 행렬 탄젠트를 계산합니다. 이 함수를 계산하는 데 사용되는 이론과 로그 공식에 대해서는 [AH16_6]를 참조하십시오.
Base.Math.asech
— Methodasech(A::AbstractMatrix)
행렬 A
의 역행렬 쌍곡선 시컨트를 계산합니다.
Base.Math.acsch
— Methodacsch(A::AbstractMatrix)
행렬 A
의 역행렬 쌍곡선 코시컨트 값을 계산합니다.
Base.Math.acoth
— Methodacoth(A::AbstractMatrix)
행렬 A
의 역행렬 쌍곡선 코탄젠트를 계산합니다.
LinearAlgebra.lyap
— Functionlyap(A, C)
연속 리아푸노프 방정식 AX + XA' + C = 0
의 해 X
를 계산합니다. 여기서 A
의 고유값 중 어떤 것도 실수가 0인 부분을 가지지 않으며, 두 개의 고유값이 서로 음의 복소수 켤레가 아닙니다.
예제
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> X = lyap(A, B)
2×2 Matrix{Float64}:
0.5 -0.5
-0.5 0.25
julia> A*X + X*A' ≈ -B
true
LinearAlgebra.sylvester
— Functionsylvester(A, B, C)
실베스터 방정식 AX + XB + C = 0
의 해 X
를 계산합니다. 여기서 A
, B
및 C
는 호환 가능한 차원을 가지며 A
와 -B
는 실수가 같은 고유값을 가지지 않습니다.
예제
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
1.0 2.0
-2.0 1.0
julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
-4.46667 1.93333
3.73333 -1.8
julia> A*X + X*B ≈ -C
true
LinearAlgebra.issuccess
— Functionissuccess(F::Factorization)
행렬의 인수가 성공적으로 이루어졌는지 테스트합니다.
issuccess(::CholeskyPivoted)
는 Julia 1.6 이상이 필요합니다.
예제
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
true
issuccess(F::LU; allowsingular = false)
행렬의 LU 분해가 성공했는지 테스트합니다. 기본적으로 유효하지만 랭크가 부족한 U 인자를 생성하는 분해는 실패로 간주됩니다. allowsingular = true
를 전달하여 이를 변경할 수 있습니다.
allowsingular
키워드 인자는 Julia 1.11에서 추가되었습니다.
예제
julia> F = lu([1 2; 1 2], check = false);
julia> issuccess(F)
false
julia> issuccess(F, allowsingular = true)
true
LinearAlgebra.issymmetric
— Functionissymmetric(A) -> Bool
행렬이 대칭인지 테스트합니다.
예제
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> issymmetric(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> issymmetric(b)
false
LinearAlgebra.isposdef
— Functionisposdef(A) -> Bool
행렬이 양의 정부호(및 에르미트)인지 확인하기 위해 A
의 콜레스키 분해를 시도합니다.
자세한 내용은 isposdef!
, cholesky
를 참조하세요.
예제
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!
— Functionisposdef!(A) -> Bool
행렬이 양의 정부호(및 에르미트)인지 확인하기 위해 A
의 Cholesky 분해를 시도하여 A
를 덮어씁니다. isposdef
도 참조하십시오.
예제
julia> A = [1. 2.; 2. 50.];
julia> isposdef!(A)
true
julia> A
2×2 Matrix{Float64}:
1.0 2.0
2.0 6.78233
LinearAlgebra.istril
— Functionistril(A::AbstractMatrix, k::Integer = 0) -> Bool
A
가 k
번째 초대각선에서 시작하는 하삼각 행렬인지 테스트합니다.
예제
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istril(a)
false
julia> istril(a, 1)
true
julia> c = [1 1 0; 1 1 1; 1 1 1]
3×3 Matrix{Int64}:
1 1 0
1 1 1
1 1 1
julia> istril(c)
false
julia> istril(c, 1)
true
LinearAlgebra.istriu
— Functionistriu(A::AbstractMatrix, k::Integer = 0) -> Bool
A
가 k
번째 초대각선에서 시작하는 상삼각행렬인지 테스트합니다.
예시
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istriu(a)
false
julia> istriu(a, -1)
true
julia> c = [1 1 1; 1 1 1; 0 1 1]
3×3 Matrix{Int64}:
1 1 1
1 1 1
0 1 1
julia> istriu(c)
false
julia> istriu(c, -1)
true
LinearAlgebra.isdiag
— Functionisdiag(A) -> Bool
행렬이 대각선인지 테스트합니다. 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
— Functionishermitian(A) -> Bool
행렬이 에르미트인지 테스트합니다.
예시
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> ishermitian(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> ishermitian(b)
true
Base.transpose
— Functiontranspose(A)
지연 전치. 반환된 객체를 변형하면 A
도 적절하게 변형됩니다. 종종, 그러나 항상 그런 것은 아니며, Transpose(A)
를 생성합니다. 여기서 Transpose
는 지연 전치 래퍼입니다. 이 작업은 재귀적이라는 점에 유의하십시오.
이 작업은 선형 대수 사용을 위해 의도되었습니다 - 일반 데이터 조작에 대해서는 permutedims
를 참조하십시오. 이는 비재귀적입니다.
예제
julia> A = [3 2; 0 0]
2×2 Matrix{Int64}:
3 2
0 0
julia> B = transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
3 0
2 0
julia> B isa Transpose
true
julia> transpose(B) === A # 전치의 전치는 부모를 풀어냅니다
true
julia> Transpose(B) # 그러나 생성자는 항상 인수를 래핑합니다
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # B를 수정하면 A도 자동으로 수정됩니다
julia> A
2×2 Matrix{Int64}:
3 2
4 0
복소 행렬의 경우, adjoint
연산은 켤레 전치와 동등합니다.
julia> A = reshape([Complex(x, x) for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
1+1im 3+3im
2+2im 4+4im
julia> adjoint(A) == conj(transpose(A))
true
AbstractVector
의 transpose
는 행 벡터입니다:
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # 행 벡터를 반환합니다
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # 내적을 계산합니다
14
행렬의 행렬에 대해 개별 블록은 재귀적으로 작동합니다:
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # 블록 행렬을 구성합니다
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # 블록이 재귀적으로 전치됩니다
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
[1 2; 3 4] [2 4; 6 8]
[3 6; 9 12] [4 8; 12 16]
transpose(F::Factorization)
팩토리제이션 F
의 지연 전치. 기본적으로 TransposeFactorization
를 반환하지만, 실수 eltype
을 가진 Factorization
의 경우 AdjointFactorization
를 반환합니다.
LinearAlgebra.transpose!
— Functiontranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
행렬 A
를 전치하여 행렬 X
에 저장합니다. size(X)
는 size(transpose(A))
와 같아야 합니다. 필요할 경우 X
의 rowval 및 nzval 크기를 조정하는 것 외에는 추가 메모리가 할당되지 않습니다.
halfperm!
를 참조하세요.
transpose!(dest,src)
배열 src
를 전치하고 결과를 미리 할당된 배열 dest
에 저장합니다. dest
의 크기는 (size(src,2),size(src,1))
에 해당해야 합니다. 제자리 전치는 지원되지 않으며, src
와 dest
가 겹치는 메모리 영역을 가지면 예기치 않은 결과가 발생할 수 있습니다.
예제
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> transpose!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3+2im 8+7im
9+2im 4+6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Transpose
— Type전치
기본 선형 대수 객체의 전치 뷰에 대한 게으른 래퍼 유형으로, 일반적으로 AbstractVector
/AbstractMatrix
입니다. 일반적으로 Transpose
생성자는 직접 호출하지 말고 대신 transpose
를 사용하십시오. 뷰를 구체화하려면 copy
를 사용하십시오.
이 유형은 선형 대수 사용을 위해 설계되었습니다 - 일반 데이터 조작에 대해서는 permutedims
를 참조하십시오.
예제
julia> A = [2 3; 0 0]
2×2 Matrix{Int64}:
2 3
0 0
julia> Transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
2 0
3 0
LinearAlgebra.TransposeFactorization
— TypeTransposeFactorization
기본 Factorization
객체의 전치에 대한 지연 래퍼 유형입니다. 일반적으로 TransposeFactorization
생성자는 직접 호출하지 않아야 하며, 대신 transpose(:: Factorization)
를 사용하십시오.
Base.adjoint
— FunctionA'
adjoint(A)
게으른 수반(켤레 전치). adjoint
는 요소에 재귀적으로 적용된다는 점에 유의하십시오.
숫자 유형의 경우, adjoint
는 복소수 켤레를 반환하며, 따라서 실수에 대해서는 항등 함수와 동일합니다.
이 작업은 선형 대수 사용을 위해 의도되었습니다 - 일반 데이터 조작에 대해서는 permutedims
를 참조하십시오.
예제
julia> A = [3+2im 9+2im; 0 0]
2×2 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 # 수반의 수반은 부모를 풀어냅니다
true
julia> Adjoint(B) # 그러나 생성자는 항상 인수를 래핑합니다
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; # B를 수정하면 A도 자동으로 수정됩니다
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 # 내적을 계산합니다, 동등하게 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!
— Functionadjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
행렬 A
의 전치 행렬을 변환하고 행렬 X
의 요소의 어드조인트를 저장합니다. size(X)
는 size(transpose(A))
와 같아야 합니다. 필요할 경우 X
의 rowval 및 nzval을 크기 조정하는 것 외에는 추가 메모리가 할당되지 않습니다.
halfperm!
을 참조하세요.
adjoint!(dest,src)
켤레 전치 배열 src
를 계산하고 결과를 미리 할당된 배열 dest
에 저장합니다. dest
의 크기는 (size(src,2),size(src,1))
에 해당해야 합니다. 제자리 전치는 지원되지 않으며, src
와 dest
가 겹치는 메모리 영역을 가지면 예기치 않은 결과가 발생할 수 있습니다.
예제
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 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
— TypeAdjoint
기본 선형 대수 객체의 어드전트 뷰에 대한 지연 래퍼 유형으로, 일반적으로 AbstractVector
/AbstractMatrix
입니다. 일반적으로 Adjoint
생성자는 직접 호출하지 말고 대신 adjoint
를 사용하십시오. 뷰를 구체화하려면 copy
를 사용하십시오.
이 유형은 선형 대수 사용을 위해 설계되었습니다 - 일반 데이터 조작에 대해서는 permutedims
를 참조하십시오.
예제
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> Adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
LinearAlgebra.AdjointFactorization
— TypeAdjointFactorization
기본 Factorization
객체의 수반을 위한 지연 래퍼 유형입니다. 일반적으로 AdjointFactorization
생성자는 직접 호출하지 않아야 하며, 대신 adjoint(:: Factorization)
를 사용하십시오.
Base.copy
— Methodcopy(A::Transpose)
copy(A::Adjoint)
지연 행렬 전치/수반을 즉시 평가합니다. 전치는 요소에 재귀적으로 적용된다는 점에 유의하십시오.
이 작업은 선형 대수 사용을 위해 의도되었습니다 - 일반 데이터 조작에 대해서는 permutedims
를 참조하십시오. 이는 비재귀적입니다.
예제
julia> A = [1 2im; -3im 4]
2×2 Matrix{Complex{Int64}}:
1+0im 0+2im
0-3im 4+0im
julia> T = transpose(A)
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
1+0im 0-3im
0+2im 4+0im
julia> copy(T)
2×2 Matrix{Complex{Int64}}:
1+0im 0-3im
0+2im 4+0im
LinearAlgebra.stride1
— Functionstride1(A) -> Int
배열 요소 간의 거리를 요소 크기 단위로 차원 1에서 반환합니다.
예시
julia> A = [1,2,3,4]
4-element Vector{Int64}:
1
2
3
4
julia> LinearAlgebra.stride1(A)
1
julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
2
4
julia> LinearAlgebra.stride1(B)
2
LinearAlgebra.checksquare
— FunctionLinearAlgebra.checksquare(A)
행렬이 정사각형인지 확인한 다음, 공통 차원을 반환합니다. 여러 인수가 있는 경우 벡터를 반환합니다.
예제
julia> A = fill(1, (4,4)); B = fill(1, (5,5));
julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
4
5
LinearAlgebra.peakflops
— FunctionLinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)
peakflops
는 이중 정밀도 gemm!
를 사용하여 컴퓨터의 최대 플롭 비율을 계산합니다. 기본적으로 인수가 지정되지 않으면 n x n
크기의 두 개의 Float64
행렬을 곱하며, 여기서 n = 4096
입니다. 기본 BLAS가 여러 스레드를 사용하는 경우 더 높은 플롭 비율이 실현됩니다. BLAS 스레드 수는 BLAS.set_num_threads(n)
로 설정할 수 있습니다.
키워드 인수 eltype
이 제공되면, peakflops
는 최대 플롭 비율을 계산하기 위해 eltype
유형의 요소를 가진 행렬을 구성합니다.
기본적으로 peakflops
는 3회의 실험 중 가장 좋은 타이밍을 사용합니다. ntrials
키워드 인수가 제공되면, peakflops
는 최상의 타이밍을 선택하기 위해 그만큼의 실험을 사용합니다.
키워드 인수 parallel
이 true
로 설정되면, peakflops
는 모든 작업 프로세서에서 병렬로 실행됩니다. 전체 병렬 컴퓨터의 플롭 비율이 반환됩니다. 병렬로 실행할 때는 1개의 BLAS 스레드만 사용됩니다. 인수 n
은 여전히 각 프로세서에서 해결되는 문제의 크기를 나타냅니다.
이 함수는 최소한 Julia 1.1이 필요합니다. Julia 1.0에서는 표준 라이브러리 InteractiveUtils
에서 사용할 수 있습니다.
LinearAlgebra.hermitianpart
— Functionhermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
정사각형 행렬 A
의 에르미트 부분을 반환합니다. 이는 (A + A') / 2
로 정의되며, Hermitian
행렬로 반환됩니다. 실수 행렬 A
의 경우, 이는 A
의 대칭 부분으로도 알려져 있으며, 때때로 "연산자 실수 부분"이라고도 불립니다. 선택적 인수 uplo
는 Hermitian
뷰의 해당 인수를 제어합니다. 실수 행렬의 경우, 후자는 Symmetric
뷰와 동등합니다.
상응하는 제자리 연산에 대해서는 hermitianpart!
를 참조하십시오.
이 함수는 Julia 1.10 이상이 필요합니다.
LinearAlgebra.hermitianpart!
— Functionhermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
정사각형 행렬 A
를 제자리에서 그 에르미트 부분 (A + A') / 2
로 덮어쓰고, Hermitian(A, uplo)
를 반환합니다. 실수 행렬 A
의 경우, 이는 A
의 대칭 부분으로도 알려져 있습니다.
상응하는 비제자리 연산에 대해서는 hermitianpart
를 참조하십시오.
이 함수는 Julia 1.10 이상이 필요합니다.
LinearAlgebra.copy_adjoint!
— Functioncopy_adjoint!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
행렬 A
의 요소를 다음과 같이 어드전션을 사용하여 B
에 효율적으로 복사합니다:
B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]
요소 B[ir_dest, jr_dest]
는 덮어쓰여집니다. 또한, 인덱스 범위 매개변수는 length(ir_dest) == length(jr_src)
및 length(jr_dest) == length(ir_src)
를 만족해야 합니다.
LinearAlgebra.copy_transpose!
— Functioncopy_transpose!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
행렬 A
의 요소를 전치하여 B
에 효율적으로 복사합니다:
B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]
요소 B[ir_dest, jr_dest]
는 덮어쓰여집니다. 또한, 인덱스 범위 매개변수는 length(ir_dest) == length(jr_src)
및 length(jr_dest) == length(ir_src)
를 만족해야 합니다.
copy_transpose!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
tM::AbstractChar,
M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B
행렬 M
의 요소를 문자 매개변수 tM
에 따라 B
로 효율적으로 복사합니다:
tM | 목적지 | 출처 |
---|---|---|
'N' | B[ir_dest, jr_dest] | transpose(M)[jr_src, ir_src] |
'T' | B[ir_dest, jr_dest] | M[jr_src, ir_src] |
'C' | B[ir_dest, jr_dest] | conj(M)[jr_src, ir_src] |
요소 B[ir_dest, jr_dest]
는 덮어쓰여집니다. 또한, 인덱스 범위 매개변수는 length(ir_dest) == length(jr_src)
및 length(jr_dest) == length(ir_src)
를 만족해야 합니다.
또한 copyto!
및 copy_adjoint!
를 참조하십시오.
Low-level matrix operations
많은 경우, 미리 할당된 출력 벡터나 행렬을 제공할 수 있는 제자리 버전의 행렬 연산이 있습니다. 이는 반복적인 할당의 오버헤드를 피하기 위해 중요한 코드를 최적화할 때 유용합니다. 이러한 제자리 연산은 일반적인 Julia 관례에 따라 아래에 !
로 접미사가 붙습니다 (예: mul!
).
LinearAlgebra.mul!
— Functionmul!(Y, A, B) -> Y
행렬-행렬 또는 행렬-벡터 곱 $A B$를 계산하고 결과를 Y
에 저장하여 기존의 Y
값을 덮어씁니다. Y
는 A
또는 B
와 별칭이 되어서는 안 됩니다.
예제
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; Y = similar(B);
julia> mul!(Y, A, B) === Y
true
julia> Y
2×2 Matrix{Float64}:
3.0 3.0
7.0 7.0
julia> Y == A * B
true
구현
사용자 정의 행렬 및 벡터 유형의 경우, 가능하다면 3-인수 mul!
를 직접 구현하기보다는 5-인수 mul!
를 구현하는 것이 좋습니다.
mul!(C, A, B, α, β) -> C
결합된 제자리 행렬-행렬 또는 행렬-벡터 곱셈-덧셈 $A B α + C β$. 결과는 C
에 저장되며, 이를 덮어씁니다. C
는 A
또는 B
와 별개이어야 합니다.
다섯 개 인수를 가진 mul!
는 최소한 Julia 1.3이 필요합니다.
예제
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; C = [1.0 2.0; 3.0 4.0];
julia> α, β = 100.0, 10.0;
julia> mul!(C, A, B, α, β) === C
true
julia> C
2×2 Matrix{Float64}:
310.0 320.0
730.0 740.0
julia> C_original = [1.0 2.0; 3.0 4.0]; # C의 원래 값의 복사본
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!
— Functionlmul!(a::Number, B::AbstractArray)
스칼라 a
로 배열 B
를 스케일링하여 B
를 제자리에서 덮어씁니다. 스칼라를 오른쪽에서 곱하려면 rmul!
를 사용하세요. 스케일링 작업은 a
와 B
의 요소 간의 곱셈 *
의 의미를 존중합니다. 특히, 이는 NaN
및 ±Inf
와 같은 비유한 숫자를 포함하는 곱셈에도 적용됩니다.
Julia 1.1 이전에는 B
의 NaN
및 ±Inf
항목이 일관되지 않게 처리되었습니다.
예제
julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> lmul!(2, B)
2×2 Matrix{Int64}:
2 4
6 8
julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
NaN
lmul!(A, B)
행렬-행렬 곱 $AB$를 계산하고 B
를 덮어쓰며 결과를 반환합니다. 여기서 A
는 Diagonal
, UpperTriangular
또는 LowerTriangular
와 같은 특수 행렬 유형이거나, QR
에서 볼 수 있는 일부 직교 유형이어야 합니다.
예제
julia> B = [0 1; 1 0];
julia> A = UpperTriangular([1 2; 0 3]);
julia> lmul!(A, B);
julia> B
2×2 Matrix{Int64}:
2 1
3 0
julia> B = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
3.0 4.0
1.0 2.0
LinearAlgebra.rmul!
— Functionrmul!(A::AbstractArray, b::Number)
배열 A
를 스칼라 b
로 스케일링하여 A
를 제자리에서 덮어씁니다. 스칼라를 왼쪽에서 곱하려면 lmul!
를 사용하세요. 스케일링 작업은 A
의 요소와 b
사이의 곱셈 *
의 의미를 존중합니다. 특히, 이는 NaN
및 ±Inf
와 같은 비유한 숫자를 포함하는 곱셈에도 적용됩니다.
Julia 1.1 이전에는 A
의 NaN
및 ±Inf
항목이 일관되지 않게 처리되었습니다.
예제
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> rmul!(A, 2)
2×2 Matrix{Int64}:
2 4
6 8
julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
NaN
rmul!(A, B)
행렬-행렬 곱 $AB$를 계산하여 A
를 덮어쓰고 결과를 반환합니다. 여기서 B
는 Diagonal
, UpperTriangular
또는 LowerTriangular
와 같은 특수 행렬 유형이거나, QR
와 같은 일부 직교 유형이어야 합니다.
예제
julia> A = [0 1; 1 0];
julia> B = UpperTriangular([1 2; 0 3]);
julia> rmul!(A, B);
julia> A
2×2 Matrix{Int64}:
0 3
1 2
julia> A = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
2.0 1.0
4.0 3.0
LinearAlgebra.ldiv!
— Functionldiv!(Y, A, B) -> Y
A \ B
를 제자리에서 계산하고 결과를 Y
에 저장하며 결과를 반환합니다.
인수 A
는 행렬이 아니어야 합니다. 오히려 행렬 대신에 인수는 인수분해 객체여야 합니다(예: factorize
또는 cholesky
로 생성된). 그 이유는 인수분해 자체가 비용이 많이 들고 일반적으로 메모리를 할당하기 때문입니다(비록 lu!
와 같은 방법으로 제자리에서 수행할 수도 있지만), 그리고 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 ≈ A\X
true
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 ≈ A\Y
true
ldiv!(a::Number, B::AbstractArray)
스칼라 a
로 배열 B
의 각 항목을 나누고 B
를 제자리에서 덮어씁니다. 오른쪽에서 스칼라를 나누려면 rdiv!
를 사용하세요.
예제
julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B
가우스 소거법을 사용하여 A \ B
를 제자리에서 계산하고 결과를 B
에 저장하며 결과를 반환합니다. 이 과정에서 A
의 대각선도 덮어씌워집니다.
Tridiagonal
왼쪽 항에 대한 ldiv!
는 최소한 Julia 1.11이 필요합니다.
LinearAlgebra.rdiv!
— Functionrdiv!(A, B)
A / B
를 제자리에서 계산하고 결과를 저장하기 위해 A
를 덮어씁니다.
인수 B
는 행렬이 아니어야 합니다. 대신, 행렬 대신에 인수는 인수분해 객체여야 합니다(예: factorize
또는 cholesky
로 생성된). 그 이유는 인수분해 자체가 비용이 많이 들고 일반적으로 메모리를 할당하기 때문입니다(비록 lu!
와 같은 방법으로 제자리에서 수행할 수도 있지만), 그리고 rdiv!
를 요구하는 성능이 중요한 상황은 일반적으로 B
의 인수분해에 대한 세밀한 제어를 요구합니다.
Diagonal
및 UpperTriangular
와 같은 특정 구조화된 행렬 유형은 이미 인수분해된 형태이므로 허용됩니다.
rdiv!(A::AbstractArray, b::Number)
배열 A
의 각 항목을 스칼라 b
로 나누고 A
를 제자리에서 덮어씁니다. 왼쪽에서 스칼라를 나누려면 ldiv!
를 사용하세요.
예제
julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
BLAS functions
줄리아(Julia)에서는(과학 계산의 많은 부분에서) 밀집 선형 대수 연산이 LAPACK library를 기반으로 하며, 이는 기본 선형 대수 빌딩 블록으로 알려진 BLAS 위에 구축됩니다. 모든 컴퓨터 아키텍처에 대해 사용할 수 있는 고도로 최적화된 BLAS 구현이 있으며, 때때로 고성능 선형 대수 루틴에서는 BLAS 함수를 직접 호출하는 것이 유용합니다.
LinearAlgebra.BLAS
는 일부 BLAS 함수에 대한 래퍼를 제공합니다. 입력 배열 중 하나를 덮어쓰는 BLAS 함수는 이름이 '!'
로 끝납니다. 일반적으로 BLAS 함수는 Float32
, Float64
, ComplexF32
, 및 ComplexF64
배열에 대해 네 가지 메서드가 정의되어 있습니다.
BLAS character arguments
많은 BLAS 함수는 인수로 전치 여부를 결정하는 인수(trans
), 참조할 행렬의 삼각형(uplo
또는 ul
), 삼각 행렬의 대각선이 모두 1로 가정될 수 있는지 여부(dA
), 또는 행렬 곱셈에서 입력 인수가 속하는 쪽(side
)을 허용합니다. 가능한 옵션은 다음과 같습니다:
Multiplication order
side | Meaning |
---|---|
'L' | The argument goes on the left side of a matrix-matrix operation. |
'R' | The argument goes on the right side of a matrix-matrix operation. |
Triangle referencing
uplo /ul | Meaning |
---|---|
'U' | Only the upper triangle of the matrix will be used. |
'L' | Only the lower triangle of the matrix will be used. |
Transposition operation
trans /tX | Meaning |
---|---|
'N' | The input matrix X is not transposed or conjugated. |
'T' | The input matrix X will be transposed. |
'C' | The input matrix X will be conjugated and transposed. |
Unit diagonal
diag /dX | Meaning |
---|---|
'N' | The diagonal values of the matrix X will be read. |
'U' | The diagonal of the matrix X is assumed to be all ones. |
LinearAlgebra.BLAS
— ModuleBLAS 서브루틴에 대한 인터페이스.
LinearAlgebra.BLAS.set_num_threads
— Functionset_num_threads(n::Integer)
set_num_threads(::Nothing)
BLAS 라이브러리가 사용할 스레드 수를 n::Integer
와 같게 설정합니다.
또한 nothing
을 허용하며, 이 경우 줄리아는 기본 스레드 수를 추측하려고 시도합니다. nothing
을 전달하는 것은 권장되지 않으며 주로 역사적인 이유로 존재합니다.
LinearAlgebra.BLAS.get_num_threads
— Functionget_num_threads()
BLAS 라이브러리가 사용하는 스레드 수를 가져옵니다.
get_num_threads
는 최소한 Julia 1.6이 필요합니다.
BLAS 함수는 처음 제안된 시기, 입력 매개변수의 유형 및 연산의 복잡성에 따라 세 그룹, 즉 세 가지 수준으로 나눌 수 있습니다.
Level 1 BLAS functions
레벨 1 BLAS 함수는 [(Lawson, 1979)][Lawson-1979]에서 처음 제안되었으며, 스칼라와 벡터 간의 연산을 정의합니다.
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!
— Functionrot!(n, X, incx, Y, incy, c, s)
X
를 c*X + s*Y
로 덮어쓰고 Y
를 -conj(s)*X + c*Y
로 덮어씁니다. 배열 X
의 첫 n
요소와 보폭 incx
를 사용하고 배열 Y
의 첫 n
요소와 보폭 incy
를 사용합니다. X
와 Y
를 반환합니다.
rot!
는 최소한 Julia 1.5가 필요합니다.
LinearAlgebra.BLAS.scal!
— Functionscal!(n, a, X, incx)
scal!(a, X)
배열 X
의 처음 n
요소를 a*X
로 덮어씁니다. 보폭은 incx
입니다. X
를 반환합니다.
n
과 incx
가 제공되지 않으면 length(X)
와 stride(X,1)
이 사용됩니다.
LinearAlgebra.BLAS.scal
— Functionscal(n, a, X, incx)
scal(a, X)
X
를 a
로 스케일링하여 배열 X
의 처음 n
요소를 incx
의 보폭으로 반환합니다.
n
과 incx
가 제공되지 않으면 length(X)
와 stride(X,1)
이 사용됩니다.
LinearAlgebra.BLAS.blascopy!
— Functionblascopy!(n, X, incx, Y, incy)
배열 X
의 n
요소를 보폭 incx
로 배열 Y
에 보폭 incy
로 복사합니다. Y
를 반환합니다.
LinearAlgebra.BLAS.dot
— Functiondot(n, X, incx, Y, incy)
두 벡터의 내적, 배열 X
의 n
요소와 보폭 incx
, 배열 Y
의 n
요소와 보폭 incy
로 구성됩니다.
예제
julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
LinearAlgebra.BLAS.dotu
— Functiondotu(n, X, incx, Y, incy)
두 개의 복소수 벡터에 대한 Dot 함수로, 배열 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
— Functiondotc(n, X, incx, U, incy)
두 개의 복소수 벡터에 대한 Dot 함수로, stride incx
를 가진 배열 X
의 n
요소와 stride incy
를 가진 배열 U
의 n
요소로 구성되며, 첫 번째 벡터를 켤레합니다.
예제
julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
LinearAlgebra.BLAS.nrm2
— Functionnrm2(n, X, incx)
incx
의 보폭을 가진 배열 X
의 n
요소로 구성된 벡터의 2-노름입니다.
예제
julia> BLAS.nrm2(4, fill(1.0, 8), 2)
2.0
julia> BLAS.nrm2(1, fill(1.0, 8), 2)
1.0
LinearAlgebra.BLAS.asum
— Functionasum(n, X, incx)
배열 X
의 첫 번째 n
요소의 크기의 합을 stride incx
로 계산합니다.
실수 배열의 경우, 크기는 절대값입니다. 복소수 배열의 경우, 크기는 실수 부분의 절대값과 허수 부분의 절대값의 합입니다.
예제
julia> BLAS.asum(5, fill(1.0im, 10), 2)
5.0
julia> BLAS.asum(2, fill(1.0im, 10), 5)
2.0
LinearAlgebra.BLAS.iamax
— Functioniamax(n, dx, incx)
iamax(dx)
dx
의 최대 절대값을 가진 요소의 인덱스를 찾습니다. n
은 dx
의 길이이며, incx
는 보폭입니다. n
과 incx
가 제공되지 않으면 기본값인 n=length(dx)
와 incx=stride1(dx)
를 가정합니다.
Level 2 BLAS functions
레벨 2 BLAS 함수는 [(Dongarra, 1988)][Dongarra-1988]에 발표되었으며, 행렬-벡터 연산을 정의합니다.
[동가라-1988]: https://dl.acm.org/doi/10.1145/42288.42291
벡터 반환
LinearAlgebra.BLAS.gemv!
— Functiongemv!(tA, alpha, A, x, beta, y)
벡터 y
를 alpha*A*x + beta*y
또는 alpha*A'x + beta*y
로 업데이트합니다. tA
에 따라 다릅니다. alpha
와 beta
는 스칼라입니다. 업데이트된 y
를 반환합니다.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, alpha, A, x)
alpha*A*x
또는 alpha*A'x
를 반환합니다. tA
에 따라 다릅니다. alpha
는 스칼라입니다.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, A, x)
A*x
또는 A'x
를 tA
에 따라 반환합니다.
LinearAlgebra.BLAS.gbmv!
— Functiongbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
벡터 y
를 alpha*A*x + beta*y
또는 alpha*A'*x + beta*y
로 업데이트합니다. 이는 trans
에 따라 다릅니다. 행렬 A
는 m
x size(A,2)
크기의 일반 밴드 행렬로, kl
개의 하삼각 대각선과 ku
개의 상삼각 대각선을 가집니다. alpha
와 beta
는 스칼라입니다. 업데이트된 y
를 반환합니다.
LinearAlgebra.BLAS.gbmv
— Functiongbmv(trans, m, kl, ku, alpha, A, x)
trans
에 따라 alpha*A*x
또는 alpha*A'*x
를 반환합니다. 행렬 A
는 kl
개의 하삼각 대각선과 ku
개의 상삼각 대각선을 가진 m
x size(A,2)
차원의 일반 밴드 행렬이며, alpha
는 스칼라입니다.
LinearAlgebra.BLAS.hemv!
— Functionhemv!(ul, alpha, A, x, beta, y)
벡터 y
를 alpha*A*x + beta*y
로 업데이트합니다. A
는 에르미트 행렬로 가정됩니다. A
의 ul
삼각형만 사용됩니다. alpha
와 beta
는 스칼라입니다. 업데이트된 y
를 반환합니다.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, alpha, A, x)
alpha*A*x
를 반환합니다. A
는 에르미트 행렬로 가정됩니다. A
의 ul
삼각형만 사용됩니다. alpha
는 스칼라입니다.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, A, x)
A*x
를 반환합니다. A
는 에르미트 행렬로 가정됩니다. A
의 ul
삼각형만 사용됩니다.
LinearAlgebra.BLAS.hpmv!
— Functionhpmv!(uplo, α, AP, x, β, y)
벡터 y
를 α*A*x + β*y
로 업데이트합니다. 여기서 A
는 패킹 형식 AP
로 제공된 에르미트 행렬입니다.
uplo = 'U'
인 경우, 배열 AP는 에르미트 행렬의 상삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[1, 2]
와 A[2, 2]
를 포함해야 합니다. 계속해서 이와 같은 방식으로 진행됩니다.
uplo = 'L'
인 경우, 배열 AP는 에르미트 행렬의 하삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[2, 1]
과 A[3, 1]
을 포함해야 합니다. 계속해서 이와 같은 방식으로 진행됩니다.
스칼라 입력 α
와 β
는 복소수 또는 실수여야 합니다.
배열 입력 x
, y
및 AP
는 모두 ComplexF32
또는 ComplexF64
유형이어야 합니다.
업데이트된 y
를 반환합니다.
hpmv!
는 최소한 Julia 1.5가 필요합니다.
LinearAlgebra.BLAS.symv!
— Functionsymv!(ul, alpha, A, x, beta, y)
벡터 y
를 alpha*A*x + beta*y
로 업데이트합니다. A
는 대칭으로 가정됩니다. A
의 ul
삼각형만 사용됩니다. alpha
와 beta
는 스칼라입니다. 업데이트된 y
를 반환합니다.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, alpha, A, x)
alpha*A*x
를 반환합니다. A
는 대칭으로 가정됩니다. A
의 ul
삼각형만 사용됩니다. alpha
는 스칼라입니다.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, A, x)
A*x
를 반환합니다. A
는 대칭으로 가정됩니다. A
의 ul
삼각형만 사용됩니다.
LinearAlgebra.BLAS.sbmv!
— Functionsbmv!(uplo, k, alpha, A, x, beta, y)
벡터 y
를 alpha*A*x + beta*y
로 업데이트합니다. 여기서 A
는 size(A,2)
차원의 대칭 밴드 행렬이며, k
개의 슈퍼 대각선이 인수 A
에 저장되어 있습니다. A
의 저장 레이아웃은 https://www.netlib.org/lapack/explore-html/의 참조 BLAS 모듈, 레벨-2 BLAS에서 설명되어 있습니다. 오직 uplo
삼각형의 A
만 사용됩니다.
업데이트된 y
를 반환합니다.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, alpha, A, x)
alpha*A*x
를 반환합니다. 여기서 A
는 인수 A
에 저장된 k
개의 초대각선을 가진 대칭 밴드 행렬이며, size(A,2)
의 차수를 가집니다. 오직 uplo
삼각형의 A
만 사용됩니다.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, A, x)
A*x
를 반환합니다. 여기서 A
는 인수 A
에 저장된 k
개의 초대각선을 가진 대칭 밴드 행렬이며, 차수는 size(A,2)
입니다. 오직 uplo
삼각형의 A
만 사용됩니다.
LinearAlgebra.BLAS.spmv!
— Functionspmv!(uplo, α, AP, x, β, y)
벡터 y
를 α*A*x + β*y
로 업데이트합니다. 여기서 A
는 패킹 형식 AP
로 제공되는 대칭 행렬입니다.
uplo = 'U'
인 경우, 배열 AP는 대칭 행렬의 상삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[1, 2]
와 A[2, 2]
를 포함해야 하며, 계속해서 진행됩니다.
uplo = 'L'
인 경우, 배열 AP는 대칭 행렬의 하삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[2, 1]
과 A[3, 1]
을 포함해야 하며, 계속해서 진행됩니다.
스칼라 입력 α
와 β
는 실수여야 합니다.
배열 입력 x
, y
및 AP
는 모두 Float32
또는 Float64
유형이어야 합니다.
업데이트된 y
를 반환합니다.
spmv!
는 최소한 Julia 1.5가 필요합니다.
LinearAlgebra.BLAS.trmv!
— Functiontrmv!(ul, tA, dA, A, b)
op(A)*b
를 반환합니다. 여기서 op
는 tA
에 의해 결정됩니다. A
의 ul
삼각형만 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다. 곱셈은 b
에서 제자리에서 발생합니다.
LinearAlgebra.BLAS.trmv
— Functiontrmv(ul, tA, dA, A, b)
op(A)*b
를 반환합니다. 여기서 op
는 tA
에 의해 결정됩니다. A
의 ul
삼각형만 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다.
LinearAlgebra.BLAS.trsv!
— Functiontrsv!(ul, tA, dA, A, b)
A*x = b
의 해로 b
를 덮어쓰거나 tA
및 ul
에 의해 결정된 다른 두 변형 중 하나로 덮어씁니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다. 업데이트된 b
를 반환합니다.
LinearAlgebra.BLAS.trsv
— Functiontrsv(ul, tA, dA, A, b)
A*x = b
의 해를 반환하거나 tA
및 ul
에 의해 결정된 다른 두 변형 중 하나를 반환합니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다.
행렬 반환
LinearAlgebra.BLAS.ger!
— Functionger!(alpha, x, y, A)
벡터 x
와 y
를 사용하여 행렬 A
의 순위-1 업데이트를 수행합니다: alpha*x*y' + A
.
LinearAlgebra.BLAS.her!
— Functionher!(uplo, alpha, x, A)
복소 배열에 대해서만 사용 가능한 메서드입니다. Hermitian 행렬 A
의 랭크-1 업데이트로 벡터 x
를 사용하여 alpha*x*x' + A
를 계산합니다. uplo
는 업데이트할 A
의 삼각형을 제어합니다. A
를 반환합니다.
LinearAlgebra.BLAS.syr!
— Functionsyr!(uplo, alpha, x, A)
대칭 행렬 A
의 랭크-1 업데이트로, 벡터 x
를 사용하여 alpha*x*transpose(x) + A
로 업데이트합니다. uplo
는 업데이트할 A
의 삼각형을 제어합니다. A
를 반환합니다.
LinearAlgebra.BLAS.spr!
— Functionspr!(uplo, α, x, AP)
행렬 A
를 A+α*x*x'
로 업데이트합니다. 여기서 A
는 패킹 형식 AP
로 제공되는 대칭 행렬이고, x
는 벡터입니다.
uplo = 'U'
인 경우, 배열 AP는 대칭 행렬의 상삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[1, 2]
와 A[2, 2]
를 포함해야 합니다. 계속해서 이와 같은 방식으로 진행됩니다.
uplo = 'L'
인 경우, 배열 AP는 대칭 행렬의 하삼각 부분을 열 단위로 순차적으로 포함해야 하며, 따라서 AP[1]
은 A[1, 1]
을 포함하고, AP[2]
와 AP[3]
는 각각 A[2, 1]
과 A[3, 1]
을 포함해야 합니다. 계속해서 이와 같은 방식으로 진행됩니다.
스칼라 입력 α
는 실수여야 합니다.
배열 입력 x
와 AP
는 모두 Float32
또는 Float64
유형이어야 합니다. 업데이트된 AP
를 반환합니다.
spr!
는 최소한 Julia 1.8이 필요합니다.
Level 3 BLAS functions
레벨 3 BLAS 함수는 [(Dongarra, 1990)][Dongarra-1990]에 발표되었으며, 행렬-행렬 연산을 정의합니다.
[동가라-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!
— Functiongemmt!(uplo, tA, tB, alpha, A, B, beta, C)
지정된 uplo
에 따라 C
의 하삼각 또는 상삼각 부분을 alpha*A*B + beta*C
또는 tA
및 tB
에 따라 다른 변형으로 업데이트합니다. 업데이트된 C
를 반환합니다.
gemmt!
는 최소한 Julia 1.11이 필요합니다.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, alpha, A, B)
uplo
에 의해 지정된 A*B
의 하삼각 또는 상삼각 부분 또는 tA
및 tB
에 따라 다른 세 가지 변형을 반환합니다.
gemmt
는 최소한 Julia 1.11이 필요합니다.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, A, B)
uplo
에 의해 지정된 A*B
의 하삼각 또는 상삼각 부분 또는 tA
및 tB
에 따라 다른 세 가지 변형을 반환합니다.
gemmt
는 최소한 Julia 1.11이 필요합니다.
LinearAlgebra.BLAS.gemm!
— Functiongemm!(tA, tB, alpha, A, B, beta, C)
C
를 alpha*A*B + beta*C
로 업데이트하거나 tA
및 tB
에 따라 다른 세 가지 변형으로 업데이트합니다. 업데이트된 C
를 반환합니다.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, alpha, A, B)
alpha*A*B
또는 tA
및 tB
에 따라 다른 세 가지 변형을 반환합니다.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, A, B)
A*B
또는 tA
및 tB
에 따라 다른 세 가지 변형을 반환합니다.
LinearAlgebra.BLAS.symm!
— Functionsymm!(side, ul, alpha, A, B, beta, C)
C
를 alpha*A*B + beta*C
또는 alpha*B*A + beta*C
로 업데이트합니다. 이는 side
에 따라 다릅니다. A
는 대칭으로 가정됩니다. A
의 ul
삼각형만 사용됩니다. 업데이트된 C
를 반환합니다.
LinearAlgebra.BLAS.symm
— MethodLinearAlgebra.BLAS.symm
— MethodLinearAlgebra.BLAS.hemm!
— Functionhemm!(side, ul, alpha, A, B, beta, C)
C
를 alpha*A*B + beta*C
또는 alpha*B*A + beta*C
로 업데이트합니다. 이는 side
에 따라 다릅니다. A
는 에르미트 행렬로 가정됩니다. A
의 ul
삼각형만 사용됩니다. 업데이트된 C
를 반환합니다.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, alpha, A, B)
alpha*A*B
또는 alpha*B*A
를 side
에 따라 반환합니다. A
는 에르미트 행렬로 가정됩니다. A
의 ul
삼각형만 사용됩니다.
LinearAlgebra.BLAS.hemm
— MethodLinearAlgebra.BLAS.syrk!
— Functionsyrk!(uplo, trans, alpha, A, beta, C)
대칭 행렬 C
의 랭크-k 업데이트를 alpha*A*transpose(A) + beta*C
또는 alpha*transpose(A)*A + beta*C
로 수행합니다. 이는 trans
에 따라 다릅니다. 오직 uplo
삼각형의 C
만 사용됩니다. C
를 반환합니다.
LinearAlgebra.BLAS.syrk
— Functionsyrk(uplo, trans, alpha, A)
A
의 상삼각형 또는 하삼각형을 uplo
에 따라 반환하며, alpha*A*transpose(A)
또는 alpha*transpose(A)*A
를 trans
에 따라 반환합니다.
LinearAlgebra.BLAS.herk!
— Functionherk!(uplo, trans, alpha, A, beta, C)
복소 배열에 대해서만 메서드가 제공됩니다. Hermitian 행렬 C
의 랭크-k 업데이트는 trans
에 따라 alpha*A*A' + beta*C
또는 alpha*A'*A + beta*C
로 수행됩니다. 오직 uplo
삼각형의 C
만 업데이트됩니다. C
를 반환합니다.
LinearAlgebra.BLAS.herk
— Functionherk(uplo, trans, alpha, A)
복소 배열에 대해서만 메서드가 있습니다. trans
에 따라 alpha*A*A'
또는 alpha*A'*A
의 uplo
삼각형을 반환합니다.
LinearAlgebra.BLAS.syr2k!
— Functionsyr2k!(uplo, trans, alpha, A, B, beta, C)
대칭 행렬 C
의 Rank-2k 업데이트는 alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C
또는 alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C
로 trans
에 따라 수행됩니다. 오직 uplo
삼각형의 C
만 사용됩니다. C
를 반환합니다.
LinearAlgebra.BLAS.syr2k
— Functionsyr2k(uplo, trans, alpha, A, B)
alpha*A*transpose(B) + alpha*B*transpose(A)
또는 alpha*transpose(A)*B + alpha*transpose(B)*A
의 uplo
삼각형을 반환합니다. 이는 trans
에 따라 다릅니다.
syr2k(uplo, trans, A, B)
uplo
삼각형을 반환합니다 A*transpose(B) + B*transpose(A)
또는 transpose(A)*B + transpose(B)*A
, trans
에 따라.
LinearAlgebra.BLAS.her2k!
— Functionher2k!(uplo, trans, alpha, A, B, beta, C)
Hermitian 행렬 C
의 Rank-2k 업데이트는 alpha*A*B' + alpha*B*A' + beta*C
또는 alpha*A'*B + alpha*B'*A + beta*C
로 trans
에 따라 수행됩니다. 스칼라 beta
는 실수여야 합니다. C
의 uplo
삼각형만 사용됩니다. C
를 반환합니다.
LinearAlgebra.BLAS.her2k
— Functionher2k(uplo, trans, alpha, A, B)
uplo
삼각형을 반환합니다 alpha*A*B' + alpha*B*A'
또는 alpha*A'*B + alpha*B'*A
, trans
에 따라.
LinearAlgebra.BLAS.trmm!
— Functiontrmm!(side, ul, tA, dA, alpha, A, B)
B
를 alpha*A*B
로 업데이트하거나 side
및 tA
에 의해 결정된 다른 세 가지 변형 중 하나로 업데이트합니다. 오직 ul
삼각형만 A
에서 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다. 업데이트된 B
를 반환합니다.
LinearAlgebra.BLAS.trmm
— Functiontrmm(side, ul, tA, dA, alpha, A, B)
alpha*A*B
또는 side
및 tA
로 결정된 다른 세 가지 변형 중 하나를 반환합니다. A
의 ul
삼각형만 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다.
LinearAlgebra.BLAS.trsm!
— Functiontrsm!(side, ul, tA, dA, alpha, A, B)
A*X = alpha*B
의 해로 B
를 덮어쓰거나 side
및 tA
에 의해 결정된 다른 세 가지 변형 중 하나로 덮어씁니다. A
의 ul
삼각형만 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다. 업데이트된 B
를 반환합니다.
LinearAlgebra.BLAS.trsm
— Functiontrsm(side, ul, tA, dA, alpha, A, B)
A*X = alpha*B
의 해를 반환하거나 side
및 tA
에 의해 결정된 다른 세 가지 변형 중 하나를 반환합니다. 오직 ul
삼각형만 A
에서 사용됩니다. dA
는 대각선 값이 읽히는지 아니면 모두 1로 가정되는지를 결정합니다.
LAPACK functions
LinearAlgebra.LAPACK
는 선형 대수를 위한 일부 LAPACK 함수에 대한 래퍼를 제공합니다. 입력 배열 중 하나를 덮어쓰는 함수는 이름이 '!'
로 끝납니다.
보통 함수는 Float64
, Float32
, ComplexF64
및 ComplexF32
배열 각각에 대해 정의된 4개의 메서드를 가지고 있습니다.
LAPACK API는 Julia에서 제공되며, 향후 변경될 수 있습니다. 이 API는 사용자에게 노출되지 않기 때문에, 향후 릴리스에서 이 특정 함수 집합을 지원하거나 사용 중단할 것이라는 약속이 없습니다.
LinearAlgebra.LAPACK
— ModuleLAPACK 서브루틴에 대한 인터페이스.
LinearAlgebra.LAPACK.gbtrf!
— Functiongbtrf!(kl, ku, m, AB) -> (AB, ipiv)
대각선 행렬 AB
의 LU 분해를 계산합니다. kl
은 비영인 대각선의 첫 번째 하위 대각선이며, ku
는 마지막 상위 대각선입니다. m
은 행렬 AB
의 첫 번째 차원입니다. LU 분해를 제자리에서 반환하고 사용된 피벗 벡터 ipiv
를 반환합니다.
LinearAlgebra.LAPACK.gbtrs!
— Functiongbtrs!(trans, kl, ku, m, AB, ipiv, B)
방정식 AB * X = B
를 풉니다. trans
는 AB
의 방향을 결정합니다. N
(전치 없음), T
(전치), 또는 C
(켤레 전치)일 수 있습니다. kl
은 비영인 밴드를 포함하는 첫 번째 하부 대각선이고, ku
는 하나를 포함하는 마지막 상부 대각선이며, m
은 행렬 AB
의 첫 번째 차원입니다. ipiv
는 gbtrf!
에서 반환된 피벗 벡터입니다. 벡터 또는 행렬 X
를 반환하며, B
를 제자리에서 덮어씁니다.
LinearAlgebra.LAPACK.gebal!
— Functiongebal!(job, A) -> (ilo, ihi, scale)
행렬 A
의 고유 시스템 또는 슈르 분해를 계산하기 전에 행렬을 균형 조정합니다. job
은 N
(A
는 치환되거나 스케일되지 않음), P
(A
는 치환만 됨), S
(A
는 스케일링만 됨), 또는 B
(A
는 치환 및 스케일링됨) 중 하나일 수 있습니다. A
를 제자리에서 수정하고 ilo
, ihi
, 및 scale
을 반환합니다. 치환이 활성화된 경우, A[i,j] = 0
이면 j > i
이고 1 < j < ilo
또는 j > ihi
입니다. scale
은 수행된 스케일링/치환에 대한 정보를 포함합니다.
LinearAlgebra.LAPACK.gebak!
— Functiongebak!(job, side, ilo, ihi, scale, V)
gebal!
을 사용하여 균형을 맞춘 행렬의 고유벡터 V
를 원래 행렬의 비축척/비순열 고유벡터로 변환합니다. V
를 제자리에서 수정합니다. side
는 L
(왼쪽 고유벡터가 변환됨) 또는 R
(오른쪽 고유벡터가 변환됨)일 수 있습니다.
LinearAlgebra.LAPACK.gebrd!
— Functiongebrd!(A) -> (A, d, e, tauq, taup)
행렬 A
를 제자리에서 이중 대각선 형태 A = QBP'
로 축소합니다. 반환값은 이중 대각선 행렬 B
를 포함하는 A
, B
의 대각선 요소를 포함하는 d
, B
의 비대각선 요소를 포함하는 e
, Q
를 나타내는 기본 반사체를 포함하는 tauq
, 그리고 P
를 나타내는 기본 반사체를 포함하는 taup
입니다.
LinearAlgebra.LAPACK.gelqf!
— Functiongelqf!(A, tau)
A
의 LQ
분해를 계산합니다. A = LQ
. tau
는 분해의 기본 반사체를 매개변수화하는 스칼라를 포함합니다. tau
는 A
의 가장 작은 차원보다 길이가 같거나 커야 합니다.
A
와 tau
는 제자리에서 수정되어 반환됩니다.
gelqf!(A) -> (A, tau)
행렬 A
의 LQ
분해를 계산합니다. A = LQ
.
수정된 A
와 분해의 기본 반사체를 매개변수화하는 스칼라를 포함하는 tau
를 반환합니다.
LinearAlgebra.LAPACK.geqlf!
— Functiongeqlf!(A, tau)
행렬 A
의 QL
분해를 계산합니다. A = QL
입니다. tau
는 분해의 기본 반사체를 매개변수화하는 스칼라를 포함합니다. tau
는 A
의 가장 작은 차원보다 길이가 같거나 커야 합니다.
수정된 A
와 tau
를 반환합니다.
geqlf!(A) -> (A, tau)
A
의 QL
분해를 계산합니다, A = QL
.
수정된 A
와 분해의 기본 반사체를 매개변수화하는 스칼라를 포함하는 tau
를 반환합니다.
LinearAlgebra.LAPACK.geqrf!
— Functiongeqrf!(A, tau)
A
의 QR
분해를 계산합니다. A = QR
. tau
는 분해의 기본 반사체를 매개변수화하는 스칼라를 포함합니다. tau
는 A
의 가장 작은 차원보다 길이가 같거나 커야 합니다.
A
와 tau
는 제자리에서 수정되어 반환됩니다.
geqrf!(A) -> (A, tau)
행렬 A
의 QR
분해를 계산합니다. A = QR
.
수정된 A
와 분해의 기본 반사체를 매개변수화하는 스칼라를 포함하는 tau
를 반환합니다.
LinearAlgebra.LAPACK.geqp3!
— Functiongeqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
행렬 A
의 피벗된 QR
분해를 계산합니다. AP = QR
는 BLAS 레벨 3을 사용합니다. P
는 피벗 행렬로, jpvt
로 표현됩니다. tau
는 기본 반사를 저장합니다. 인수 jpvt
와 tau
는 선택 사항이며, 미리 할당된 배열을 전달할 수 있습니다. 전달될 경우, jpvt
는 A
가 (m x n)
행렬일 때 길이가 n
이상이어야 하며, tau
는 A
의 가장 작은 차원보다 길이가 같거나 커야 합니다. 입력 시, 만약 jpvt[j]
가 0이 아니면 A
의 j
번째 열이 AP
의 앞쪽으로 재배치됩니다.
A
, jpvt
, 및 tau
는 제자리에서 수정됩니다.
LinearAlgebra.LAPACK.gerqf!
— Functiongerqf!(A, tau)
행렬 A
의 RQ
분해를 계산합니다. A = RQ
. tau
는 분해의 기본 반사체를 매개변수화하는 스칼라를 포함합니다. tau
는 A
의 가장 작은 차원보다 길이가 같거나 커야 합니다.
수정된 A
와 tau
를 반환합니다.
gerqf!(A) -> (A, tau)
행렬 A
의 RQ
분해를 계산합니다. A = RQ
.
수정된 A
와 분해의 기본 반사체를 매개변수화하는 스칼라를 포함하는 tau
를 반환합니다.
LinearAlgebra.LAPACK.geqrt!
— Functiongeqrt!(A, T)
A
의 블록 QR
분해를 계산합니다, A = QR
. T
는 분해의 기본 반사체를 매개변수화하는 상삼각 블록 반사체를 포함합니다. T
의 첫 번째 차원은 블록 크기를 설정하며 1과 n
사이여야 합니다. T
의 두 번째 차원은 A
의 가장 작은 차원과 같아야 합니다.
수정된 A
와 T
를 반환합니다.
geqrt!(A, nb) -> (A, T)
행렬 A
의 블록 QR
분해를 계산합니다. A = QR
. nb
는 블록 크기를 설정하며, 1과 A
의 두 번째 차원인 n
사이의 값이어야 합니다.
수정된 A
와 분해의 기본 반사기를 매개변수화하는 상삼각 블록 반사기를 포함하는 T
를 반환합니다.
LinearAlgebra.LAPACK.geqrt3!
— Functiongeqrt3!(A, T)
재귀적으로 A
의 블록 QR
분해를 계산합니다, A = QR
. T
는 분해의 기본 반사체를 매개변수화하는 상삼각 블록 반사체를 포함합니다. T
의 첫 번째 차원은 블록 크기를 설정하며 1과 n
사이여야 합니다. T
의 두 번째 차원은 A
의 가장 작은 차원과 같아야 합니다.
수정된 A
와 T
를 반환합니다.
geqrt3!(A) -> (A, T)
재귀적으로 A
의 블록 QR
분해를 계산합니다, A = QR
.
수정된 A
와 분해의 기본 반사기를 매개변수화하는 상삼각 블록 반사기를 포함하는 T
를 반환합니다.
LinearAlgebra.LAPACK.getrf!
— Functiongetrf!(A, ipiv) -> (A, ipiv, info)
행렬 A
의 피벗된 LU
분해를 계산합니다. A = LU
. ipiv
는 피벗 정보가 포함되어 있으며, info
는 성공을 나타내는 코드(info = 0
), U
의 특이 값(info = i
, 이 경우 U[i,i]
는 특이함), 또는 오류 코드(info < 0
)를 포함합니다.
getrf!(A) -> (A, ipiv, info)
행렬 A
의 피벗된 LU
분해를 계산합니다. A = LU
.
수정된 A
, 피벗 정보인 ipiv
, 성공을 나타내는 info
코드(성공 시 info = 0
), U
의 특이 값(info = i
, 이 경우 U[i,i]
는 특이함), 또는 오류 코드(info < 0
)를 반환합니다.
LinearAlgebra.LAPACK.tzrzf!
— Functiontzrzf!(A) -> (A, tau)
상부 사다리꼴 행렬 A
를 제자리에서 상부 삼각형 형태로 변환합니다. 변환의 기본 반사체에 대한 스칼라 매개변수인 A
와 tau
를 반환합니다.
LinearAlgebra.LAPACK.ormrz!
— Functionormrz!(side, trans, A, tau, C)
행렬 C
를 tzrzf!
에 의해 제공된 변환으로부터 Q
와 곱합니다. side
또는 trans
에 따라 곱셈은 왼쪽에서 수행될 수 있습니다(side = L, Q*C
) 또는 오른쪽에서 수행될 수 있습니다(side = R, C*Q
) 그리고 Q
는 수정되지 않을 수 있습니다(trans = N
), 전치될 수 있습니다(trans = T
), 또는 켤레 전치될 수 있습니다(trans = C
). 곱셈의 결과로 수정된 행렬 C
를 반환합니다.
LinearAlgebra.LAPACK.gels!
— Functiongels!(trans, A, B) -> (F, B, ssr)
선형 방정식 A * X = B
, transpose(A) * X = B
, 또는 adjoint(A) * X = B
를 QR 또는 LQ 분해를 사용하여 해결합니다. 솔루션으로 B
행렬/벡터를 제자리에서 수정합니다. A
는 자신의 QR
또는 LQ
분해로 덮어씌워집니다. trans
는 N
(수정 없음), T
(전치), 또는 C
(켤레 전치) 중 하나일 수 있습니다. gels!
는 최소 노름/최소 제곱 솔루션을 찾습니다. A
는 과소 결정되거나 과대 결정될 수 있습니다. 솔루션은 B
에 반환됩니다.
LinearAlgebra.LAPACK.gesv!
— Functiongesv!(A, B) -> (B, A, ipiv)
선형 방정식 A * X = B
를 해결합니다. 여기서 A
는 정방 행렬이며 A
의 LU
분해를 사용합니다. A
는 LU
분해로 덮어쓰여지고 B
는 해 X
로 덮어씁니다. ipiv
는 A
의 LU
분해에 대한 피벗 정보가 포함되어 있습니다.
LinearAlgebra.LAPACK.getrs!
— Functiongetrs!(trans, A, ipiv, B)
선형 방정식 A * X = B
, transpose(A) * X = B
, 또는 adjoint(A) * X = B
를 정사각형 행렬 A
에 대해 풉니다. 해결책으로 행렬/벡터 B
를 제자리에서 수정합니다. A
는 getrf!
에서의 LU
분해이며, ipiv
는 피벗 정보입니다. trans
는 N
(수정 없음), T
(전치), 또는 C
(켤레 전치) 중 하나일 수 있습니다.
LinearAlgebra.LAPACK.getri!
— Functiongetri!(A, ipiv)
A
의 역행렬을 계산하며, 이는 getrf!
에 의해 발견된 LU
분해를 사용합니다. ipiv
는 출력된 피벗 정보이며, A
는 getrf!
의 LU
분해를 포함합니다. A
는 그 역행렬로 덮어씌워집니다.
LinearAlgebra.LAPACK.gesvx!
— Functiongesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)
선형 방정식 A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), 또는 adjoint(A) * X = B
(trans = C
)를 A
의 LU
분해를 사용하여 풉니다. fact
는 E
일 수 있으며, 이 경우 A
는 균형을 맞추고 AF
에 복사됩니다; F
일 경우, 이전 LU
분해에서 AF
와 ipiv
가 입력으로 사용됩니다; 또는 N
일 경우, A
는 AF
에 복사된 후 분해됩니다. fact = F
인 경우, equed
는 N
일 수 있으며, 이는 A
가 균형을 맞추지 않았음을 의미합니다; R
은 A
가 왼쪽에서 Diagonal(R)
로 곱해졌음을 의미합니다; C
는 A
가 오른쪽에서 Diagonal(C)
로 곱해졌음을 의미합니다; 또는 B
는 A
가 왼쪽에서 Diagonal(R)
로 곱해지고 오른쪽에서 Diagonal(C)
로 곱해졌음을 의미합니다. fact = F
이고 equed = R
또는 B
인 경우 R
의 모든 요소는 양수여야 합니다. fact = F
이고 equed = C
또는 B
인 경우 C
의 모든 요소는 양수여야 합니다.
해결책 X
를 반환합니다; equed
, 이는 fact
가 N
이 아닐 경우 출력이며 수행된 균형 조정을 설명합니다; R
, 행 균형 대각선; C
, 열 균형 대각선; B
, 이는 균형을 맞춘 형태 Diagonal(R)*B
로 덮어쓸 수 있습니다 (만약 trans = N
이고 equed = R,B
인 경우) 또는 Diagonal(C)*B
(만약 trans = T,C
이고 equed = C,B
인 경우); rcond
, 균형 조정 후 A
의 역수 조건 수; ferr
, X
의 각 솔루션 벡터에 대한 전방 오차 한계; berr
, X
의 각 솔루션 벡터에 대한 전방 오차 한계; 및 work
, 역수 피벗 성장 계수입니다.
gesvx!(A, B)
gesvx!
의 비균형, 비전치 단순화입니다.
LinearAlgebra.LAPACK.gelsd!
— Functiongelsd!(A, B, rcond) -> (B, rnk)
A * X = B
의 최소 노름 해를 계산합니다. A
의 SVD
분해를 찾은 다음 문제를 나누어 해결합니다. B
는 해 X
로 덮어씌워집니다. rcond
이하의 특이 값은 0으로 처리됩니다. B
에 해를 반환하고 A
의 유효 순위를 rnk
로 반환합니다.
LinearAlgebra.LAPACK.gelsy!
— Functiongelsy!(A, B, rcond) -> (B, rnk)
A * X = B
의 최소 노름 해를 계산합니다. A
의 전체 QR
분해를 찾은 다음 문제를 나누어 정복합니다. B
는 해 X
로 덮어씌워집니다. rcond
이하의 특이 값은 0으로 처리됩니다. 해는 B
에 반환되고 A
의 유효 계수는 rnk
에 반환됩니다.
LinearAlgebra.LAPACK.gglse!
— Functiongglse!(A, c, B, d) -> (X,res)
방정식 A * x = c
를 해결하며, 여기서 x
는 동등성 제약 B * x = d
를 따릅니다. 공식을 사용하여 ||c - A*x||^2 = 0
를 해결합니다. X
와 잔여 제곱합을 반환합니다.
LinearAlgebra.LAPACK.geev!
— Functiongeev!(jobvl, jobvr, A) -> (W, VL, VR)
행렬 A
의 고유 시스템을 찾습니다. jobvl = N
인 경우, A
의 왼쪽 고유 벡터는 계산되지 않습니다. jobvr = N
인 경우, A
의 오른쪽 고유 벡터는 계산되지 않습니다. jobvl = V
또는 jobvr = V
인 경우, 해당 고유 벡터가 계산됩니다. 고유 값은 W
에, 오른쪽 고유 벡터는 VR
에, 왼쪽 고유 벡터는 VL
에 반환됩니다.
LinearAlgebra.LAPACK.gesdd!
— Functiongesdd!(job, A) -> (U, S, VT)
A
의 특이값 분해를 찾습니다. A = U * S * V'
로, 분할 정복 접근 방식을 사용합니다. job = A
인 경우, U
의 모든 열과 V'
의 모든 행이 계산됩니다. job = N
인 경우, U
의 열이나 V'
의 행이 계산되지 않습니다. job = O
인 경우, A
는 (얇은) U
의 열과 (얇은) V'
의 행으로 덮어씌워집니다. job = S
인 경우, (얇은) U
의 열과 (얇은) V'
의 행이 계산되어 별도로 반환됩니다.
LinearAlgebra.LAPACK.gesvd!
— Functiongesvd!(jobu, jobvt, A) -> (U, S, VT)
A
의 특이값 분해를 찾습니다. A = U * S * V'
. jobu = A
인 경우 U
의 모든 열이 계산됩니다. jobvt = A
인 경우 V'
의 모든 행이 계산됩니다. jobu = N
인 경우 U
의 열이 계산되지 않습니다. jobvt = N
인 경우 V'
의 행이 계산되지 않습니다. jobu = O
인 경우 A
는 (얇은) U
의 열로 덮어씌워집니다. jobvt = O
인 경우 A
는 (얇은) V'
의 행으로 덮어씌워집니다. jobu = S
인 경우 (얇은) U
의 열이 계산되어 별도로 반환됩니다. jobvt = S
인 경우 (얇은) V'
의 행이 계산되어 별도로 반환됩니다. jobu
와 jobvt
는 모두 O
일 수 없습니다.
U
, S
, 및 Vt
를 반환하며, 여기서 S
는 A
의 특이값입니다.
LinearAlgebra.LAPACK.ggsvd!
— Functionggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
A
와 B
의 일반화된 특이값 분해를 찾습니다. U'*A*Q = D1*R
및 V'*B*Q = D2*R
입니다. D1
의 대각선에는 alpha
가 있고, D2
의 대각선에는 beta
가 있습니다. jobu = U
인 경우 직교/유니타리 행렬 U
가 계산됩니다. jobv = V
인 경우 직교/유니타리 행렬 V
가 계산됩니다. jobq = Q
인 경우 직교/유니타리 행렬 Q
가 계산됩니다. jobu
, jobv
또는 jobq
가 N
인 경우 해당 행렬은 계산되지 않습니다. 이 함수는 LAPACK 3.6.0 이전 버전에서만 사용할 수 있습니다.
LinearAlgebra.LAPACK.ggsvd3!
— Functionggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
A
와 B
의 일반화된 특이값 분해를 찾습니다. U'*A*Q = D1*R
및 V'*B*Q = D2*R
입니다. D1
의 대각선에는 alpha
가 있고, D2
의 대각선에는 beta
가 있습니다. jobu = U
인 경우, 직교/유니타리 행렬 U
가 계산됩니다. jobv = V
인 경우, 직교/유니타리 행렬 V
가 계산됩니다. jobq = Q
인 경우, 직교/유니타리 행렬 Q
가 계산됩니다. jobu
, jobv
또는 jobq
가 N
인 경우, 해당 행렬은 계산되지 않습니다. 이 함수는 LAPACK 3.6.0이 필요합니다.
LinearAlgebra.LAPACK.geevx!
— Functiongeevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
A
의 고유 시스템을 행렬 균형을 사용하여 찾습니다. jobvl = N
인 경우 A
의 왼쪽 고유 벡터는 계산되지 않습니다. jobvr = N
인 경우 A
의 오른쪽 고유 벡터는 계산되지 않습니다. jobvl = V
또는 jobvr = V
인 경우 해당 고유 벡터가 계산됩니다. balanc = N
인 경우 균형 조정이 수행되지 않습니다. balanc = P
인 경우 A
는 순열되지만 스케일링되지 않습니다. balanc = S
인 경우 A
는 스케일링되지만 순열되지 않습니다. balanc = B
인 경우 A
는 순열되고 스케일링됩니다. sense = N
인 경우 역 조건 수가 계산되지 않습니다. sense = E
인 경우 고유값에 대해서만 역 조건 수가 계산됩니다. sense = V
인 경우 오른쪽 고유 벡터에 대해서만 역 조건 수가 계산됩니다. sense = B
인 경우 오른쪽 고유 벡터와 고유 벡터에 대해 역 조건 수가 계산됩니다. sense = E,B
인 경우 오른쪽 및 왼쪽 고유 벡터가 계산되어야 합니다.
LinearAlgebra.LAPACK.ggev!
— Functionggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
A
와 B
의 일반화된 고유 분해를 찾습니다. jobvl = N
인 경우 왼쪽 고유 벡터는 계산되지 않습니다. jobvr = N
인 경우 오른쪽 고유 벡터는 계산되지 않습니다. jobvl = V
또는 jobvr = V
인 경우 해당 고유 벡터가 계산됩니다.
LinearAlgebra.LAPACK.ggev3!
— Functionggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
A
와 B
의 일반화된 고유 분해를 블록 알고리즘을 사용하여 찾습니다. jobvl = N
인 경우 왼쪽 고유 벡터는 계산되지 않습니다. jobvr = N
인 경우 오른쪽 고유 벡터는 계산되지 않습니다. jobvl = V
또는 jobvr = V
인 경우 해당 고유 벡터가 계산됩니다. 이 함수는 LAPACK 3.6.0이 필요합니다.
LinearAlgebra.LAPACK.gtsv!
— Functiongtsv!(dl, d, du, B)
A * X = B
방정식을 풉니다. 여기서 A
는 하삼각 행렬 dl
, 대각선 d
, 상삼각 행렬 du
를 가진 삼대각 행렬입니다.
B
를 해 X
로 덮어쓰고 반환합니다.
LinearAlgebra.LAPACK.gttrf!
— Functiongttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
삼대각 행렬의 LU
분해를 찾습니다. 여기서 dl
은 하삼각, d
는 대각선, du
는 상삼각에 위치합니다.
dl
, d
, du
를 제자리에서 수정하고, 이들과 두 번째 상삼각 du2
, 피벗 벡터 ipiv
를 반환합니다.
LinearAlgebra.LAPACK.gttrs!
— Functiongttrs!(trans, dl, d, du, du2, ipiv, B)
방정식 A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), 또는 adjoint(A) * X = B
(trans = C
)를 gttrf!
에 의해 계산된 LU
분해를 사용하여 풉니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.orglq!
— Functionorglq!(A, tau, k = length(tau))
gelqf!
를 호출한 후 LQ
분해의 행렬 Q
를 명시적으로 찾습니다. gelqf!
의 출력을 사용합니다. A
는 Q
로 덮어씌워집니다.
LinearAlgebra.LAPACK.orgqr!
— Functionorgqr!(A, tau, k = length(tau))
geqrf!
를 호출한 후 QR
분해의 행렬 Q
를 명시적으로 찾습니다. geqrf!
의 출력을 사용합니다. A
는 Q
로 덮어씌워집니다.
LinearAlgebra.LAPACK.orgql!
— Functionorgql!(A, tau, k = length(tau))
geqlf!
를 호출한 후 QL
분해의 행렬 Q
를 명시적으로 찾습니다. geqlf!
의 출력을 사용합니다. A
는 Q
로 덮어씌워집니다.
LinearAlgebra.LAPACK.orgrq!
— Functionorgrq!(A, tau, k = length(tau))
gerqf!
를 호출한 후 RQ
분해의 행렬 Q
를 명시적으로 찾습니다. gerqf!
의 출력을 사용합니다. A
는 Q
로 덮어씌워집니다.
LinearAlgebra.LAPACK.ormlq!
— Functionormlq!(side, trans, A, tau, C)
Q * C
를 계산합니다 (trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
)는 side = L
에 대해 또는 side = R
에 대해 gelqf!
를 사용하여 계산된 A
의 LQ
분해에서 Q
를 사용하여 동등한 오른쪽 곱셈을 수행합니다. C
는 덮어씌워집니다.
LinearAlgebra.LAPACK.ormqr!
— Functionormqr!(side, trans, A, tau, C)
Q * C
를 계산합니다 (trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
)는 side = L
에 대해 또는 side = R
에 대해 A
의 QR
분해에서 계산된 Q
를 사용하여 동등한 오른쪽 곱셈을 수행합니다. C
는 덮어씌워집니다.
LinearAlgebra.LAPACK.ormql!
— Functionormql!(side, trans, A, tau, C)
Q * C
를 계산합니다 (trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
)는 side = L
에 대해 또는 side = R
에 대해 A
의 QL
분해에서 계산된 Q
를 사용하여 동등한 오른쪽 곱셈을 수행합니다. C
는 덮어씌워집니다.
LinearAlgebra.LAPACK.ormrq!
— Functionormrq!(side, trans, A, tau, C)
Q * C
를 계산합니다 (trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
)는 side = L
에 대해 또는 side = R
에 대해 A
의 RQ
분해에서 계산된 Q
를 사용하여 동등한 오른쪽 곱셈을 수행합니다. C
는 덮어씌워집니다.
LinearAlgebra.LAPACK.gemqrt!
— Functiongemqrt!(side, trans, V, T, C)
Q * C
를 계산합니다 (trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
)는 side = L
에 대해 또는 side = R
에 대해 geqrt!
를 사용하여 계산된 A
의 QR
분해에서 Q
를 사용하여 동일한 오른쪽 곱셈을 수행합니다. C
는 덮어씌워집니다.
LinearAlgebra.LAPACK.posv!
— Functionposv!(uplo, A, B) -> (A, B)
A * X = B
의 해를 찾습니다. 여기서 A
는 대칭 또는 에르미트 양의 정부호 행렬입니다. uplo = U
인 경우 A
의 상부 콜레스키 분해가 계산됩니다. uplo = L
인 경우 A
의 하부 콜레스키 분해가 계산됩니다. A
는 자신의 콜레스키 분해로 덮어씌워집니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.potrf!
— Functionpotrf!(uplo, A)
양의 정부호 행렬 A
의 Cholesky(위쪽은 uplo = U
, 아래쪽은 uplo = L
) 분해를 계산합니다. A
는 덮어쓰여지며 정보 코드와 함께 반환됩니다.
LinearAlgebra.LAPACK.potri!
— Functionpotri!(uplo, A)
양의 정부호 행렬 A
의 역을 계산합니다. uplo = U
인 경우 상삼각형, uplo = L
인 경우 하삼각형 Cholesky 분해를 찾기 위해 potrf!
를 호출한 후에 수행됩니다.
A
는 그 역으로 덮어쓰여지고 반환됩니다.
LinearAlgebra.LAPACK.potrs!
— Functionpotrs!(uplo, A, B)
A * X = B
의 해를 찾습니다. 여기서 A
는 potrf!
에 의해 계산된 Cholesky 분해를 가진 대칭 또는 에르미트 양의 정부호 행렬입니다. uplo = U
인 경우 A
의 상부 Cholesky 분해가 계산되었습니다. uplo = L
인 경우 A
의 하부 Cholesky 분해가 계산되었습니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.pstrf!
— Functionpstrf!(uplo, A, tol) -> (A, piv, rank, info)
양의 정부호 행렬 A
의 (상부인 경우 uplo = U
, 하부인 경우 uplo = L
) 피벗된 콜레스키 분해를 사용자 설정 허용오차 tol
로 계산합니다. A
는 콜레스키 분해로 덮어씌워집니다.
A
, 피벗 piv
, A
의 랭크, 그리고 info
코드를 반환합니다. info = 0
이면 분해가 성공한 것입니다. info = i > 0
이면 A
가 부정적이거나 랭크가 결핍된 것입니다.
LinearAlgebra.LAPACK.ptsv!
— Functionptsv!(D, E, B)
양의 정부호 삼대각 행렬 A
에 대해 A * X = B
를 풉니다. D
는 A
의 대각선이고 E
는 비대각선입니다. B
는 해 X
로 덮어쓰여지고 반환됩니다.
LinearAlgebra.LAPACK.pttrf!
— Functionpttrf!(D, E)
양의 정부호 삼대각 행렬의 LDLt 분해를 계산합니다. 여기서 D
는 대각선 요소이고 E
는 비대각선 요소입니다. D
와 E
는 덮어쓰여지고 반환됩니다.
LinearAlgebra.LAPACK.pttrs!
— Functionpttrs!(D, E, B)
양의 정부호 삼대각 행렬 A
에 대해 A * X = B
를 해결합니다. 여기서 A
는 대각선 D
와 비대각선 E
를 가지고 있으며, pttrf!
를 사용하여 A
의 LDLt 분해를 계산한 후에 수행됩니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.trtri!
— Functiontrtri!(uplo, diag, A)
상삼각 행렬(uplo = U
인 경우) 또는 하삼각 행렬(uplo = L
인 경우) A
의 역행렬을 찾습니다. diag = N
인 경우, A
는 비단위 대각 요소를 가집니다. diag = U
인 경우, A
의 모든 대각 요소는 1입니다. A
는 그 역행렬로 덮어씌워집니다.
LinearAlgebra.LAPACK.trtrs!
— Functiontrtrs!(uplo, trans, diag, A, B)
A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), 또는 adjoint(A) * X = B
(trans = C
)를 해결합니다. 여기서 (상부는 uplo = U
, 하부는 uplo = L
) 삼각 행렬 A
입니다. diag = N
인 경우, A
는 비단위 대각 요소를 가집니다. diag = U
인 경우, A
의 모든 대각 요소는 1입니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.trcon!
— Functiontrcon!(norm, uplo, diag, A)
주어진 삼각 행렬 A
의 역 조건 수를 찾습니다 (만약 uplo = U
이면 상삼각, uplo = L
이면 하삼각). diag = N
인 경우, A
는 비단위 대각 요소를 가집니다. diag = U
인 경우, A
의 모든 대각 요소는 1입니다. norm = I
인 경우, 조건 수는 무한 노름에서 찾습니다. norm = O
또는 1
인 경우, 조건 수는 1 노름에서 찾습니다.
LinearAlgebra.LAPACK.trevc!
— Functiontrevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))
상삼각 행렬 T
의 고유 시스템을 찾습니다. side = R
인 경우, 오른쪽 고유 벡터가 계산됩니다. side = L
인 경우, 왼쪽 고유 벡터가 계산됩니다. side = B
인 경우, 두 집합이 모두 계산됩니다. howmny = A
인 경우, 모든 고유 벡터가 발견됩니다. howmny = B
인 경우, 모든 고유 벡터가 발견되고 VL
과 VR
을 사용하여 역변환됩니다. howmny = S
인 경우, select
에 있는 값에 해당하는 고유 벡터만 계산됩니다.
LinearAlgebra.LAPACK.trrfs!
— Functiontrrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)
A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), adjoint(A) * X = B
(trans = C
)에 대한 해의 오차를 추정합니다. side = L
인 경우, 또는 trtrs!
를 사용하여 X
를 계산한 후 오른쪽에 해당하는 side = R
의 X * A
에 대한 동등한 방정식입니다. uplo = U
인 경우, A
는 상삼각 행렬입니다. uplo = L
인 경우, A
는 하삼각 행렬입니다. diag = N
인 경우, A
는 비단위 대각 요소를 가집니다. diag = U
인 경우, A
의 모든 대각 요소는 1입니다. Ferr
와 Berr
는 선택적 입력입니다. Ferr
는 전방 오차이고 Berr
는 후방 오차로, 각 구성 요소별입니다.
LinearAlgebra.LAPACK.stev!
— Functionstev!(job, dv, ev) -> (dv, Zmat)
대칭 삼중 대각 행렬의 고유 시스템을 계산합니다. 여기서 dv
는 대각선 요소이고 ev
는 비대각선 요소입니다. job = N
인 경우 고유값만 찾아서 dv
에 반환합니다. job = V
인 경우 고유벡터도 찾아서 Zmat
에 반환합니다.
LinearAlgebra.LAPACK.stebz!
— Functionstebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)
대칭 삼중 대각 행렬의 고유값을 계산합니다. 여기서 dv
는 대각선 요소이고 ev
는 비대각선 요소입니다. range = A
인 경우 모든 고유값이 찾아집니다. range = V
인 경우 반개방 구간 (vl, vu]
내의 고유값이 찾아집니다. range = I
인 경우 인덱스가 il
과 iu
사이에 있는 고유값이 찾아집니다. order = B
인 경우 고유값이 블록 내에서 정렬됩니다. order = E
인 경우 모든 블록에 걸쳐 정렬됩니다. abstol
은 수렴을 위한 허용 오차로 설정할 수 있습니다.
LinearAlgebra.LAPACK.stegr!
— Functionstegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)
대칭 삼중 대각 행렬에 대한 고유값(jobz = N
) 또는 고유값과 고유벡터(jobz = V
)를 계산합니다. 여기서 dv
는 대각선 요소이고 ev
는 비대각선 요소입니다. range = A
인 경우 모든 고유값이 찾아집니다. range = V
인 경우 반열림 구간 (vl, vu]
에 있는 고유값이 찾아집니다. range = I
인 경우 인덱스가 il
과 iu
사이에 있는 고유값이 찾아집니다. 고유값은 w
에, 고유벡터는 Z
에 반환됩니다.
LinearAlgebra.LAPACK.stein!
— Functionstein!(dv, ev_in, w_in, iblock_in, isplit_in)
대칭 삼대각 행렬에 대한 고유벡터를 계산합니다. 여기서 dv
는 대각선 요소, ev_in
은 비대각선 요소입니다. w_in
은 해당 고유벡터를 찾기 위한 입력 고유값을 지정합니다. iblock_in
은 w_in
의 고유값에 해당하는 부분 행렬을 지정합니다. isplit_in
은 부분 행렬 블록 간의 분할 지점을 지정합니다.
LinearAlgebra.LAPACK.syconv!
— Functionsyconv!(uplo, A, ipiv) -> (A, work)
대칭 행렬 A
를 두 개의 행렬 L
과 D
로 변환합니다(삼각 행렬로 인수분해된 상태). uplo = U
인 경우, A
는 상삼각형입니다. uplo = L
인 경우, 하삼각형입니다. ipiv
는 삼각 인수분해에서의 피벗 벡터입니다. A
는 L
과 D
로 덮어씌워집니다.
LinearAlgebra.LAPACK.sysv!
— Functionsysv!(uplo, A, B) -> (B, A, ipiv)
대칭 행렬 A
에 대해 A * X = B
의 해를 찾습니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다. B
는 해 X
로 덮어씌워집니다. A
는 Bunch-Kaufman 분해로 덮어씌워집니다. ipiv
는 분해에 대한 피벗 정보가 포함되어 있습니다.
LinearAlgebra.LAPACK.sytrf!
— Functionsytrf!(uplo, A) -> (A, ipiv, info)
대칭 행렬 A
의 Bunch-Kaufman 분해를 계산합니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다.
분해로 덮어쓴 A
, 피벗 벡터 ipiv
, 그리고 비음수 정수인 오류 코드 info
를 반환합니다. info
가 양수인 경우 행렬이 특이하며 분해의 대각선 부분이 정확히 info
위치에서 0입니다.
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)
대칭 행렬 A
의 Bunch-Kaufman 분해를 계산합니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다.
분해로 덮어쓴 A
, 피벗 벡터 ipiv
, 그리고 비음수 정수인 오류 코드 info
를 반환합니다. info
가 양수인 경우 행렬이 특이하며 분해의 대각선 부분이 정확히 info
위치에서 0입니다.
LinearAlgebra.LAPACK.sytri!
— Functionsytri!(uplo, A, ipiv)
대칭 행렬 A
의 역을 sytrf!
의 결과를 사용하여 계산합니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다. A
는 그 역으로 덮어씌워집니다.
LinearAlgebra.LAPACK.sytrs!
— Functionsytrs!(uplo, A, ipiv, B)
대칭 행렬 A
에 대해 sytrf!
의 결과를 사용하여 방정식 A * X = B
를 풉니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.hesv!
— Functionhesv!(uplo, A, B) -> (B, A, ipiv)
헤르미트 행렬 A
에 대해 A * X = B
의 해를 찾습니다. uplo = U
인 경우 A
의 상단 절반이 저장됩니다. uplo = L
인 경우 하단 절반이 저장됩니다. B
는 해 X
로 덮어씌워집니다. A
는 Bunch-Kaufman 인수분해로 덮어씌워집니다. ipiv
는 인수분해에 대한 피벗 정보가 포함되어 있습니다.
LinearAlgebra.LAPACK.hetrf!
— Functionhetrf!(uplo, A) -> (A, ipiv, info)
허미티안 행렬 A
의 Bunch-Kaufman 분해를 계산합니다. uplo = U
인 경우 A
의 상반부가 저장됩니다. uplo = L
인 경우 하반부가 저장됩니다.
분해로 덮어쓴 A
, 피벗 벡터 ipiv
, 그리고 비음수 정수인 오류 코드 info
를 반환합니다. info
가 양수인 경우 행렬이 특이하며 분해의 대각선 부분이 info
위치에서 정확히 0입니다.
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)
허미티안 행렬 A
의 Bunch-Kaufman 분해를 계산합니다. uplo = U
인 경우 A
의 상반부가 저장됩니다. uplo = L
인 경우 하반부가 저장됩니다.
분해로 덮어쓴 A
, 피벗 벡터 ipiv
, 그리고 비음수 정수인 오류 코드 info
를 반환합니다. info
가 양수인 경우 행렬은 특이하며 분해의 대각 부분이 정확히 info
위치에서 0입니다.
LinearAlgebra.LAPACK.hetri!
— Functionhetri!(uplo, A, ipiv)
헤르미트 행렬 A
의 역을 sytrf!
의 결과를 사용하여 계산합니다. uplo = U
인 경우 A
의 상반부가 저장됩니다. uplo = L
인 경우 하반부가 저장됩니다. A
는 그 역으로 덮어씌워집니다.
LinearAlgebra.LAPACK.hetrs!
— Functionhetrs!(uplo, A, ipiv, B)
헤르미트 행렬 A
에 대해 sytrf!
의 결과를 사용하여 방정식 A * X = B
를 풉니다. uplo = U
인 경우 A
의 상반부가 저장됩니다. uplo = L
인 경우 하반부가 저장됩니다. B
는 해 X
로 덮어씌워집니다.
LinearAlgebra.LAPACK.syev!
— Functionsyev!(jobz, uplo, A)
대칭 행렬 A
의 고유값(jobz = N
) 또는 고유값과 고유벡터(jobz = V
)를 찾습니다. uplo = U
인 경우 A
의 상삼각형이 사용됩니다. uplo = L
인 경우 A
의 하삼각형이 사용됩니다.
LinearAlgebra.LAPACK.syevr!
— Functionsyevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)
대칭 행렬 A
의 고유값(jobz = N
) 또는 고유값과 고유벡터(jobz = V
)를 찾습니다. uplo = U
인 경우 A
의 상삼각형이 사용됩니다. uplo = L
인 경우 A
의 하삼각형이 사용됩니다. range = A
인 경우 모든 고유값이 찾습니다. range = V
인 경우 반열린 구간 (vl, vu]
에 있는 고유값이 찾습니다. range = I
인 경우 인덱스가 il
과 iu
사이에 있는 고유값이 찾습니다. abstol
은 수렴을 위한 허용오차로 설정할 수 있습니다.
고유값은 W
에, 고유벡터는 Z
에 반환됩니다.
LinearAlgebra.LAPACK.syevd!
— Functionsyevd!(jobz, uplo, A)
대칭 행렬 A
의 고유값(jobz = N
) 또는 고유값과 고유벡터(jobz = V
)를 찾습니다. uplo = U
인 경우 A
의 상삼각형이 사용됩니다. uplo = L
인 경우 A
의 하삼각형이 사용됩니다.
syev!
에서 사용하는 QR 반복 대신 분할 정복 방법을 사용합니다. 또는 syevr!
에서 사용하는 여러 상대적으로 강건한 표현을 사용합니다. 다양한 방법의 정확도와 성능 비교는 James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008)를 참조하십시오.
LinearAlgebra.LAPACK.sygvd!
— Functionsygvd!(itype, jobz, uplo, A, B) -> (w, A, B)
대칭 행렬 A
와 대칭 양의 정부호 행렬 B
의 일반화된 고유값(jobz = N
) 또는 고유값 및 고유벡터(jobz = V
)를 찾습니다. uplo = U
인 경우 A
와 B
의 상삼각형이 사용됩니다. uplo = L
인 경우 A
와 B
의 하삼각형이 사용됩니다. itype = 1
인 경우 해결해야 할 문제는 A * x = lambda * B * x
입니다. itype = 2
인 경우 해결해야 할 문제는 A * B * x = lambda * x
입니다. itype = 3
인 경우 해결해야 할 문제는 B * A * x = lambda * x
입니다.
LinearAlgebra.LAPACK.bdsqr!
— Functionbdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)
주대각선에 d
가 있고 비대각선에 e_
가 있는 비대각 행렬의 특이값 분해를 계산합니다. uplo = U
인 경우, e_
는 상대각선입니다. uplo = L
인 경우, e_
는 하대각선입니다. 선택적으로 Q' * C
의 곱도 계산할 수 있습니다.
특이값은 d
에 반환되며, 행렬 C
는 Q' * C
로 덮어씌워집니다.
LinearAlgebra.LAPACK.bdsdc!
— Functionbdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)
주어진 대각선에 d
가 있고 비대각선에 e_
가 있는 이분 대각 행렬의 특이값 분해를 나누기 및 정복 방법을 사용하여 계산합니다. uplo = U
인 경우 e_
는 상대각선입니다. uplo = L
인 경우 e_
는 하대각선입니다. compq = N
인 경우 특이값만 찾습니다. compq = I
인 경우 특이값과 벡터를 찾습니다. compq = P
인 경우 특이값과 벡터를 압축 형식으로 찾습니다. 실수 유형에 대해서만 작동합니다.
특이값을 d
에 반환하며, compq = P
인 경우 압축된 특이 벡터를 iq
에 반환합니다.
LinearAlgebra.LAPACK.gecon!
— Functiongecon!(normtype, A, anorm)
행렬 A
의 역 조건 수를 찾습니다. normtype = I
인 경우, 조건 수는 무한 노름에서 찾습니다. normtype = O
또는 1
인 경우, 조건 수는 1 노름에서 찾습니다. A
는 getrf!
의 결과여야 하며, anorm
은 관련 노름에서의 A
의 노름입니다.
LinearAlgebra.LAPACK.gehrd!
— Functiongehrd!(ilo, ihi, A) -> (A, tau)
행렬 A
를 헤센베르크 형식으로 변환합니다. 만약 A
가 gebal!
로 균형이 맞춰져 있다면 ilo
와 ihi
는 gebal!
의 출력값입니다. 그렇지 않으면 ilo = 1
및 ihi = size(A,2)
이어야 합니다. tau
는 분해의 기본 반사기를 포함합니다.
LinearAlgebra.LAPACK.orghr!
— Functionorghr!(ilo, ihi, A, tau)
명시적으로 gehrd!
에서의 직교/유니타리 행렬 Q
를 찾습니다. ilo
, ihi
, A
, 및 tau
는 gehrd!
의 입력/출력에 해당해야 합니다.
LinearAlgebra.LAPACK.gees!
— Functiongees!(jobvs, A) -> (A, vs, w)
행렬 A
의 고유값(jobvs = N
) 또는 고유값과 슈르 벡터(jobvs = V
)를 계산합니다. A
는 슈르 형식으로 덮어씌워집니다.
A
, 슈르 벡터를 포함하는 vs
, 고유값을 포함하는 w
를 반환합니다.
LinearAlgebra.LAPACK.gges!
— Functiongges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
일반화 고유값, 일반화 슈르 형식, 왼쪽 슈르 벡터(jobsvl = V
), 또는 오른쪽 슈르 벡터(jobvsr = V
)를 A
와 B
의 경우 계산합니다.
일반화 고유값은 alpha
와 beta
에 반환됩니다. 왼쪽 슈르 벡터는 vsl
에 반환되고 오른쪽 슈르 벡터는 vsr
에 반환됩니다.
LinearAlgebra.LAPACK.gges3!
— Functiongges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
일반화된 고유값, 일반화된 슈르 형식, 왼쪽 슈르 벡터(jobsvl = V
), 또는 오른쪽 슈르 벡터(jobvsr = V
)를 차단된 알고리즘을 사용하여 A
와 B
의 계산합니다. 이 함수는 LAPACK 3.6.0이 필요합니다.
일반화된 고유값은 alpha
와 beta
에 반환됩니다. 왼쪽 슈르 벡터는 vsl
에 반환되고 오른쪽 슈르 벡터는 vsr
에 반환됩니다.
LinearAlgebra.LAPACK.trexc!
— Functiontrexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)
행렬의 Schur 분해 T
를 재정렬하여, 행 인덱스 ifst
를 가진 T
의 대각 블록이 행 인덱스 ilst
로 이동하도록 합니다. compq = V
인 경우, Schur 벡터 Q
가 재정렬됩니다. compq = N
인 경우, 수정되지 않습니다. 4-인자 메서드는 compq = V
로 5-인자 메서드를 호출합니다.
LinearAlgebra.LAPACK.trsen!
— Functiontrsen!(job, compq, select, T, Q) -> (T, Q, w, s, sep)
trsen!(select, T, Q) -> (T, Q, w, s, sep)
행렬의 슈르 분해를 재정렬하고 선택적으로 역 조건 수를 찾습니다. job = N
인 경우 조건 수가 발견되지 않습니다. job = E
인 경우 이 고유값 클러스터에 대한 조건 수만 발견됩니다. job = V
인 경우 불변 부분공간에 대한 조건 수만 발견됩니다. job = B
인 경우 클러스터와 부분공간에 대한 조건 수가 발견됩니다. compq = V
인 경우 슈르 벡터 Q
가 업데이트됩니다. compq = N
인 경우 슈르 벡터가 수정되지 않습니다. select
는 클러스터에 포함된 고유값을 결정합니다. 3-인자 메서드는 job = N
및 compq = V
로 5-인자 메서드를 호출합니다.
T
, Q
, 재정렬된 고유값 w
, 고유값 클러스터의 조건 수 s
, 불변 부분공간의 조건 수 sep
를 반환합니다.
LinearAlgebra.LAPACK.tgsen!
— Functiontgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
일반화된 슈르 분해의 벡터를 재정렬합니다. select
는 각 클러스터의 고유값을 지정합니다.
LinearAlgebra.LAPACK.trsyl!
— Functiontrsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)
실베스터 행렬 방정식 A * X +/- X * B = scale*C
를 해결합니다. 여기서 A
와 B
는 모두 준상삼각형입니다. transa = N
인 경우, A
는 수정되지 않습니다. transa = T
인 경우, A
는 전치됩니다. transa = C
인 경우, A
는 켤레 전치됩니다. transb
와 B
에 대해서도 마찬가지입니다. isgn = 1
인 경우, 방정식 A * X + X * B = scale * C
가 해결됩니다. isgn = -1
인 경우, 방정식 A * X - X * B = scale * C
가 해결됩니다.
X
(C를 덮어씀)와 scale
을 반환합니다.
LinearAlgebra.LAPACK.hseqr!
— Functionhseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
행렬을 헤센베르크 형태로 축소하여 모든 고유값과 (선택적으로) 슈르 분해를 계산합니다. H
가 gebal!
로 균형이 맞춰져 있으면 ilo
와 ihi
는 gebal!
의 출력입니다. 그렇지 않으면 ilo = 1
및 ihi = size(H,2)
이어야 합니다. tau
는 분해의 기본 반사기를 포함합니다.
- ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
- DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
- Bischof1987C Bischof and C Van Loan, "The WY representation for products of Householder matrices", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber and C Van Loan, "A storage-efficient WY representation for products of Householder transformations", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
- ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
- Bunch1977J R Bunch와 L Kaufman, Some stable methods for calculating inertia and solving symmetric linear systems, Mathematics of Computation 31:137 (1977), 163-179. url.
- issue8859Issue 8859, "Fix least squares", https://github.com/JuliaLang/julia/pull/8859
- B96Åke Björck, "Numerical Methods for Least Squares Problems", SIAM Press, Philadelphia, 1996, "Other Titles in Applied Mathematics", Vol. 51. doi:10.1137/1.9781611971484
- S84G. W. Stewart, "Rank Degeneracy", SIAM Journal on Scientific and Statistical Computing, 5(2), 1984, 403-413. doi:10.1137/0905030
- KY88Konstantinos Konstantinides and Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. doi:10.1109/29.1585
- H05Nicholas J. Higham, "The squaring and scaling method for the matrix exponential revisited", SIAM Journal on Matrix Analysis and Applications, 26(4), 2005, 1179-1193. doi:10.1137/090768539
- AH12Awad H. Al-Mohy와 Nicholas J. Higham, "Improved inverse scaling and squaring algorithms for the matrix logarithm", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham 및 Samuel D. Relton, "Computing the Fréchet derivative of the matrix logarithm and estimating the condition number", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck and Sven Hammarling, "A Schur method for the square root of a matrix", Linear Algebra and its Applications, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
- H87Nicholas J. Higham, "Computing real square roots of a real matrix", Linear Algebra and its Applications, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
- S03Matthew I. Smith, "A Schur Algorithm for Computing Matrix pth Roots", SIAM Journal on Matrix Analysis and Applications, vol. 24, 2003, pp. 971–989. doi:10.1137/S0895479801392697
- AH16_1Mary Aprahamian과 Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Mary Aprahamian과 Nicholas J. Higham, "행렬 역 삼각 함수 및 역 쌍곡선 함수: 이론 및 알고리즘", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Mary Aprahamian과 Nicholas J. Higham, "행렬 역 삼각 함수 및 역 쌍곡선 함수: 이론 및 알고리즘", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Mary Aprahamian과 Nicholas J. Higham, "행렬 역 삼각 함수 및 역 쌍곡선 함수: 이론 및 알고리즘", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Mary Aprahamian과 Nicholas J. Higham, "행렬 역삼각 함수 및 역쌍곡선 함수: 이론 및 알고리즘", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Mary Aprahamian과 Nicholas J. Higham, "행렬 역 삼각 함수 및 역 쌍곡선 함수: 이론 및 알고리즘", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577