Linear Algebra
En plus de (et dans le cadre de) son support pour les tableaux multidimensionnels, Julia fournit des implémentations natives de nombreuses opérations d'algèbre linéaire courantes et utiles qui peuvent être chargées avec using LinearAlgebra
. Les opérations de base, telles que tr
, det
, et inv
sont toutes prises en charge :
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
Ainsi que d'autres opérations utiles, telles que la recherche des valeurs propres ou des vecteurs propres :
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
De plus, Julia fournit de nombreux factorizations qui peuvent être utilisés pour accélérer des problèmes tels que la résolution linéaire ou l'exponentiation de matrices en pré-factorisant une matrice dans une forme plus adaptée (pour des raisons de performance ou de mémoire) au problème. Consultez la documentation sur factorize
pour plus d'informations. À titre d'exemple :
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
Puisque A
n'est pas hermitien, symétrique, triangulaire, tridiagonale ou bidiagonale, une factorisation LU est peut-être le mieux que nous puissions faire. Comparez avec :
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
Ici, Julia a pu détecter que B
est en fait symétrique et a utilisé une factorisation plus appropriée. Il est souvent possible d'écrire un code plus efficace pour une matrice qui est connue pour avoir certaines propriétés, par exemple, elle est symétrique ou tridiagonale. Julia fournit certains types spéciaux afin que vous puissiez "taguer" les matrices comme ayant ces propriétés. Par exemple :
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
a été étiqueté comme une matrice qui est (réelle) symétrique, donc pour les opérations ultérieures que nous pourrions effectuer dessus, telles que l'eigenfactorisation ou le calcul de produits matrice-vecteur, des gains d'efficacité peuvent être trouvés en ne faisant référence qu'à la moitié. Par exemple :
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
L'opération \
ici effectue la solution linéaire. L'opérateur de division à gauche est assez puissant et il est facile d'écrire un code compact et lisible qui est suffisamment flexible pour résoudre toutes sortes de systèmes d'équations linéaires.
Special matrices
Matrices with special symmetries and structures surgissent souvent en algèbre linéaire et sont fréquemment associés à diverses factorizations de matrices. Julia propose une riche collection de types de matrices spéciaux, qui permettent un calcul rapide avec des routines spécialisées spécialement développées pour des types de matrices particuliers.
Les tableaux suivants résument les types de matrices spéciales qui ont été implémentées en Julia, ainsi que la disponibilité de crochets pour diverses méthodes optimisées pour elles dans 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 | / |
Légende :
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 |
Légende :
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
Un opérateur UniformScaling
représente un scalaire multiplié par l'opérateur d'identité, λ*I
. L'opérateur d'identité I
est défini comme une constante et est une instance de UniformScaling
. La taille de ces opérateurs est générique et correspond à l'autre matrice dans les opérations binaires +
, -
, *
et \
. Pour A+I
et A-I
, cela signifie que A
doit être carrée. La multiplication avec l'opérateur d'identité I
est une opération sans effet (sauf pour vérifier que le facteur d'échelle est un) et donc presque sans surcharge.
Pour voir l'opérateur UniformScaling
en action :
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:
[...]
Si vous devez résoudre de nombreux systèmes de la forme (A+μI)x = b
pour le même A
et différents μ
, il peut être bénéfique de d'abord calculer la factorisation de Hessenberg F
de A
via la fonction hessenberg
. Étant donné F
, Julia utilise un algorithme efficace pour (F+μ*I) \ b
(équivalent à (A+μ*I)x \ b
) et des opérations connexes comme les déterminants.
Matrix factorizations
Matrix factorizations (a.k.a. matrix decompositions) calcule la factorisation d'une matrice en un produit de matrices, et est l'un des concepts centraux de l'algèbre linéaire (numérique).
Le tableau suivant résume les types de factorizations de matrices qui ont été implémentées en Julia. Les détails de leurs méthodes associées peuvent être trouvés dans la section Standard functions de la documentation sur l'algèbre linéaire.
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 |
Les adjoints et les transposés des objets Factorization
sont paresseusement enveloppés dans des objets AdjointFactorization
et TransposeFactorization
, respectivement. En général, le transposé des Factorization
s réels est enveloppé sous la forme d'un AdjointFactorization
.
Orthogonal matrices (AbstractQ
)
Certaines factorizations de matrices génèrent des facteurs "matriciels" orthogonaux/unitaires. Ces factorizations incluent des factorizations liées à QR obtenues à partir d'appels à qr
, c'est-à-dire QR
, QRCompactWY
et QRPivoted
, la factorisation de Hessenberg obtenue à partir d'appels à hessenberg
, et la factorisation LQ obtenue à partir de lq
. Bien que ces facteurs orthogonaux/unitaires admettent une représentation matricielle, leur représentation interne est, pour des raisons de performance et de mémoire, différente. Par conséquent, ils doivent plutôt être considérés comme des opérateurs linéaires basés sur des matrices et fonctionnels. En particulier, lire, par exemple, une colonne de sa représentation matricielle nécessite d'exécuter un code de multiplication "matrice"-vecteur, plutôt que de simplement lire des données en mémoire (remplissant éventuellement des parties du vecteur avec des zéros structurels). Une autre distinction claire par rapport à d'autres types de matrices non triangulaires est que le code de multiplication sous-jacent permet une modification en place lors de la multiplication. De plus, des objets de sous-types spécifiques AbstractQ
, tels que ceux créés via 4d61726b646f776e2e436f64652822222c202271722229_40726566
, 4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566
et 4d61726b646f776e2e436f64652822222c20226c712229_40726566
, peuvent se comporter comme une matrice carrée ou rectangulaire selon le contexte :
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
En raison de cette distinction par rapport aux matrices denses ou structurées, le type abstrait AbstractQ
ne sous-type pas AbstractMatrix
, mais a plutôt sa propre hiérarchie de types. Les types personnalisés qui sous-tendent AbstractQ
peuvent s'appuyer sur des solutions génériques si l'interface suivante est satisfaite. Par exemple, pour
struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
# required fields
end
fournir des surcharges pour
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
Si la promotion eltype
n'est pas d'intérêt, la méthode convert
est inutile, car par défaut convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})
retourne Q
lui-même. Les adjoints des objets de type AbstractQ
sont paresseusement enveloppés dans un type d'enveloppe AdjointQ
, qui nécessite ses propres méthodes LinearAlgebra.lmul!
et LinearAlgebra.rmul!
. Étant donné cet ensemble de méthodes, tout Q::MyQ
peut être utilisé comme une matrice, de préférence dans un contexte multiplicatif : la multiplication via *
avec des scalaires, des vecteurs et des matrices à gauche et à droite, obtenir une représentation matricielle de Q
via Matrix(Q)
(ou Q*I
) et indexer dans la représentation matricielle fonctionnent tous. En revanche, l'addition et la soustraction ainsi que, plus généralement, le broadcasting sur les éléments de la représentation matricielle échouent car cela serait très inefficace. Pour de tels cas d'utilisation, envisagez de calculer la représentation matricielle à l'avance et de la mettre en cache pour une réutilisation future.
Pivoting Strategies
Plusieurs des matrix factorizations prennent en charge pivoting, ce qui peut être utilisé pour améliorer leur stabilité numérique. En fait, certaines factorizations de matrices, telles que la factorisation LU, peuvent échouer sans pivotement.
In pivoting, first, a pivot element with good numerical properties is chosen based on a pivoting strategy. Next, the rows and columns of the original matrix are permuted to bring the chosen element in place for subsequent computation. Furthermore, the process is repeated for each stage of the factorization.
Par conséquent, en plus des facteurs de matrice conventionnels, les sorties des schémas de factorisation pivotés incluent également des matrices de permutation.
Dans ce qui suit, les stratégies de pivotement mises en œuvre en Julia sont brièvement décrites. Notez que toutes les factorizations de matrices ne peuvent pas les prendre en charge. Consultez la documentation du matrix factorization pour plus de détails sur les stratégies de pivotement prises en charge.
Voir aussi LinearAlgebra.ZeroPivotException
.
LinearAlgebra.NoPivot
— TypeNoPivot
Le pivotement n'est pas effectué. Les factorisations de matrices telles que la factorisation LU peuvent échouer sans pivotement et peuvent également être numériquement instables pour les matrices à virgule flottante face à l'erreur d'arrondi. Cette stratégie de pivotement est principalement utile à des fins pédagogiques.
LinearAlgebra.RowNonZero
— TypeRowNonZero
Le premier élément non nul dans les lignes restantes est choisi comme élément pivot.
Attention, pour les matrices à virgule flottante, l'algorithme LU résultant est numériquement instable — cette stratégie est principalement utile pour la comparaison avec des calculs manuels (qui utilisent généralement cette stratégie) ou pour d'autres types algébriques (par exemple, les nombres rationnels) non susceptibles d'erreurs d'arrondi. Sinon, la stratégie de pivotement par défaut RowMaximum
devrait généralement être préférée dans l'élimination de Gauss.
Notez que le type d'élément de la matrice doit admettre une méthode iszero
.
LinearAlgebra.RowMaximum
— TypeRowMaximum
L'élément de plus grande magnitude dans les lignes restantes est choisi comme élément pivot. C'est la stratégie par défaut pour la factorisation LU des matrices à virgule flottante, et est parfois appelée l'algorithme de "pivotage partiel".
Notez que le type d'élément de la matrice doit admettre une méthode abs
, dont le type de résultat doit admettre une méthode <
.
LinearAlgebra.ColumnNorm
— TypeColumnNorm
La colonne avec la norme maximale est utilisée pour les calculs ultérieurs. Cela est utilisé pour la factorisation QR pivotée.
Notez que le type d'élément de la matrice doit admettre les méthodes norm
et abs
, dont les types de résultats respectifs doivent admettre une méthode <
.
Standard functions
Les fonctions d'algèbre linéaire en Julia sont principalement implémentées en appelant des fonctions de LAPACK. Les factorizations de matrices creuses appellent des fonctions de SuiteSparse. D'autres solveurs creux sont disponibles en tant que packages Julia.
Base.:*
— Method*(A::AbstractMatrix, B::AbstractMatrix)
Multiplication de matrices.
Exemples
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
La multiplication en chaîne de 3 ou 4 matrices est effectuée dans la séquence la plus efficace, en fonction des tailles des tableaux. C'est-à-dire que le nombre de multiplications scalaires nécessaires pour (A * B) * C
(avec 3 matrices denses) est comparé à celui pour A * (B * C)
afin de choisir laquelle de ces opérations exécuter.
Si le dernier facteur est un vecteur, ou le premier un vecteur transposé, il est efficace de traiter ces cas en premier. En particulier, x' * B * y
signifie (x' * B) * y
pour une matrice ordinaire en colonne B::Matrix
. Contrairement à dot(x, B, y)
, cela alloue un tableau intermédiaire.
Si le premier ou le dernier facteur est un nombre, cela sera fusionné avec la multiplication matricielle, en utilisant mul!
à 5 arguments.
Ces optimisations nécessitent au moins Julia 1.7.
Base.:\
— Method\(A, B)
Division de matrices utilisant un polyalgorithme. Pour les matrices d'entrée A
et B
, le résultat X
est tel que A*X == B
lorsque A
est carrée. Le solveur utilisé dépend de la structure de A
. Si A
est triangulaire supérieure ou inférieure (ou diagonale), aucune factorisation de A
n'est requise et le système est résolu par substitution avant ou arrière. Pour les matrices carrées non triangulaires, une factorisation LU est utilisée.
Pour A
rectangulaire, le résultat est la solution des moindres carrés à norme minimale calculée par une factorisation QR pivotée de A
et une estimation du rang de A
basée sur le facteur R.
Lorsque A
est sparse, un polyalgorithme similaire est utilisé. Pour les matrices indéfinies, la factorisation LDLt
n'utilise pas de pivotement pendant la factorisation numérique et par conséquent, la procédure peut échouer même pour des matrices inversibles.
Exemples
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
La division à droite des matrices : A / B
est équivalente à (B' \ A')'
où \
est l'opérateur de division à gauche. Pour les matrices carrées, le résultat X
est tel que A == X*B
.
Voir aussi : rdiv!
.
Exemples
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
Exception levée lorsque la matrice d'entrée a une ou plusieurs valeurs propres nulles et n'est pas inversible. Une résolution linéaire impliquant une telle matrice ne peut pas être calculée. Le champ info
indique l'emplacement de (l'une des) valeurs singulières.
LinearAlgebra.PosDefException
— TypePosDefException
Exception levée lorsque la matrice d'entrée n'était pas définie positive. Certaines fonctions d'algèbre linéaire et factorizations ne sont applicables qu'aux matrices définies positives. Le champ info
indique l'emplacement de (l'un des) valeurs propres qui est (sont) inférieure(s) ou égale(s) à 0.
LinearAlgebra.ZeroPivotException
— TypeZeroPivotException <: Exception
Exception levée lorsqu'une factorisation/résolution de matrice rencontre un zéro dans une position de pivot (diagonale) et ne peut pas continuer. Cela ne signifie pas que la matrice est singulière : il peut être utile de passer à une autre factorisation telle que LU avec pivot qui peut réorganiser les variables pour éliminer les pivots nuls spuriques. Le champ info
indique l'emplacement de (l'un des) pivots nuls.
LinearAlgebra.RankDeficientException
— TypeRankDeficientException
Exception levée lorsque la matrice d'entrée est déficiente en rang. Certaines fonctions d'algèbre linéaire, telles que la décomposition de Cholesky, ne s'appliquent qu'aux matrices qui ne sont pas déficientes en rang. Le champ info
indique le rang calculé de la matrice.
LinearAlgebra.LAPACKException
— TypeLAPACKException
Exception générique LAPACK lancée soit lors d'appels directs aux fonctions LAPACK, soit lors d'appels à d'autres fonctions qui utilisent les fonctions LAPACK en interne mais qui manquent de gestion d'erreurs spécialisée. Le champ info
contient des informations supplémentaires sur l'erreur sous-jacente et dépend de la fonction LAPACK qui a été invoquée.
LinearAlgebra.dot
— Functiondot(x, y)
x ⋅ y
Calculez le produit scalaire entre deux vecteurs. Pour les vecteurs complexes, le premier vecteur est conjugué.
dot
fonctionne également sur des objets itérables arbitraires, y compris des tableaux de n'importe quelle dimension, tant que dot
est défini sur les éléments.
dot
est sémantiquement équivalent à sum(dot(vx,vy) for (vx,vy) in zip(x, y))
, avec la restriction supplémentaire que les arguments doivent avoir des longueurs égales.
x ⋅ y
(où ⋅
peut être tapé en complétant par tabulation \cdot
dans le REPL) est un synonyme de dot(x, y)
.
Exemples
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)
Calcule le produit scalaire généralisé dot(x, A*y)
entre deux vecteurs x
et y
, sans stocker le résultat intermédiaire de A*y
. Comme pour la fonction à deux arguments dot(_,_)
, cela agit de manière récursive. De plus, pour les vecteurs complexes, le premier vecteur est conjugué.
La fonction dot
à trois arguments nécessite au moins Julia 1.4.
Exemples
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)
Calculez le produit vectoriel de deux vecteurs à 3 dimensions.
Exemples
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)
Écrase y
avec x * α + y
et retourne y
. Si x
et y
ont les mêmes axes, c'est équivalent à y .+= x .* a
.
Exemples
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)
Écrase y
avec x * α + y * β
et retourne y
. Si x
et y
ont les mêmes axes, c'est équivalent à y .= x .* a .+ y .* β
.
Exemples
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)
Écrase x
avec c*x + s*y
et y
avec -conj(s)*x + c*y
. Renvoie x
et y
.
rotate!
nécessite au moins Julia 1.5.
LinearAlgebra.reflect!
— Functionreflect!(x, y, c, s)
Écrase x
avec c*x + s*y
et y
avec conj(s)*x - c*y
. Renvoie x
et y
.
reflect!
nécessite au moins Julia 1.5.
LinearAlgebra.factorize
— Functionfactoriser(A)
Calcule une factorisation pratique de A
, basée sur le type de la matrice d'entrée. factoriser
vérifie A
pour voir si elle est symétrique/triangulaire/etc. si A
est passée comme une matrice générique. factoriser
vérifie chaque élément de A
pour vérifier/réfuter chaque propriété. Elle s'arrêtera dès qu'elle pourra exclure la symétrie/la structure triangulaire. La valeur de retour peut être réutilisée pour résoudre efficacement plusieurs systèmes. Par exemple : A=factoriser(A); x=A\b; y=A\C
.
Propriétés de A | type de factorisation |
---|---|
Positive définie | Cholesky (voir cholesky ) |
Dense Symétrique/Hermitien | Bunch-Kaufman (voir bunchkaufman ) |
Sparse Symétrique/Hermitien | LDLt (voir ldlt ) |
Triangulaire | Triangulaire |
Diagonale | Diagonale |
Bidiagonale | Bidiagonale |
Tridiagonale | LU (voir lu ) |
Tridiagonale réelle symétrique | LDLt (voir ldlt ) |
Carrée générale | LU (voir lu ) |
Non carrée générale | QR (voir qr ) |
Si factoriser
est appelé sur une matrice hermitienne positive définie, par exemple, alors factoriser
renverra une factorisation de Cholesky.
Exemples
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> factoriser(A) # factoriser vérifiera si A est déjà factorisée
5×5 Bidiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅ ⋅ ⋅
⋅ 1.0 1.0 ⋅ ⋅
⋅ ⋅ 1.0 1.0 ⋅
⋅ ⋅ ⋅ 1.0 1.0
⋅ ⋅ ⋅ ⋅ 1.0
Cela renvoie un 5×5 Bidiagonal{Float64}
, qui peut maintenant être passé à d'autres fonctions d'algèbre linéaire (par exemple, des solveurs d'autovalues) qui utiliseront des méthodes spécialisées pour les types Bidiagonal
.
LinearAlgebra.Diagonal
— TypeDiagonal(V::AbstractVector)
Construit une matrice paresseuse avec V
comme sa diagonale.
Voir aussi UniformScaling
pour la matrice identité paresseuse I
, diagm
pour créer une matrice dense, et diag
pour extraire les éléments diagonaux.
Exemples
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
Une matrice à une colonne n'est pas traitée comme un vecteur, mais appelle plutôt la méthode Diagonal(A::AbstractMatrix)
qui extrait 1
élément diag(A)
:
julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) avec eltype Float64:
7.0
13.0
julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
7.0
Diagonal(A::AbstractMatrix)
Construit une matrice à partir de la diagonale principale de A
. La matrice d'entrée A
peut être rectangulaire, mais la sortie sera carrée.
Exemples
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)
Construit un Diagonal{T}
non initialisé de longueur n
. Voir undef
.
LinearAlgebra.Bidiagonal
— TypeBidiagonal(dv::V, ev::V, uplo::Symbol) where V <: AbstractVector
Construit une matrice bidiagonale supérieure (uplo=:U
) ou inférieure (uplo=:L
) en utilisant les vecteurs diagonaux (dv
) et hors-diagonaux (ev
) donnés. Le résultat est de type Bidiagonal
et fournit des solveurs linéaires spécialisés efficaces, mais peut être converti en une matrice régulière avec convert(Array, _)
(ou Array(_)
pour faire court). La longueur de ev
doit être inférieure d'un à la longueur de dv
.
Exemples
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 est sur la première superdiagonale
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev est sur la première sous-diagonale
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
7 2 ⋅ ⋅
⋅ 8 3 ⋅
⋅ ⋅ 9 4
Bidiagonal(A, uplo::Symbol)
Construit une matrice Bidiagonal
à partir de la diagonale principale de A
et de sa première super-diagonale (si uplo=:U
) ou sous-diagonale (si uplo=:L
).
Exemples
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) # contient la diagonale principale et la première superdiagonale de A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # contient la diagonale principale et la première sous-diagonale de A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonal
— TypeSymTridiagonal(dv::V, ev::V) où V <: AbstractVector
Construit une matrice tridiagonale symétrique à partir de la diagonale (dv
) et de la première sous/super-diagonale (ev
), respectivement. Le résultat est de type SymTridiagonal
et fournit des solveurs propres spécialisés efficaces, mais peut être converti en une matrice régulière avec convert(Array, _)
(ou Array(_)
pour faire court).
Pour les matrices de blocs SymTridiagonal
, les éléments de dv
sont symétrisés. L'argument ev
est interprété comme la superdiagonale. Les blocs de la sous-diagonale sont (matérialisés) transposés des blocs de la superdiagonale correspondante.
Exemples
julia> dv = [1, 2, 3, 4]
4-élément Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-élément 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)
Construit une matrice tridiagonale symétrique à partir de la diagonale et de la première superdiagonale de la matrice symétrique A
.
Exemples
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) où V <: AbstractVector
Construit une matrice tridiagonale à partir de la première sous-diagonale, de la diagonale et de la première super-diagonale, respectivement. Le résultat est de type Tridiagonal
et fournit des solveurs linéaires spécialisés efficaces, mais peut être converti en une matrice régulière avec convert(Array, _)
(ou Array(_)
pour faire court). Les longueurs de dl
et du
doivent être inférieures d'une unité à la longueur de d
.
La sous-diagonale dl
et la super-diagonale du
ne doivent pas être aliasées l'une à l'autre. Si un aliasing est détecté, le constructeur utilisera une copie de du
comme argument.
Exemples
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)
Construit une matrice tridiagonale à partir de la première sous-diagonale, de la diagonale et de la première super-diagonale de la matrice A
.
Exemples
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)
Construit une vue Symmetric
du triangle supérieur (si uplo = :U
) ou inférieur (si uplo = :L
) de la matrice A
.
Les vues Symmetric
sont principalement utiles pour les matrices réelles symétriques, pour lesquelles des algorithmes spécialisés (par exemple pour les problèmes propres) sont activés pour les types Symmetric
. Plus généralement, voir aussi Hermitian(A)
pour les matrices hermitiennes A == A'
, qui est effectivement équivalent à Symmetric
pour les matrices réelles mais est également utile pour les matrices complexes. (Alors que les matrices Symmetric
complexes sont prises en charge mais ont peu, voire aucun, algorithme spécialisé.)
Pour calculer la partie symétrique d'une matrice réelle, ou plus généralement la partie hermitienne (A + A') / 2
d'une matrice réelle ou complexe A
, utilisez hermitianpart
.
Exemples
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
Notez que Supper
ne sera pas égal à Slower
à moins que A
ne soit elle-même symétrique (par exemple si A == transpose(A)
).
LinearAlgebra.Hermitian
— TypeHermitian(A::AbstractMatrix, uplo::Symbol=:U)
Construit une vue Hermitian
du triangle supérieur (si uplo = :U
) ou inférieur (si uplo = :L
) de la matrice A
.
Pour calculer la partie hermitienne de A
, utilisez hermitianpart
.
Exemples
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
Notez que Hupper
ne sera pas égal à Hlower
à moins que A
ne soit lui-même hermitien (par exemple, si A == adjoint(A)
).
Toutes les parties non réelles de la diagonale seront ignorées.
Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular
— TypeLowerTriangular(A::AbstractMatrix)
Construit une vue LowerTriangular
de la matrice A
.
Exemples
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)
Construit une vue UpperTriangular
de la matrice A
.
Exemples
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)
Construit une vue UnitLowerTriangular
de la matrice A
. Une telle vue a le oneunit
du eltype
de A
sur sa diagonale.
Exemples
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)
Construit une vue UnitUpperTriangular
de la matrice A
. Une telle vue a le oneunit
du eltype
de A
sur sa diagonale.
Exemples
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)
Construit une vue UpperHessenberg
de la matrice A
. Les entrées de A
en dessous de la première sous-diagonale sont ignorées.
Ce type a été ajouté dans Julia 1.3.
Des algorithmes efficaces sont implémentés pour H \ b
, det(H)
, et similaires.
Voir aussi la fonction hessenberg
pour factoriser n'importe quelle matrice en une matrice supérieure de Hessenberg similaire.
Si F::Hessenberg
est l'objet de factorisation, la matrice unitaire peut être accédée avec F.Q
et la matrice de Hessenberg avec F.H
. Lorsque Q
est extrait, le type résultant est l'objet HessenbergQ
, et peut être converti en une matrice régulière avec convert(Array, _)
(ou Array(_)
pour faire court).
L'itération de la décomposition produit les facteurs F.Q
et F.H
.
Exemples
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}
Opérateur de mise à l'échelle uniforme de taille générique défini comme un scalaire multiplié par l'opérateur d'identité, λ*I
. Bien qu'il n'ait pas de size
explicite, il agit de manière similaire à une matrice dans de nombreux cas et inclut le support pour certains indexages. Voir aussi I
.
L'indexation utilisant des plages est disponible depuis Julia 1.6.
Exemples
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
Un objet de type UniformScaling
, représentant une matrice identité de n'importe quelle taille.
Exemples
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)
Construit une matrice Diagonal
à partir d'un UniformScaling
.
Cette méthode est disponible depuis Julia 1.2.
Exemples
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
Type abstrait pour factorisations de matrices c'est-à-dire décompositions de matrices. Voir documentation en ligne pour une liste des factorisations de matrices disponibles.
LinearAlgebra.LU
— TypeLU <: Factorization
Type de factorisation matricielle de la factorisation LU
d'une matrice carrée A
. C'est le type de retour de lu
, la fonction de factorisation matricielle correspondante.
Les composants individuels de la factorisation F::LU
peuvent être accédés via getproperty
:
Composant | Description |
---|---|
F.L | partie L (triangulaire inférieure unitaire) de LU |
F.U | partie U (triangulaire supérieure) de LU |
F.p | permutation Vector (droite) |
F.P | permutation Matrix (droite) |
L'itération sur la factorisation produit les composants F.L
, F.U
et F.p
.
Exemples
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 facteur:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U facteur:
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); # déstructuration via itération
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
Calculez la factorisation LU d'une matrice creuse A
.
Pour une matrice creuse A
avec un type d'élément réel ou complexe, le type de retour de F
est UmfpackLU{Tv, Ti}
, avec Tv
= Float64
ou ComplexF64
respectivement et Ti
est un type entier (Int32
ou Int64
).
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Le permutation q
peut être soit un vecteur de permutation soit nothing
. Si aucun vecteur de permutation n'est fourni ou si q
est nothing
, le défaut d'UMFPACK est utilisé. Si la permutation n'est pas basée sur zéro, une copie basée sur zéro est faite.
Le vecteur control
par défaut correspond à la configuration par défaut du package Julia SparseArrays pour UMFPACK (NB : cela est modifié par rapport aux défauts d'UMFPACK pour désactiver le raffinement itératif), mais peut être changé en passant un vecteur de longueur UMFPACK_CONTROL
, voir le manuel d'UMFPACK pour les configurations possibles. Par exemple, pour réactiver le raffinement itératif :
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # lire la configuration par défaut de Julia pour une matrice creuse Float64
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # optionnel - afficher les valeurs
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # réactiver le raffinement itératif (2 est le maximum par défaut d'UMFPACK)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # résoudre Ax = b, y compris le raffinement itératif d'UMFPACK
Les composants individuels de la factorisation F
peuvent être accessibles par indexation :
Composant | Description |
---|---|
L | partie L (triangulaire inférieure) de LU |
U | partie U (triangulaire supérieure) de LU |
p | permutation à droite Vector |
q | permutation à gauche Vector |
Rs | Vector de facteurs d'échelle |
: | composants (L,U,p,q,Rs) |
La relation entre F
et A
est
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
prend également en charge les fonctions suivantes :
Voir aussi lu!
lu(A::AbstractSparseMatrixCSC)
utilise la bibliothèque UMFPACK[ACM832] qui fait partie de SuiteSparse. Comme cette bibliothèque ne prend en charge que les matrices creuses avec des éléments Float64
ou ComplexF64
, lu
convertit A
en une copie de type SparseMatrixCSC{Float64}
ou SparseMatrixCSC{ComplexF64}
selon le cas.
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
Calculez la factorisation LU de A
.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Par défaut, avec check = true
, une erreur est également levée lorsque la décomposition produit des facteurs valides, mais que le facteur triangulaire supérieur U
est de rang déficient. Cela peut être modifié en passant allowsingular = true
.
Dans la plupart des cas, si A
est un sous-type S
de AbstractMatrix{T}
avec un type d'élément T
supportant +
, -
, *
et /
, le type de retour est LU{T,S{T}}
.
En général, la factorisation LU implique une permutation des lignes de la matrice (correspondant à la sortie F.p
décrite ci-dessous), connue sous le nom de "pivotement" (car elle correspond à choisir quelle ligne contient le "pivot", l'entrée diagonale de F.U
). L'une des stratégies de pivotement suivantes peut être sélectionnée via l'argument optionnel pivot
:
RowMaximum()
(par défaut) : la stratégie de pivotement standard ; le pivot correspond à l'élément de valeur absolue maximale parmi les lignes restantes à factoriser. Cette stratégie de pivotement nécessite que le type d'élément supporte égalementabs
et<
. (C'est généralement la seule option numériquement stable pour les matrices à virgule flottante.)RowNonZero()
: le pivot correspond au premier élément non nul parmi les lignes restantes à factoriser. (Cela correspond au choix typique dans les calculs manuels, et est également utile pour des types de nombres algébriques plus généraux qui supportentiszero
mais pasabs
ou<
.)NoPivot()
: pivotement désactivé (échouera si une entrée nulle est rencontrée dans une position de pivot, même lorsqueallowsingular = true
).
Les composants individuels de la factorisation F
peuvent être accessibles via getproperty
:
Composant | Description |
---|---|
F.L | L (partie triangulaire inférieure) de LU |
F.U | U (partie triangulaire supérieure) de LU |
F.p | permutation Vector (droite) |
F.P | permutation Matrix (droite) |
L'itération de la factorisation produit les composants F.L
, F.U
et F.p
.
La relation entre F
et A
est
F.L*F.U == A[F.p, :]
F
prend également en charge les fonctions suivantes :
Fonction prise en charge | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
L'argument clé allowsingular
a été ajouté dans Julia 1.11.
Exemples
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
Facteur L :
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
Facteur U :
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); # déstructuration via itération
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}}
Facteur L :
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
Facteur U (déficient en rang) :
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
Calcule la factorisation LU d'une matrice creuse A
, réutilisant la factorisation symbolique d'une factorisation LU déjà existante stockée dans F
. À moins que reuse_symbolic
ne soit défini sur false, la matrice creuse A
doit avoir un motif de non-zéros identique à la matrice utilisée pour créer la factorisation LU F
, sinon une erreur est levée. Si la taille de A
et F
diffère, tous les vecteurs seront redimensionnés en conséquence.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
La permutation q
peut être soit un vecteur de permutation, soit nothing
. Si aucun vecteur de permutation n'est fourni ou si q
est nothing
, le défaut d'UMFPACK est utilisé. Si la permutation n'est pas basée sur zéro, une copie basée sur zéro est faite.
Voir aussi lu
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
utilise la bibliothèque UMFPACK qui fait partie de SuiteSparse. Comme cette bibliothèque ne prend en charge que les matrices creuses avec des éléments Float64
ou ComplexF64
, lu!
convertira automatiquement les types en ceux définis par la factorisation LU ou SparseMatrixCSC{ComplexF64}
selon le cas.
lu!
pour UmfpackLU
nécessite au moins Julia 1.5.
Exemples
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!
est identique à lu
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Une exception InexactError
est levée si la factorisation produit un nombre non représentable par le type d'élément de A
, par exemple pour les types entiers.
L'argument clé allowsingular
a été ajouté dans Julia 1.11.
Exemples
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}}
Facteur L :
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
Facteur 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)
ERREUR: InexactError: Int64(0.6666666666666666)
Trace de la pile :
[...]
LinearAlgebra.Cholesky
— TypeCholesky <: Factorisation
Type de factorisation matricielle de la factorisation de Cholesky d'une matrice dense symétrique/Hermite positive définie A
. C'est le type de retour de cholesky
, la fonction de factorisation matricielle correspondante.
Le facteur triangulaire de Cholesky peut être obtenu à partir de la factorisation F::Cholesky
via F.L
et F.U
, où A ≈ F.U' * F.U ≈ F.L * F.L'
.
Les fonctions suivantes sont disponibles pour les objets Cholesky
: size
, \
, inv
, det
, logdet
et isposdef
.
L'itération de la décomposition produit les composants L
et U
.
Exemples
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; # destructuration via itération
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted
— TypeCholeskyPivoted
Type de factorisation matricielle de la factorisation de Cholesky pivotée d'une matrice dense symétrique/Hermétique positive semi-définie A
. C'est le type de retour de cholesky(_, ::RowMaximum)
, la fonction de factorisation matricielle correspondante.
Le facteur triangulaire de Cholesky peut être obtenu à partir de la factorisation F::CholeskyPivoted
via F.L
et F.U
, et la permutation via F.p
, où A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
avec Ur = F.U[1:F.rank, :]
et Lr = F.L[:, 1:F.rank]
, ou alternativement A ≈ Up' * Up ≈ Lp * Lp'
avec Up = F.U[1:F.rank, invperm(F.p)]
et Lp = F.L[invperm(F.p), 1:F.rank]
.
Les fonctions suivantes sont disponibles pour les objets CholeskyPivoted
: size
, \
, inv
, det
, et rank
.
L'itération de la décomposition produit les composants L
et U
.
Exemples
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 facteur avec rang 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; # déstructuration via itération
julia> l == C.L && u == C.U
true
LinearAlgebra.cholesky
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
Calculez la factorisation de Cholesky d'une matrice dense symétrique définie positive A
et renvoyez une Cholesky
factorisation. La matrice A
peut être soit une Symmetric
ou Hermitian
AbstractMatrix
ou une AbstractMatrix
parfaitement symétrique ou hermitienne.
Le facteur triangulaire de Cholesky peut être obtenu à partir de la factorisation F
via F.L
et F.U
, où A ≈ F.U' * F.U ≈ F.L * F.L'
.
Les fonctions suivantes sont disponibles pour les objets Cholesky
: size
, \
, inv
, det
, logdet
et isposdef
.
Si vous avez une matrice A
qui est légèrement non hermitienne en raison d'erreurs d'arrondi dans sa construction, enveloppez-la dans Hermitian(A)
avant de la passer à cholesky
afin de la traiter comme parfaitement hermitienne.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Exemples
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
Calcule la factorisation de Cholesky pivotée d'une matrice dense symétrique semi-définit positive A
et renvoie une factorisation CholeskyPivoted
. La matrice A
peut être soit une Symmetric
soit une Hermitian
AbstractMatrix
ou une AbstractMatrix
parfaitement symétrique ou hermitienne.
Le facteur triangulaire de Cholesky peut être obtenu à partir de la factorisation F
via F.L
et F.U
, et la permutation via F.p
, où A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
avec Ur = F.U[1:F.rank, :]
et Lr = F.L[:, 1:F.rank]
, ou alternativement A ≈ Up' * Up ≈ Lp * Lp'
avec Up = F.U[1:F.rank, invperm(F.p)]
et Lp = F.L[invperm(F.p), 1:F.rank]
.
Les fonctions suivantes sont disponibles pour les objets CholeskyPivoted
: size
, \
, inv
, det
, et rank
.
L'argument tol
détermine la tolérance pour déterminer le rang. Pour les valeurs négatives, la tolérance est la précision machine.
Si vous avez une matrice A
qui est légèrement non hermitienne en raison d'erreurs d'arrondi dans sa construction, enveloppez-la dans Hermitian(A)
avant de la passer à cholesky
afin de la traiter comme parfaitement hermitienne.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Exemples
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 facteur avec rang 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; # déstructuration via itération
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
Calcule la factorisation de Cholesky d'une matrice creuse définie positive A
. A
doit être une SparseMatrixCSC
ou une vue Symmetric
/Hermitian
d'une SparseMatrixCSC
. Notez que même si A
n'a pas l'étiquette de type, elle doit toujours être symétrique ou hermitienne. Si perm
n'est pas donné, une permutation réduisant le remplissage est utilisée. F = cholesky(A)
est le plus souvent utilisé pour résoudre des systèmes d'équations avec F\b
, mais les méthodes diag
, det
et logdet
sont également définies pour F
. Vous pouvez également extraire des facteurs individuels de F
, en utilisant F.L
. Cependant, comme le pivotement est activé par défaut, la factorisation est représentée en interne comme A == P'*L*L'*P
avec une matrice de permutation P
; utiliser simplement L
sans tenir compte de P
donnera des réponses incorrectes. Pour inclure les effets de la permutation, il est généralement préférable d'extraire des facteurs "combinés" comme PtL = F.PtL
(l'équivalent de P'*L
) et LtP = F.UP
(l'équivalent de L'*P
).
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Définir l'argument clé optionnel shift
calcule la factorisation de A+shift*I
au lieu de A
. Si l'argument perm
est fourni, il doit être une permutation de 1:size(A,1)
donnant l'ordre à utiliser (au lieu de l'ordre AMD par défaut de CHOLMOD).
Exemples
Dans l'exemple suivant, la permutation réduisant le remplissage utilisée est [3, 2, 1]
. Si perm
est défini sur 1:3
pour imposer aucune permutation, le nombre d'éléments non nuls dans le facteur est de 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} avec 3 entrées stockées:
⋅ ⋅ 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
Cette méthode utilise la bibliothèque CHOLMOD[ACM887][DavisHager2009] de SuiteSparse. CHOLMOD ne prend en charge que les types réels ou complexes en simple ou double précision. Les matrices d'entrée qui ne sont pas de ces types d'éléments seront converties en ces types si nécessaire.
De nombreuses autres fonctions de CHOLMOD sont enveloppées mais non exportées du module Base.SparseArrays.CHOLMOD
.
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
Le même que cholesky
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Une exception InexactError
est levée si la factorisation produit un nombre non représentable par le type d'élément de A
, par exemple pour les types entiers.
Exemples
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
Le même que cholesky
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Une exception InexactError
est levée si la factorisation produit un nombre non représentable par le type d'élément de A
, par exemple pour les types entiers.
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
Calcule la factorisation de Cholesky ($LL'$) de A
, en réutilisant la factorisation symbolique F
. A
doit être une SparseMatrixCSC
ou une vue Symmetric
/ Hermitian
d'une SparseMatrixCSC
. Notez que même si A
n'a pas l'étiquette de type, elle doit toujours être symétrique ou hermétique.
Voir aussi cholesky
.
Cette méthode utilise la bibliothèque CHOLMOD de SuiteSparse, qui ne prend en charge que les types réels ou complexes en précision simple ou double. Les matrices d'entrée qui ne sont pas de ces types d'éléments seront converties en ces types si nécessaire.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Met à jour une factorisation de Cholesky C
avec le vecteur v
. Si A = C.U'C.U
alors CC = cholesky(C.U'C.U + v*v')
mais le calcul de CC
n'utilise que O(n^2)
opérations.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Obtenez une factorisation LDLt
de A + C*C'
donnée une factorisation LDLt
ou LLt
F
de A
.
Le facteur retourné est toujours une factorisation LDLt
.
Voir aussi lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Met à jour une factorisation de Cholesky C
avec le vecteur v
. Si A = C.U'C.U
alors CC = cholesky(C.U'C.U - v*v')
mais le calcul de CC
n'utilise que O(n^2)
opérations.
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Obtenez une factorisation LDLt
de A + C*C'
donnée une factorisation LDLt
ou LLt
F
de A
.
Le facteur retourné est toujours une factorisation LDLt
.
Voir aussi lowrankdowndate!
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Met à jour une factorisation de Cholesky C
avec le vecteur v
. Si A = C.U'C.U
alors CC = cholesky(C.U'C.U + v*v')
mais le calcul de CC
n'utilise que O(n^2)
opérations. La factorisation d'entrée C
est mise à jour sur place de sorte qu'à la sortie C == CC
. Le vecteur v
est détruit pendant le calcul.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
Met à jour une factorisation LDLt
ou LLt
F
de A
à une factorisation de A + C*C'
.
Les factorizations LLt
sont converties en LDLt
.
Voir aussi lowrankupdate
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Met à jour une factorisation de Cholesky C
avec le vecteur v
. Si A = C.U'C.U
alors CC = cholesky(C.U'C.U - v*v')
mais le calcul de CC
n'utilise que O(n^2)
opérations. La factorisation d'entrée C
est mise à jour sur place de sorte qu'à la sortie C == CC
. Le vecteur v
est détruit pendant le calcul.
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
Met à jour une factorisation LDLt
ou LLt
F
de A
à une factorisation de A - C*C'
.
Les factorizations LLt
sont converties en LDLt
.
Voir aussi lowrankdowndate
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.LDLt
— TypeLDLt <: Factorisation
Type de factorisation matricielle de la factorisation LDLt
d'une matrice réelle SymTridiagonal
S
telle que S = L*Diagonal(d)*L'
, où L
est une matrice UnitLowerTriangular
et d
est un vecteur. L'utilisation principale d'une factorisation LDLt
F = ldlt(S)
est de résoudre le système d'équations linéaires Sx = b
avec F\b
. C'est le type de retour de ldlt
, la fonction de factorisation matricielle correspondante.
Les composants individuels de la factorisation F::LDLt
peuvent être accédés via getproperty
:
Composant | Description |
---|---|
F.L | L (partie triangulaire inférieure unitaire) de LDLt |
F.D | D (partie diagonale) de LDLt |
F.Lt | Lt (partie triangulaire supérieure unitaire) de LDLt |
F.d | valeurs diagonales de D sous forme de Vector |
Exemples
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}}}
Facteur L :
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
Facteur D :
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldlt
— Functionldlt(S::SymTridiagonal) -> LDLt
Calcule une factorisation LDLt
(c'est-à-dire, $LDL^T$) de la matrice tridiagonale symétrique réelle S
telle que S = L*Diagonal(d)*L'
où L
est une matrice triangulaire inférieure unitaire et d
est un vecteur. L'utilisation principale d'une factorisation LDLt
F = ldlt(S)
est de résoudre le système d'équations linéaires Sx = b
avec F\b
.
Voir aussi bunchkaufman
pour une factorisation similaire, mais pivotée, de matrices symétriques ou hermitiennes arbitraires.
Exemples
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
Calcule la factorisation $LDL'$ d'une matrice creuse A
. A
doit être une SparseMatrixCSC
ou une vue Symmetric
/Hermitian
d'une SparseMatrixCSC
. Notez que même si A
n'a pas l'étiquette de type, elle doit toujours être symétrique ou hermitienne. Une permutation réduisant le remplissage est utilisée. F = ldlt(A)
est le plus souvent utilisé pour résoudre des systèmes d'équations A*x = b
avec F\b
. L'objet de factorisation retourné F
prend également en charge les méthodes diag
, det
, logdet
et inv
. Vous pouvez extraire des facteurs individuels de F
en utilisant F.L
. Cependant, comme le pivotement est activé par défaut, la factorisation est représentée en interne comme A == P'*L*D*L'*P
avec une matrice de permutation P
; utiliser simplement L
sans tenir compte de P
donnera des réponses incorrectes. Pour inclure les effets de la permutation, il est généralement préférable d'extraire des facteurs "combinés" comme PtL = F.PtL
(l'équivalent de P'*L
) et LtP = F.UP
(l'équivalent de L'*P
). La liste complète des facteurs pris en charge est :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Le paramètre optionnel shift
calcule la factorisation de A+shift*I
au lieu de A
. Si l'argument perm
est fourni, il doit être une permutation de 1:size(A,1)
donnant l'ordre à utiliser (au lieu de l'ordre AMD par défaut de CHOLMOD).
Cette méthode utilise la bibliothèque CHOLMOD[ACM887][DavisHager2009] de SuiteSparse. CHOLMOD ne prend en charge que les types réels ou complexes en simple ou double précision. Les matrices d'entrée qui ne sont pas de ces types d'éléments seront converties en ces types si nécessaire.
De nombreuses autres fonctions de CHOLMOD sont enveloppées mais ne sont pas exportées du module Base.SparseArrays.CHOLMOD
.
LinearAlgebra.ldlt!
— Functionldlt!(S::SymTridiagonal) -> LDLt
Identique à ldlt
, mais économise de l'espace en écrasant l'entrée S
, au lieu de créer une copie.
Exemples
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
Calcule la factorisation $LDL'$ de A
, en réutilisant la factorisation symbolique F
. A
doit être un SparseMatrixCSC
ou une vue Symmetric
/Hermitian
d'un SparseMatrixCSC
. Notez que même si A
n'a pas l'étiquette de type, elle doit toujours être symétrique ou hermitienne.
Voir aussi ldlt
.
Cette méthode utilise la bibliothèque CHOLMOD de SuiteSparse, qui ne prend en charge que les types réels ou complexes en précision simple ou double. Les matrices d'entrée qui ne sont pas de ces types d'éléments seront converties en ces types si nécessaire.
LinearAlgebra.QR
— TypeQR <: Factorization
Une factorisation matricielle QR stockée dans un format compact, généralement obtenue à partir de qr
. Si $A$ est une matrice m
×n
, alors
\[A = Q R\]
où $Q$ est une matrice orthogonale/unitaire et $R$ est triangulaire supérieure. La matrice $Q$ est stockée sous la forme d'une séquence de réflecteurs de Householder $v_i$ et de coefficients $\tau_i$ où :
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
L'itération de la décomposition produit les composants Q
et R
.
L'objet a deux champs :
factors
est une matricem
×n
.- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
R = triu(F.factors)
pour un objetQR
F
. - La partie subdiagonale contient les réflecteurs $v_i$ stockés dans un format compact où $v_i$ est la $i$-ème colonne de la matrice
V = I + tril(F.factors, -1)
.
- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
τ
est un vecteur de longueurmin(m,n)
contenant les coefficients $au_i$.
LinearAlgebra.QRCompactWY
— TypeQRCompactWY <: Factorization
Une factorisation matricielle QR stockée dans un format compact bloqué, généralement obtenue à partir de qr
. Si $A$ est une matrice m
×n
, alors
\[A = Q R\]
où $Q$ est une matrice orthogonale/unitaire et $R$ est triangulaire supérieure. C'est similaire au format QR
sauf que la matrice orthogonale/unitaire $Q$ est stockée au format Compact WY [Schreiber1989]. Pour la taille de bloc $n_b$, elle est stockée sous la forme d'une matrice trapézoïdale inférieure m
×n
$V$ et d'une matrice $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$ composée de $b = \lceil \min(m,n) / n_b \rceil$ matrices triangulaires supérieures $T_j$ de taille $n_b$×$n_b$ ($j = 1, ..., b-1$) et d'une matrice trapézoïdale supérieure $n_b$×$\min(m,n) - (b-1) n_b$ $T_b'$ ($j=b$) dont la partie carrée supérieure est notée avec $T_b$ satisfaisant
\[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)\]
tel que $v_i$ est la $i$-ème colonne de $V$, $\tau_i$ est le $i$-ème élément de [diag(T_1); diag(T_2); …; diag(T_b)]
, et $(V_1 \; V_2 \; ... \; V_b)$ est le bloc gauche m
×min(m, n)
de $V$. Lorsqu'il est construit à l'aide de qr
, la taille de bloc est donnée par $n_b = \min(m, n, 36)$.
L'itération de la décomposition produit les composants Q
et R
.
L'objet a deux champs :
factors
, comme dans le typeQR
, est une matricem
×n
.- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
R = triu(F.factors)
pour un objetQR
F
. - La partie subdiagonale contient les réflecteurs $v_i$ stockés dans un format compact tel que
V = I + tril(F.factors, -1)
.
- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
T
est une matrice $n_b$-par-$\min(m,n)$ comme décrit ci-dessus. Les éléments subdiagonaux pour chaque matrice triangulaire $T_j$ sont ignorés.
Ce format ne doit pas être confondu avec l'ancienne représentation WY [Bischof1987].
LinearAlgebra.QRPivoted
— TypeQRPivoted <: Factorization
Une factorisation matricielle QR avec pivotement de colonnes dans un format compact, généralement obtenue à partir de qr
. Si $A$ est une matrice m
×n
, alors
\[A P = Q R\]
où $P$ est une matrice de permutation, $Q$ est une matrice orthogonale/unitaire et $R$ est triangulaire supérieure. La matrice $Q$ est stockée sous forme d'une séquence de réflecteurs de Householder :
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
L'itération de la décomposition produit les composants Q
, R
et p
.
L'objet a trois champs :
factors
est une matricem
×n
.- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
R = triu(F.factors)
pour un objetQR
F
. - La partie sous-diagonale contient les réflecteurs $v_i$ stockés dans un format compact où $v_i$ est la $i$-ème colonne de la matrice
V = I + tril(F.factors, -1)
.
- La partie triangulaire supérieure contient les éléments de $R$, c'est-à-dire
τ
est un vecteur de longueurmin(m,n)
contenant les coefficients $au_i$.jpvt
est un vecteur entier de longueurn
correspondant à la permutation $P$.
LinearAlgebra.qr
— Functionqr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse
Calcule la factorisation QR
d'une matrice creuse A
. Des permutations de lignes et de colonnes réduisant le remplissage sont utilisées de sorte que F.R = F.Q'*A[F.prow,F.pcol]
. L'application principale de ce type est de résoudre des problèmes de moindres carrés ou sous-déterminés avec \
. La fonction appelle la bibliothèque C SPQR[ACM933].
qr(A::SparseMatrixCSC)
utilise la bibliothèque SPQR qui fait partie de SuiteSparse. Comme cette bibliothèque ne prend en charge que les matrices creuses avec des éléments de type Float64
ou ComplexF64
, à partir de Julia v1.4, qr
convertit A
en une copie de type SparseMatrixCSC{Float64}
ou SparseMatrixCSC{ComplexF64}
selon le cas.
Exemples
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} avec 4 entrées stockées :
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Facteur Q :
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
Facteur R :
2×2 SparseMatrixCSC{Float64, Int64} avec 2 entrées stockées :
-1.41421 ⋅
⋅ -1.41421
Permutation de lignes :
Vecteur de 4 éléments Int64 :
1
3
4
2
Permutation de colonnes :
Vecteur de 2 éléments Int64 :
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
Calcule la factorisation QR de la matrice A
: une matrice orthogonale (ou unitaire si A
est à valeurs complexes) Q
, et une matrice triangulaire supérieure R
telle que
\[A = Q R\]
L'objet retourné F
stocke la factorisation dans un format compact :
- si
pivot == ColumnNorm()
alorsF
est un objetQRPivoted
, - sinon, si le type d'élément de
A
est un type BLAS (Float32
,Float64
,ComplexF32
ouComplexF64
), alorsF
est un objetQRCompactWY
, - sinon
F
est un objetQR
.
Les composants individuels de la décomposition F
peuvent être récupérés via des accesseurs de propriété :
F.Q
: la matrice orthogonale/unitaireQ
F.R
: la matrice triangulaire supérieureR
F.p
: le vecteur de permutation du pivot (QRPivoted
uniquement)F.P
: la matrice de permutation du pivot (QRPivoted
uniquement)
Chaque référence au facteur triangulaire supérieur via F.R
alloue un nouveau tableau. Il est donc conseillé de mettre en cache ce tableau, par exemple, en R = F.R
et de continuer à travailler avec R
.
L'itération de la décomposition produit les composants Q
, R
, et si présent p
.
Les fonctions suivantes sont disponibles pour les objets QR
: inv
, size
, et \
. Lorsque A
est rectangulaire, \
renverra une solution des moindres carrés et si la solution n'est pas unique, celle avec la plus petite norme est retournée. Lorsque A
n'est pas de rang complet, une factorisation avec (colonne) pivot est requise pour obtenir une solution de norme minimale.
La multiplication par rapport à Q
complet/carré ou non complet/carré est autorisée, c'est-à-dire que F.Q*F.R
et F.Q*A
sont pris en charge. Une matrice Q
peut être convertie en une matrice régulière avec Matrix
. Cette opération renvoie le facteur Q "mince", c'est-à-dire que si A
est m
×n
avec m>=n
, alors Matrix(F.Q)
produit une matrice m
×n
avec des colonnes orthonormales. Pour récupérer le facteur Q "complet", une matrice orthogonale m
×m
, utilisez F.Q*I
ou collect(F.Q)
. Si m<=n
, alors Matrix(F.Q)
produit une matrice orthogonale m
×m
.
La taille de bloc pour la décomposition QR peut être spécifiée par l'argument clé blocksize :: Integer
lorsque pivot == NoPivot()
et A isa StridedMatrix{<:BlasFloat}
. Elle est ignorée lorsque blocksize > minimum(size(A))
. Voir QRCompactWY
.
L'argument clé blocksize
nécessite Julia 1.4 ou une version ultérieure.
Exemples
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}}
Facteur Q : 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
Facteur R :
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
renvoie plusieurs types car LAPACK utilise plusieurs représentations qui minimisent les besoins de stockage mémoire des produits de réflecteurs élémentaires de Householder, de sorte que les matrices Q
et R
peuvent être stockées de manière compacte plutôt que comme deux matrices denses séparées.
LinearAlgebra.qr!
— Functionqr!(A, pivot = NoPivot(); blocksize)
qr!
est identique à qr
lorsque A
est un sous-type de AbstractMatrix
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Une exception InexactError
est levée si la factorisation produit un nombre non représentable par le type d'élément de A
, par exemple pour les types entiers.
L'argument clé blocksize
nécessite Julia 1.4 ou une version ultérieure.
Exemples
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}}
Facteur Q : 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
Facteur 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)
ERREUR : InexactError: Int64(3.1622776601683795)
Trace de la pile :
[...]
LinearAlgebra.LQ
— TypeLQ <: Factorization
Type de factorisation matricielle de la factorisation LQ
d'une matrice A
. La décomposition LQ
est la décomposition QR
de transpose(A)
. C'est le type de retour de lq
, la fonction de factorisation matricielle correspondante.
Si S::LQ
est l'objet de factorisation, le composant triangulaire inférieur peut être obtenu via S.L
, et le composant orthogonal/unitaire via S.Q
, tel que A ≈ S.L*S.Q
.
L'itération de la décomposition produit les composants S.L
et S.Q
.
Exemples
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 facteur:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q facteur: 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; # déstructuration via itération
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq
— Functionlq(A) -> S::LQ
Calculez la décomposition LQ de A
. Le composant triangulaire inférieur de la décomposition peut être obtenu à partir de l'objet LQ
S
via S.L
, et le composant orthogonal/unitaire via S.Q
, de sorte que A ≈ S.L*S.Q
.
L'itération de la décomposition produit les composants S.L
et S.Q
.
La décomposition LQ est la décomposition QR de transpose(A)
, et elle est utile pour calculer la solution à norme minimale lq(A) \ b
à un système d'équations sous-déterminé (A
a plus de colonnes que de lignes, mais a un rang de ligne complet).
Exemples
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 facteur :
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q facteur : 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; # déstructuration via itération
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!
— Functionlq!(A) -> LQ
Calculez la factorisation LQ
de A
, en utilisant la matrice d'entrée comme espace de travail. Voir aussi lq
.
LinearAlgebra.BunchKaufman
— TypeBunchKaufman <: Factorization
Type de factorisation matricielle de la factorisation de Bunch-Kaufman d'une matrice symétrique ou hermitienne A
sous la forme P'UDU'P
ou P'LDL'P
, selon que le triangle supérieur (par défaut) ou le triangle inférieur est stocké dans A
. Si A
est symétrique complexe, alors U'
et L'
désignent les transposées non conjuguées, c'est-à-dire transpose(U)
et transpose(L)
, respectivement. C'est le type de retour de bunchkaufman
, la fonction de factorisation matricielle correspondante.
Si S::BunchKaufman
est l'objet de factorisation, les composants peuvent être obtenus via S.D
, S.U
ou S.L
selon ce qui est approprié étant donné S.uplo
, et S.p
.
L'itération de la décomposition produit les composants S.D
, S.U
ou S.L
selon ce qui est approprié étant donné S.uplo
, et S.p
.
Exemples
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A est enveloppé en interne par Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D facteur:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U facteur:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # déstructuration via itération
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D facteur:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L facteur:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation:
2-element Vector{Int64}:
2
1
LinearAlgebra.bunchkaufman
— Functionbunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman
Calculez la factorisation de Bunch-Kaufman [Bunch1977] d'une matrice symétrique ou hermitienne A
sous la forme P'*U*D*U'*P
ou P'*L*D*L'*P
, selon le triangle qui est stocké dans A
, et renvoyez un objet BunchKaufman
. Notez que si A
est symétrique complexe, alors U'
et L'
désignent les transposées non conjuguées, c'est-à-dire transpose(U)
et transpose(L)
.
L'itération de la décomposition produit les composants S.D
, S.U
ou S.L
selon ce qui est approprié étant donné S.uplo
, et S.p
.
Si rook
est true
, un pivotement de rook est utilisé. Si rook
est faux, le pivotement de rook n'est pas utilisé.
Lorsque check = true
, une erreur est levée si la décomposition échoue. Lorsque check = false
, la responsabilité de vérifier la validité de la décomposition (via issuccess
) incombe à l'utilisateur.
Les fonctions suivantes sont disponibles pour les objets BunchKaufman
: size
, \
, inv
, issymmetric
, ishermitian
, getindex
.
Exemples
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A est enveloppé en interne par Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
Facteur D :
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
Facteur U :
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation :
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # déstructuration via itération
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}}
Facteur D :
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
Facteur L :
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation :
2-element Vector{Int64}:
2
1
julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
LinearAlgebra.bunchkaufman!
— Functionbunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman
bunchkaufman!
est identique à bunchkaufman
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie.
LinearAlgebra.Eigen
— TypeEigen <: Factorization
Type de factorisation de matrice de la décomposition en valeurs propres/spectrales d'une matrice carrée A
. C'est le type de retour de eigen
, la fonction de factorisation de matrice correspondante.
Si F::Eigen
est l'objet de factorisation, les valeurs propres peuvent être obtenues via F.values
et les vecteurs propres comme les colonnes de la matrice F.vectors
. (Le k
-ième vecteur propre peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Exemples
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
Type de factorisation matricielle de la décomposition généralisée des valeurs propres/spectrales de A
et B
. C'est le type de retour de eigen
, la fonction de factorisation matricielle correspondante, lorsqu'elle est appelée avec deux arguments matriciels.
Si F::GeneralizedEigen
est l'objet de factorisation, les valeurs propres peuvent être obtenues via F.values
et les vecteurs propres comme les colonnes de la matrice F.vectors
. (Le k
-ième vecteur propre peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Exemples
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
Retourne les valeurs propres de A
.
Pour les matrices non symétriques générales, il est possible de spécifier comment la matrice est équilibrée avant le calcul des valeurs propres. Les mots-clés permute
, scale
et sortby
sont les mêmes que pour eigen
.
Exemples
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
Pour une entrée scalaire, eigvals
renverra un scalaire.
Exemples
julia> eigvals(-2)
-2
eigvals(A, B) -> valeurs
Calculez les valeurs propres généralisées de A
et B
.
Exemples
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) -> valeurs
Retourne les valeurs propres de A
. Il est possible de calculer seulement un sous-ensemble des valeurs propres en spécifiant une UnitRange
irange
couvrant les indices des valeurs propres triées, par exemple, les 2ème à 8ème valeurs propres.
Exemples
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
Retourne les valeurs propres de A
. Il est possible de calculer seulement un sous-ensemble des valeurs propres en spécifiant une paire vl
et vu
pour les limites inférieure et supérieure des valeurs propres.
Exemples
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) -> valeurs
Identique à eigvals
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Les mots-clés permute
, scale
et sortby
sont les mêmes que pour eigen
.
La matrice d'entrée A
ne contiendra pas ses valeurs propres après que eigvals!
ait été appelé dessus - A
est utilisé comme espace de travail.
Exemples
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
Identique à eigvals
, mais économise de l'espace en écrasant l'entrée A
(et B
), au lieu de créer des copies.
Les matrices d'entrée A
et B
ne contiendront pas leurs valeurs propres après l'appel de eigvals!
. Elles sont utilisées comme espaces de travail.
Exemples
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
Identique à eigvals
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. irange
est une plage d'indices de valeurs propres à rechercher - par exemple, les 2ème à 8ème valeurs propres.
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
Identique à eigvals
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. vl
est la borne inférieure de l'intervalle à rechercher pour les valeurs propres, et vu
est la borne supérieure.
LinearAlgebra.eigmax
— Functioneigmax(A; permute::Bool=true, scale::Bool=true)
Retourne la plus grande valeur propre de A
. L'option permute=true
permute la matrice pour se rapprocher d'une forme triangulaire supérieure, et scale=true
met à l'échelle la matrice par ses éléments diagonaux pour rendre les lignes et les colonnes plus égales en norme. Notez que si les valeurs propres de A
sont complexes, cette méthode échouera, car les nombres complexes ne peuvent pas être triés.
Exemples
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` ne peut pas avoir de valeurs propres complexes.
Stacktrace:
[...]
LinearAlgebra.eigmin
— Functioneigmin(A; permute::Bool=true, scale::Bool=true)
Retourne la plus petite valeur propre de A
. L'option permute=true
permute la matrice pour se rapprocher d'une forme triangulaire supérieure, et scale=true
met à l'échelle la matrice par ses éléments diagonaux pour rendre les lignes et les colonnes plus égales en norme. Notez que si les valeurs propres de A
sont complexes, cette méthode échouera, car les nombres complexes ne peuvent pas être triés.
Exemples
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` ne peut pas avoir de valeurs propres complexes.
Stacktrace:
[...]
LinearAlgebra.eigvecs
— Functioneigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
Renvoie une matrice M
dont les colonnes sont les vecteurs propres de A
. (Le k
-ème vecteur propre peut être obtenu à partir de la tranche M[:, k]
.)
Si le vecteur optionnel de valeurs propres eigvals
est spécifié, eigvecs
renvoie les vecteurs propres correspondants spécifiques.
Exemples
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
Renvoie une matrice M
dont les colonnes sont les vecteurs propres de A
. (Le k
-ème vecteur propre peut être obtenu à partir de la tranche M[:, k]
.) Les mots-clés permute
, scale
et sortby
sont les mêmes que pour eigen
.
Exemples
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
Retourne une matrice M
dont les colonnes sont les vecteurs propres généralisés de A
et B
. (Le k
-ème vecteur propre peut être obtenu à partir de la tranche M[:, k]
.)
Exemples
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
Calcule la décomposition en valeurs propres de A
, retournant un objet de factorisation Eigen
F
qui contient les valeurs propres dans F.values
et les vecteurs propres dans les colonnes de la matrice F.vectors
. Cela correspond à la résolution d'un problème de valeurs propres de la forme Ax = λx
, où A
est une matrice, x
est un vecteur propre, et λ
est une valeur propre. (Le k
-ième vecteur propre peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Les fonctions suivantes sont disponibles pour les objets Eigen
: inv
, det
, et isposdef
.
Pour les matrices générales non symétriques, il est possible de spécifier comment la matrice est équilibrée avant le calcul des vecteurs propres. L'option permute=true
permute la matrice pour la rapprocher d'une forme triangulaire supérieure, et scale=true
met à l'échelle la matrice par ses éléments diagonaux pour rendre les lignes et les colonnes plus égales en norme. La valeur par défaut est true
pour les deux options.
Par défaut, les valeurs et vecteurs propres sont triés lexicographiquement par (real(λ),imag(λ))
. Une fonction de comparaison différente by(λ)
peut être passée à sortby
, ou vous pouvez passer sortby=nothing
pour laisser les valeurs propres dans un ordre arbitraire. Certains types de matrices spéciaux (par exemple Diagonal
ou SymTridiagonal
) peuvent implémenter leur propre convention de tri et ne pas accepter un mot-clé sortby
.
Exemples
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; # destructuration via itération
julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen
Calcule la décomposition des valeurs propres généralisées de A
et B
, retournant un objet de factorisation GeneralizedEigen
F
qui contient les valeurs propres généralisées dans F.values
et les vecteurs propres généralisés dans les colonnes de la matrice F.vectors
. Cela correspond à la résolution d'un problème de valeurs propres généralisées de la forme Ax = λBx
, où A, B
sont des matrices, x
est un vecteur propre, et λ
est une valeur propre. (Le k
-ième vecteur propre généralisé peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Par défaut, les valeurs propres et les vecteurs sont triés lexicographiquement par (real(λ),imag(λ))
. Une fonction de comparaison différente by(λ)
peut être passée à sortby
, ou vous pouvez passer sortby=nothing
pour laisser les valeurs propres dans un ordre arbitraire.
Exemples
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B);
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen
Calcule la décomposition en valeurs propres de A
, retournant un objet de factorisation Eigen
F
qui contient les valeurs propres dans F.values
et les vecteurs propres dans les colonnes de la matrice F.vectors
. (Le k
-ème vecteur propre peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Les fonctions suivantes sont disponibles pour les objets Eigen
: inv
, det
, et isposdef
.
La UnitRange
irange
spécifie les indices des valeurs propres triées à rechercher.
Si irange
n'est pas 1:n
, où n
est la dimension de A
, alors la factorisation retournée sera une factorisation tronquée.
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen
Calcule la décomposition en valeurs propres de A
, retournant un objet de factorisation Eigen
F
qui contient les valeurs propres dans F.values
et les vecteurs propres dans les colonnes de la matrice F.vectors
. (Le k
-ième vecteur propre peut être obtenu à partir de la tranche F.vectors[:, k]
.)
L'itération de la décomposition produit les composants F.values
et F.vectors
.
Les fonctions suivantes sont disponibles pour les objets Eigen
: inv
, det
, et isposdef
.
vl
est la borne inférieure de la fenêtre des valeurs propres à rechercher, et vu
est la borne supérieure.
Si [vl
, vu
] ne contient pas toutes les valeurs propres de A
, alors la factorisation retournée sera une factorisation tronquée.
LinearAlgebra.eigen!
— Functioneigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)
Identique à eigen
, mais économise de l'espace en écrasant l'entrée A
(et B
), au lieu de créer une copie.
LinearAlgebra.Hessenberg
— TypeHessenberg <: Factorisation
Un objet Hessenberg
représente la factorisation de Hessenberg QHQ'
d'une matrice carrée, ou un décalage Q(H+μI)Q'
de celle-ci, qui est produit par la fonction hessenberg
.
LinearAlgebra.hessenberg
— Functionhessenberg(A) -> Hessenberg
Calculez la décomposition de Hessenberg de A
et renvoyez un objet Hessenberg
. Si F
est l'objet de factorisation, la matrice unitaire peut être accédée avec F.Q
(de type LinearAlgebra.HessenbergQ
) et la matrice de Hessenberg avec F.H
(de type UpperHessenberg
), l'une ou l'autre pouvant être convertie en une matrice régulière avec Matrix(F.H)
ou Matrix(F.Q)
.
Si A
est Hermitienne
ou Symétrique
réelle, alors la décomposition de Hessenberg produit une matrice tridiagonale réelle-symétrique et F.H
est de type SymTridiagonal
.
Notez que la factorisation décalée A+μI = Q (H+μI) Q'
peut être construite efficacement par F + μ*I
en utilisant l'objet UniformScaling
I
, qui crée un nouvel objet Hessenberg
avec un stockage partagé et un décalage modifié. Le décalage d'un F
donné est obtenu par F.μ
. Cela est utile car plusieurs résolutions décalées (F + μ*I) \ b
(pour différents μ
et/ou b
) peuvent être effectuées efficacement une fois que F
est créé.
L'itération de la décomposition produit les facteurs F.Q, F.H, F.μ
.
Exemples
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 facteur : 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H facteur :
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; # déstructuration via itération
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!
— Functionhessenberg!(A) -> Hessenberg
hessenberg!
est identique à hessenberg
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie.
LinearAlgebra.Schur
— TypeSchur <: Factorization
Type de factorisation matricielle de la factorisation de Schur d'une matrice A
. C'est le type de retour de schur(_)
, la fonction de factorisation matricielle correspondante.
Si F::Schur
est l'objet de factorisation, le facteur de Schur (quasi) triangulaire peut être obtenu via F.Schur
ou F.T
et les vecteurs de Schur orthogonaux/unitaires via F.vectors
ou F.Z
de sorte que A = F.vectors * F.Schur * F.vectors'
. Les valeurs propres de A
peuvent être obtenues avec F.values
.
L'itération de la décomposition produit les composants F.T
, F.Z
et F.values
.
Exemples
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
eigenvalues:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # destructuring via iteration
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— TypeGeneralizedSchur <: Factorization
Type de factorisation matricielle de la factorisation de Schur généralisée de deux matrices A
et B
. C'est le type de retour de schur(_, _)
, la fonction de factorisation matricielle correspondante.
Si F::GeneralizedSchur
est l'objet de factorisation, les facteurs de Schur (quasi) triangulaires peuvent être obtenus via F.S
et F.T
, les vecteurs de Schur unitaires/orthogonaux à gauche via F.left
ou F.Q
, et les vecteurs de Schur unitaires/orthogonaux à droite peuvent être obtenus avec F.right
ou F.Z
de sorte que A=F.left*F.S*F.right'
et B=F.left*F.T*F.right'
. Les valeurs propres généralisées de A
et B
peuvent être obtenues avec F.α./F.β
.
L'itération de la décomposition produit les composants F.S
, F.T
, F.Q
, F.Z
, F.α
, et F.β
.
LinearAlgebra.schur
— Functionschur(A) -> F::Schur
Calcule la factorisation de Schur de la matrice A
. Le facteur de Schur (quasi) triangulaire peut être obtenu à partir de l'objet Schur
F
avec soit F.Schur
soit F.T
et les vecteurs de Schur orthogonaux/unitaires peuvent être obtenus avec F.vectors
ou F.Z
de sorte que A = F.vectors * F.Schur * F.vectors'
. Les valeurs propres de A
peuvent être obtenues avec F.values
.
Pour un A
réel, la factorisation de Schur est "quasitriangulaire", ce qui signifie qu'elle est supérieurement triangulaire sauf avec des blocs diagonaux de 2×2 pour toute paire conjuguée de valeurs propres complexes ; cela permet à la factorisation d'être purement réelle même lorsqu'il y a des valeurs propres complexes. Pour obtenir la factorisation de Schur (complexe) purement supérieurement triangulaire à partir d'une factorisation quasitriangulaire réelle, vous pouvez utiliser Schur{Complex}(schur(A))
.
L'itération de la décomposition produit les composants F.T
, F.Z
et F.values
.
Exemples
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
valeurs propres:
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; # déstructuration via itération
julia> t == F.T && z == F.Z && vals == F.values
true
schur(A, B) -> F::GeneralizedSchur
Calcule la factorisation de Schur généralisée (ou QZ) des matrices A
et B
. Les facteurs de Schur (quasi) triangulaires peuvent être obtenus à partir de l'objet Schur
F
avec F.S
et F.T
, les vecteurs de Schur unitaires/orthogonaux à gauche peuvent être obtenus avec F.left
ou F.Q
et les vecteurs de Schur unitaires/orthogonaux à droite peuvent être obtenus avec F.right
ou F.Z
de sorte que A=F.left*F.S*F.right'
et B=F.left*F.T*F.right'
. Les valeurs propres généralisées de A
et B
peuvent être obtenues avec F.α./F.β
.
L'itération de la décomposition produit les composants F.S
, F.T
, F.Q
, F.Z
, F.α
et F.β
.
LinearAlgebra.schur!
— Functionschur!(A) -> F::Schur
Identique à schur
mais utilise l'argument d'entrée A
comme espace de travail.
Exemples
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 facteur :
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z facteur :
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
valeurs propres :
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
Identique à schur
mais utilise les matrices d'entrée A
et B
comme espace de travail.
LinearAlgebra.ordschur
— Functionordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
Réorganise la factorisation de Schur F
d'une matrice A = Z*T*Z'
selon le tableau logique select
, retournant l'objet de factorisation réordonné F
. Les valeurs propres sélectionnées apparaissent dans la diagonale principale de F.Schur
et les colonnes principales correspondantes de F.vectors
forment une base orthogonale/unitaire du sous-espace invariant à droite correspondant. Dans le cas réel, une paire de valeurs propres conjuguées complexes doit être soit entièrement incluse, soit entièrement exclue via select
.
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
Réorganise la factorisation de Schur généralisée F
d'une paire de matrices (A, B) = (Q*S*Z', Q*T*Z')
selon le tableau logique select
et renvoie un objet GeneralizedSchur F
. Les valeurs propres sélectionnées apparaissent dans la diagonale principale de F.S
et F.T
, et les vecteurs de Schur orthogonaux/unitaires à gauche et à droite sont également réorganisés de sorte que (A, B) = F.Q*(F.S, F.T)*F.Z'
reste valide et que les valeurs propres généralisées de A
et B
puissent toujours être obtenues avec F.α./F.β
.
LinearAlgebra.ordschur!
— Functionordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
Identique à ordschur
mais écrase la factorisation F
.
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
Identique à ordschur
mais écrase la factorisation F
.
LinearAlgebra.SVD
— TypeSVD <: Factorization
Type de factorisation matricielle de la décomposition en valeurs singulières (SVD) d'une matrice A
. C'est le type de retour de svd(_)
, la fonction de factorisation matricielle correspondante.
Si F::SVD
est l'objet de factorisation, U
, S
, V
et Vt
peuvent être obtenus via F.U
, F.S
, F.V
et F.Vt
, de sorte que A = U * Diagonal(S) * Vt
. Les valeurs singulières dans S
sont triées par ordre décroissant.
L'itération de la décomposition produit les composants U
, S
et V
.
Exemples
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
valeurs singulières:
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; # déstructuration via itération
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD
— TypeGeneralizedSVD <: Factorization
Type de factorisation matricielle de la décomposition en valeurs singulières généralisée (SVD) de deux matrices A
et B
, telle que A = F.U*F.D1*F.R0*F.Q'
et B = F.V*F.D2*F.R0*F.Q'
. C'est le type de retour de svd(_, _)
, la fonction de factorisation matricielle correspondante.
Pour une matrice M-par-N A
et une matrice P-par-N B
,
U
est une matrice orthogonale M-par-M,V
est une matrice orthogonale P-par-P,Q
est une matrice orthogonale N-par-N,D1
est une matrice diagonale M-par-(K+L) avec des 1 dans les K premières entrées,D2
est une matrice P-par-(K+L) dont le bloc supérieur droit L-par-L est diagonal,R0
est une matrice (K+L)-par-N dont le bloc supérieur droit (K+L)-par-(K+L) est non singulier et triangulaire supérieur,
K+L
est le rang numérique effectif de la matrice [A; B]
.
L'itération de la décomposition produit les composants U
, V
, Q
, D1
, D2
, et R0
.
Les entrées de F.D1
et F.D2
sont liées, comme expliqué dans la documentation LAPACK pour le SVD généralisé et la routine xGGSVD3 qui est appelée en dessous (dans LAPACK 3.6.0 et versions ultérieures).
Exemples
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
Calcule la décomposition en valeurs singulières (SVD) de A
et renvoie un objet SVD
.
U
, S
, V
et Vt
peuvent être obtenus à partir de la factorisation F
avec F.U
, F.S
, F.V
et F.Vt
, de sorte que A = U * Diagonal(S) * Vt
. L'algorithme produit Vt
et donc Vt
est plus efficace à extraire que V
. Les valeurs singulières dans S
sont triées par ordre décroissant.
L'itération de la décomposition produit les composants U
, S
et V
.
Si full = false
(par défaut), une SVD "mince" est renvoyée. Pour une matrice A
de taille $M \times N$, dans la factorisation complète U
est de taille $M \times M$ et V
est de taille $N \times N$, tandis que dans la factorisation mince U
est de taille $M \times K$ et V
est de taille $N \times K$, où $K = \min(M,N)$ est le nombre de valeurs singulières.
Si alg = DivideAndConquer()
, un algorithme de diviser pour régner est utilisé pour calculer la SVD. Une autre option (typiquement plus lente mais plus précise) est alg = QRIteration()
.
L'argument clé alg
nécessite Julia 1.3 ou une version ultérieure.
Exemples
julia> A = rand(4,3);
julia> F = svd(A); # Stocker l'objet de factorisation
julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true
julia> U, S, V = F; # déstructuration via itération
julia> A ≈ U * Diagonal(S) * V'
true
julia> Uonly, = svd(A); # Stocker uniquement U
julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD
Calculez le SVD généralisé de A
et B
, retournant un objet de factorisation GeneralizedSVD
F
tel que [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'
U
est une matrice orthogonale de M par M,V
est une matrice orthogonale de P par P,Q
est une matrice orthogonale de N par N,D1
est une matrice diagonale de M par (K+L) avec des 1 dans les K premières entrées,D2
est une matrice de P par (K+L) dont le bloc supérieur droit de L par L est diagonal,R0
est une matrice de (K+L) par N dont le bloc supérieur droit de (K+L) par (K+L) est non singulier et triangulaire supérieur,
K+L
est le rang numérique effectif de la matrice [A; B]
.
L'itération de la décomposition produit les composants U
, V
, Q
, D1
, D2
, et R0
.
Le SVD généralisé est utilisé dans des applications telles que lorsque l'on veut comparer combien appartient à A
par rapport à combien appartient à B
, comme dans le génome humain contre le génome de la levure, ou le signal contre le bruit, ou entre les clusters contre à l'intérieur des clusters. (Voir Edelman et Wang pour discussion : https://arxiv.org/abs/1901.00485)
Il décompose [A; B]
en [UC; VS]H
, où [UC; VS]
est une base orthogonale naturelle pour l'espace des colonnes de [A; B]
, et H = RQ'
est une base non orthogonale naturelle pour l'espace des lignes de [A;B]
, où les lignes supérieures sont le plus étroitement attribuées à la matrice A
, et les lignes inférieures à la matrice B
. Les matrices multi-cosinus/sinus C
et S
fournissent une mesure multiple de combien A
contre combien B
, et U
et V
fournissent des directions dans lesquelles ces mesures sont effectuées.
Exemples
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!
est identique à svd
, mais économise de l'espace en écrasant l'entrée A
, au lieu de créer une copie. Voir la documentation de svd
pour plus de détails.
svd!(A, B) -> GeneralizedSVD
svd!
est identique à svd
, mais modifie les arguments A
et B
sur place, au lieu de faire des copies. Voir la documentation de svd
pour plus de détails.
LinearAlgebra.svdvals
— Functionsvdvals(A)
Retourne les valeurs singulières de A
dans l'ordre décroissant.
Exemples
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)
Retourne les valeurs singulières généralisées de la décomposition en valeurs singulières généralisées de A
et B
. Voir aussi svd
.
Exemples
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!
— Functionsvdvals!(A)
Retourne les valeurs singulières de A
, économisant de l'espace en écrasant l'entrée. Voir aussi svdvals
et svd
.
svdvals!(A, B)
Retourne les valeurs singulières généralisées de la décomposition en valeurs singulières généralisées de A
et B
, en économisant de l'espace en écrasant A
et B
. Voir aussi svd
et svdvals
.
LinearAlgebra.Givens
— TypeLinearAlgebra.Givens(i1,i2,c,s) -> G
Un opérateur linéaire de rotation de Givens. Les champs c
et s
représentent le cosinus et le sinus de l'angle de rotation, respectivement. Le type Givens
prend en charge la multiplication à gauche G*A
et la multiplication par la transposée conjuguée à droite A*G'
. Le type n'a pas de size
et peut donc être multiplié avec des matrices de taille arbitraire tant que i2<=size(A,2)
pour G*A
ou i2<=size(A,1)
pour A*G'
.
Voir aussi givens
.
LinearAlgebra.givens
— Functiongivens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)
Calcule la rotation de Givens G
et le scalaire r
tels que pour tout vecteur x
où
x[i1] = f
x[i2] = g
le résultat de la multiplication
y = G*x
a la propriété que
y[i1] = r
y[i2] = 0
Voir aussi LinearAlgebra.Givens
.
givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)
Calcule la rotation de Givens G
et le scalaire r
tels que le résultat de la multiplication
B = G*A
a la propriété que
B[i1,j] = r
B[i2,j] = 0
Voir aussi LinearAlgebra.Givens
. ```
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)
Calcule la rotation de Givens G
et le scalaire r
de sorte que le résultat de la multiplication
B = G*x
ait la propriété que
B[i1] = r
B[i2] = 0
Voir aussi LinearAlgebra.Givens
. ```
LinearAlgebra.triu
— Functiontriu(M)
Triangle supérieur d'une matrice.
Exemples
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)
Renvoie le triangle supérieur de M
à partir de la k
-ième superdiagonale.
Exemples
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)
Triangle supérieure d'une matrice, en écrasant M
dans le processus. Voir aussi triu
.
triu!(M, k::Integer)
Renvoie le triangle supérieur de M
à partir de la k
-ième superdiagonale, en écrasant M
dans le processus.
Exemples
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)
Triangle inférieur d'une matrice.
Exemples
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)
Retourne le triangle inférieur de M
à partir de la k
-ième superdiagonale.
Exemples
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)
Triangle inférieure d'une matrice, en écrasant M
dans le processus. Voir aussi tril
.
tril!(M, k::Integer)
Renvoie le triangle inférieur de M
à partir de la k
-ième superdiagonale, en écrasant M
dans le processus.
Exemples
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())
Un AbstractRange
donnant les indices de la k
-ième diagonale de la matrice M
. En option, un style d'index peut être spécifié, ce qui détermine le type de la plage retournée. Si indstyle isa IndexLinear
(par défaut), cela retourne un AbstractRange{Integer}
. D'autre part, si indstyle isa IndexCartesian
, cela retourne un AbstractRange{CartesianIndex{2}}
.
Si k
n'est pas fourni, il est supposé être 0
(correspondant à la diagonale principale).
Voir aussi : diag
, diagm
, Diagonal
.
Exemples
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)
Spécifier un IndexStyle
nécessite au moins Julia 1.11.
LinearAlgebra.diag
— Functiondiag(M, k::Integer=0)
La k
-ième diagonale d'une matrice, sous forme de vecteur.
Voir aussi diagm
, diagind
, Diagonal
, isdiag
.
Exemples
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}...)
Construit une matrice à partir de `Pair`s de diagonales et de vecteurs. Le vecteur `kv.second` sera placé sur la diagonale `kv.first`. Par défaut, la matrice est carrée et sa taille est déduite de `kv`, mais une taille non carrée `m`×`n` (remplie de zéros si nécessaire) peut être spécifiée en passant `m,n` comme premiers arguments. Pour les indices de diagonale répétés `kv.first`, les valeurs des vecteurs correspondants `kv.second` seront additionnées.
`diagm` construit une matrice complète ; si vous souhaitez des versions économes en stockage avec une arithmétique rapide, consultez [`Diagonal`](@ref), [`Bidiagonal`](@ref), [`Tridiagonal`](@ref) et [`SymTridiagonal`](@ref).
# Exemples
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)
Construit une matrice avec les éléments du vecteur comme éléments diagonaux. Par défaut, la matrice est carrée et sa taille est donnée par length(v)
, mais une taille non carrée m
×n
peut être spécifiée en passant m,n
comme premiers arguments.
Exemples
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
Retourne le rang de la factorisation QR
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
Calcule le rang de S
en calculant sa factorisation QR. Les valeurs inférieures à tol
sont considérées comme nulles. Voir le manuel de SPQR.
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)
Calculez le rang numérique d'une matrice en comptant combien de valeurs de sortie de svdvals(A)
sont supérieures à max(atol, rtol*σ₁)
où σ₁
est la plus grande valeur singulière calculée de A
. atol
et rtol
sont respectivement les tolérances absolue et relative. La tolérance relative par défaut est n*ϵ
, où n
est la taille de la plus petite dimension de A
, et ϵ
est le eps
du type d'élément de A
.
Le rang numérique peut être une caractérisation sensible et imprécise des matrices mal conditionnées avec des valeurs singulières proches de la tolérance seuil max(atol, rtol*σ₁)
. Dans de tels cas, de légères perturbations dans le calcul des valeurs singulières ou dans la matrice peuvent changer le résultat de rank
en déplaçant une ou plusieurs valeurs singulières au-delà du seuil. Ces variations peuvent même se produire en raison de changements dans les erreurs de flottement entre différentes versions de Julia, architectures, compilateurs ou systèmes d'exploitation.
Les arguments de mot-clé atol
et rtol
nécessitent au moins Julia 1.1. Dans Julia 1.0, rtol
est disponible en tant qu'argument positionnel, mais cela sera obsolète dans Julia 2.0.
Exemples
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)
Pour tout conteneur itérable A
(y compris les tableaux de n'importe quelle dimension) de nombres (ou tout type d'élément pour lequel norm
est défini), calculez la p
-norme (par défaut p=2
) comme si A
était un vecteur de la longueur correspondante.
La p
-norme est définie comme
\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]
avec $a_i$ les entrées de A
, $| a_i |$ la norm
de $a_i$, et $n$ la longueur de A
. Puisque la p
-norme est calculée en utilisant les norm
s des entrées de A
, la p
-norme d'un vecteur de vecteurs n'est pas compatible avec l'interprétation de celui-ci comme un vecteur bloc en général si p != 2
.
p
peut prendre n'importe quelle valeur numérique (bien que toutes les valeurs ne produisent pas une norme vectorielle mathématiquement valide). En particulier, norm(A, Inf)
renvoie la plus grande valeur dans abs.(A)
, tandis que norm(A, -Inf)
renvoie la plus petite. Si A
est une matrice et p=2
, alors cela équivaut à la norme de Frobenius.
Le deuxième argument p
n'est pas nécessairement une partie de l'interface pour norm
, c'est-à-dire qu'un type personnalisé peut n'implémenter que norm(A)
sans deuxième argument.
Utilisez opnorm
pour calculer la norme opérateur d'une matrice.
Exemples
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)
Pour les nombres, retourner $\left( |x|^p \right)^{1/p}$.
Exemples
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)
Calculez la norme opérateur (ou norme de matrice) induite par la norme vectorielle p
, où les valeurs valides de p
sont 1
, 2
ou Inf
. (Notez que pour les matrices creuses, p=2
n'est actuellement pas implémenté.) Utilisez norm
pour calculer la norme de Frobenius.
Lorsque p=1
, la norme opérateur est la somme maximale des valeurs absolues des colonnes de A
:
\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]
avec $a_{ij}$ les éléments de $A$, et $m$ et $n$ ses dimensions.
Lorsque p=2
, la norme opérateur est la norme spectrale, égale à la plus grande valeur singulière de A
.
Lorsque p=Inf
, la norme opérateur est la somme maximale des valeurs absolues des lignes de A
:
\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]
Exemples
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)
Pour les nombres, renvoyez $\left( |x|^p \right)^{1/p}$. Cela équivaut à norm
.
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)
Pour les vecteurs enveloppés dans Adjoint/Transpose, renvoie la norme opérateur $q$-norm de A
, qui est équivalente à la p
-norm avec la valeur p = q/(q-1)
. Elles coïncident à p = q = 2
. Utilisez norm
pour calculer la norme p
de A
en tant que vecteur.
La différence de norme entre un espace vectoriel et son dual apparaît pour préserver la relation entre la dualité et le produit scalaire, et le résultat est cohérent avec la norme opérateur p
d'une matrice 1 × n
.
Exemples
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)
Normalisez le tableau a
sur place de sorte que sa norme p
soit égale à l'unité, c'est-à-dire norm(a, p) == 1
. Voir aussi normalize
et norm
.
LinearAlgebra.normalize
— Functionnormalize(a, p::Real=2)
Normaliser a
de sorte que sa p
-norme soit égale à l'unité, c'est-à-dire norm(a, p) == 1
. Pour les scalaires, cela est similaire à sign(a), sauf que normalize(0) = NaN. Voir aussi normalize!
, norm
, et sign
.
Exemples
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::Réel=2)
Nombre de condition de la matrice M
, calculé en utilisant la norme opérateur p
. Les valeurs valides pour p
sont 1
, 2
(par défaut) ou 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}\]
Le nombre de condition de Skeel $\kappa_S$ de la matrice M
, éventuellement par rapport au vecteur x
, est calculé en utilisant la norme opérateur p
. $\left\vert M \right\vert$ désigne la matrice des valeurs absolues (élément par élément) de $M$; $\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$. Les valeurs valides pour p
sont 1
, 2
et Inf
(par défaut).
Cette quantité est également connue dans la littérature sous le nom de nombre de condition de Bauer, nombre de condition relatif, ou nombre de condition relatif élément par élément.
LinearAlgebra.tr
— Functiontr(M)
Trace de la matrice. Somme des éléments diagonaux de M
.
Exemples
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.det
— Functiondet(M)
Déterminant de matrice.
Voir aussi : logdet
et logabsdet
.
Exemples
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdet
— Functionlogdet(M)
Logarithme du déterminant de matrice. Équivalent à log(det(M))
, mais peut offrir une précision accrue et évite le débordement/sous-dépassement.
Exemples
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)
Logarithme de la valeur absolue du déterminant de la matrice. Équivalent à (log(abs(det(M))), sign(det(M)))
, mais peut offrir une précision et/ou une vitesse accrues.
Exemples
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)
Inverse de matrice. Calcule la matrice N
telle que M * N = I
, où I
est la matrice identité. Calculé en résolvant la division à gauche N = M \ I
.
Exemples
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) # à déprécier dans Julia 2.0
Calcule la pseudo-inverse de Moore-Penrose.
Pour les matrices M
avec des éléments à virgule flottante, il est pratique de calculer la pseudo-inverse en inversant uniquement les valeurs singulières supérieures à max(atol, rtol*σ₁)
où σ₁
est la plus grande valeur singulière de M
.
Le choix optimal de la tolérance absolue (atol
) et de la tolérance relative (rtol
) varie à la fois avec la valeur de M
et l'application prévue de la pseudo-inverse. La tolérance relative par défaut est n*ϵ
, où n
est la taille de la plus petite dimension de M
, et ϵ
est le eps
du type d'élément de M
.
Pour inverser des matrices denses mal conditionnées dans un sens des moindres carrés, rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
est recommandé.
Pour plus d'informations, voir [issue8859], [B96], [S84], [KY88].
Exemples
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) # à déprécier dans Julia 2.0
Calcule une base pour le noyau de `M` en incluant les vecteurs singuliers de `M` dont les valeurs singulières ont des magnitudes inférieures à `max(atol, rtol*σ₁)`, où `σ₁` est la plus grande valeur singulière de `M`.
Par défaut, la tolérance relative `rtol` est `n*ϵ`, où `n` est la taille de la plus petite dimension de `M`, et `ϵ` est le [`eps`](@ref) du type d'élément de `M`.
# Exemples
jldoctest julia> M = [1 0 0; 0 1 0; 0 0 0] 3×3 Matrix{Int64}: 1 0 0 0 1 0 0 0 0
julia> nullspace(M) 3×1 Matrix{Float64}: 0.0 0.0 1.0
julia> nullspace(M, rtol=3) 3×3 Matrix{Float64}: 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
julia> nullspace(M, atol=0.95) 3×1 Matrix{Float64}: 0.0 0.0 1.0 ```
Base.kron
— Functionkron(A, B)
Calcule le produit de Kronecker de deux vecteurs, matrices ou nombres.
Pour les vecteurs réels v
et w
, le produit de Kronecker est lié au produit extérieur par kron(v,w) == vec(w * transpose(v))
ou w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
. Notez comment l'ordre de v
et w
diffère à gauche et à droite de ces expressions (en raison du stockage en colonne). Pour les vecteurs complexes, le produit extérieur w * v'
diffère également par la conjugaison de v
.
Exemples
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)
Calcule le produit de Kronecker de A
et B
et stocke le résultat dans C
, écrasant le contenu existant de C
. C'est la version en place de kron
.
Cette fonction nécessite Julia 1.6 ou une version ultérieure.
Base.exp
— Methodexp(A::AbstractMatrix)
Calcule l'exponentielle matricielle de A
, définie par
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
Pour A
symétrique ou hermitien, une décomposition en valeurs propres (eigen
) est utilisée, sinon l'algorithme de mise à l'échelle et de mise au carré (voir [H05]) est choisi.
Exemples
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)
Méthode plus efficace pour exp(im*A)
de la matrice carrée A
(surtout si A
est Hermitienne
ou Symétrique
réel).
Voir aussi cispi
, sincos
, exp
.
Le support de l'utilisation de cis
avec des matrices a été ajouté dans Julia 1.7.
Exemples
julia> cis([π 0; 0 π]) ≈ -I
true
Base.:^
— Method^(A::AbstractMatrix, p::Number)
Puissance de matrice, équivalente à $\exp(p\log(A))$
Exemples
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^
— Method^(b::Number, A::AbstractMatrix)
Exponential de matrice, équivalent à $\exp(\log(b)A)$.
Le support pour l'élévation des nombres Irrational
(comme ℯ
) à une matrice a été ajouté dans Julia 1.1.
Exemples
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)
Si A
n'a pas de valeur propre réelle négative, calculez le logarithme matriciel principal de A
, c'est-à-dire la matrice unique $X$ telle que $e^X = A$ et $-\pi < Im(\lambda) < \pi$ pour toutes les valeurs propres $\lambda$ de $X$. Si A
a des valeurs propres non positives, une fonction matricielle non principale est renvoyée chaque fois que cela est possible.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée, si A
est triangulaire, une version améliorée de la méthode d'inversion par mise à l'échelle et de mise à l'échelle est employée (voir [AH12] et [AHR13]). Si A
est réel sans valeurs propres négatives, alors la forme de Schur réelle est calculée. Sinon, la forme de Schur complexe est calculée. Ensuite, l'algorithme triangulaire supérieur (quasi-)triangulaire dans [AHR13] est utilisé sur le facteur supérieur (quasi-)triangulaire.
Exemples
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)
Retourne $\sqrt{x}$.
Lève une DomainError
pour les arguments Real
négatifs. Utilisez plutôt des arguments complexes négatifs. Notez que sqrt
a une coupure de branche le long de l'axe réel négatif.
L'opérateur préfixe √
est équivalent à sqrt
.
Voir aussi : hypot
.
Exemples
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 est en dessous de la coupure de branche
0.0 - 9.0im
julia> .√(1:4)
4-element Vector{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
sqrt(A::AbstractMatrix)
Si A
n'a pas d'autovalues réelles négatives, calculez la racine carrée principale de la matrice A
, c'est-à-dire la matrice unique $X$ dont les autovalues ont une partie réelle positive telle que $X^2 = A$. Sinon, une racine carrée non principale est retournée.
Si A
est réelle-symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer la racine carrée. Pour de telles matrices, les autovalues λ qui semblent légèrement négatives en raison d'erreurs d'arrondi sont traitées comme si elles étaient nulles. Plus précisément, les matrices avec toutes les autovalues ≥ -rtol*(max |λ|)
sont considérées comme semi-définies (produisant une racine carrée hermitienne), avec les autovalues négatives considérées comme nulles. rtol
est un argument clé pour sqrt
(dans le cas hermitien/réel-symétrique uniquement) qui par défaut est la précision machine multipliée par size(A,1)
.
Sinon, la racine carrée est déterminée par la méthode de Björck-Hammarling [BH83], qui calcule la forme de Schur complexe (schur
) puis la racine carrée complexe du facteur triangulaire. Si une racine carrée réelle existe, alors une extension de cette méthode [H87] qui calcule la forme de Schur réelle puis la racine carrée réelle du facteur quasi-triangulaire est utilisée à la place.
Exemples
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})
Calcule la racine cubique réelle d'une matrice réelle A
. Si T = cbrt(A)
, alors nous avons T*T*T ≈ A
, voir l'exemple donné ci-dessous.
Si A
est symétrique, c'est-à-dire de type HermOrSym{<:Real}
, alors (eigen
) est utilisé pour trouver la racine cubique. Sinon, une version spécialisée de l'algorithme de racine p-th [S03] est utilisée, qui exploite la décomposition de Schur réelle (schur
) pour calculer la racine cubique.
Exemples
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)
Calcule le cosinus matriciel d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer le cosinus. Sinon, le cosinus est déterminé en appelant exp
.
Exemples
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sin
— Methodsin(A::AbstractMatrix)
Calcule le sinus matriciel d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer le sinus. Sinon, le sinus est déterminé en appelant exp
.
Exemples
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)
Calcule le sinus et le cosinus matriciels d'une matrice carrée A
.
Exemples
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)
Calcule la tangente matricielle d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer la tangente. Sinon, la tangente est déterminée en appelant exp
.
Exemples
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)
Calcule la sécante matricielle d'une matrice carrée A
.
Base.Math.csc
— Methodcsc(A::AbstractMatrix)
Calculez la cosecante de matrice d'une matrice carrée A
.
Base.Math.cot
— Methodcot(A::AbstractMatrix)
Calculez la cotangente matricielle d'une matrice carrée A
.
Base.cosh
— Methodcosh(A::AbstractMatrix)
Calculez le cosinus hyperbolique matriciel d'une matrice carrée A
.
Base.sinh
— Methodsinh(A::AbstractMatrix)
Calculez le sinus hyperbolique matriciel d'une matrice carrée A
.
Base.tanh
— Methodtanh(A::AbstractMatrix)
Calculez la tangente hyperbolique de matrice d'une matrice carrée A
.
Base.Math.sech
— Methodsech(A::AbstractMatrix)
Calculez la sécante hyperbolique de matrice de la matrice carrée A
.
Base.Math.csch
— Methodcsch(A::AbstractMatrix)
Calculez la cosecante hyperbolique de matrice de la matrice carrée A
.
Base.Math.coth
— Methodcoth(A::AbstractMatrix)
Calculez le cotangent hyperbolique de matrice de la matrice carrée A
.
Base.acos
— Methodacos(A::AbstractMatrix)
Calcule le cosinus inverse d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer le cosinus inverse. Sinon, le cosinus inverse est déterminé en utilisant log
et sqrt
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_1].
Exemples
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)
Calculez le sinus inverse de matrice d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, sa décomposition en valeurs propres (eigen
) est utilisée pour calculer le sinus inverse. Sinon, le sinus inverse est déterminé en utilisant log
et sqrt
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_2].
Exemples
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)
Calcule la tangente inverse de matrice d'une matrice carrée A
.
Si A
est symétrique ou hermitienne, son eigendecomposition (eigen
) est utilisée pour calculer la tangente inverse. Sinon, la tangente inverse est déterminée en utilisant log
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_3].
Exemples
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)
Calculez la matrice sécante inverse de A
.
Base.Math.acsc
— Methodacsc(A::AbstractMatrix)
Calculez la cosecante de matrice inverse de A
.
Base.Math.acot
— Methodacot(A::AbstractMatrix)
Calculez la cotangente inverse de la matrice A
.
Base.acosh
— Methodacosh(A::AbstractMatrix)
Calculez le cosinus hyperbolique inverse d'une matrice carrée A
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_4].
Base.asinh
— Methodasinh(A::AbstractMatrix)
Calculez le sinus hyperbolique inverse d'une matrice carrée A
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_5].
Base.atanh
— Methodatanh(A::AbstractMatrix)
Calculez la tangente hyperbolique inverse d'une matrice carrée A
. Pour la théorie et les formules logarithmiques utilisées pour calculer cette fonction, voir [AH16_6].
Base.Math.asech
— Methodasech(A::AbstractMatrix)
Calculez la matrice inverse de la sécante hyperbolique de A
.
Base.Math.acsch
— Methodacsch(A::AbstractMatrix)
Calculez le cosécante hyperbolique inverse de la matrice A
.
Base.Math.acoth
— Methodacoth(A::AbstractMatrix)
Calculez le cotangente hyperbolique inverse de A
.
LinearAlgebra.lyap
— Functionlyap(A, C)
Calcule la solution X
de l'équation de Lyapunov continue AX + XA' + C = 0
, où aucun eigenvalue de A
n'a de partie réelle nulle et aucun deux eigenvalues ne sont des conjugués complexes négatifs l'un de l'autre.
Exemples
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)
Calcule la solution X
de l'équation de Sylvester AX + XB + C = 0
, où A
, B
et C
ont des dimensions compatibles et A
et -B
n'ont pas d'autovalues avec une partie réelle égale.
Exemples
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)
Testez si une factorisation d'une matrice a réussi.
issuccess(::CholeskyPivoted)
nécessite Julia 1.6 ou une version ultérieure.
Exemples
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
true
issuccess(F::LU; allowsingular = false)
Testez si la factorisation LU d'une matrice a réussi. Par défaut, une factorisation qui produit un facteur U valide mais de rang déficient est considérée comme un échec. Cela peut être modifié en passant allowsingular = true
.
L'argument clé allowsingular
a été ajouté dans Julia 1.11.
Exemples
julia> F = lu([1 2; 1 2], check = false);
julia> issuccess(F)
false
julia> issuccess(F, allowsingular = true)
true
LinearAlgebra.issymmetric
— Functionissymmetric(A) -> Bool
Teste si une matrice est symétrique.
Exemples
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
Testez si une matrice est définie positive (et Hermitienne) en essayant d'effectuer une factorisation de Cholesky de A
.
Voir aussi isposdef!
, cholesky
.
Exemples
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!
— Functionisposdef!(A) -> Bool
Testez si une matrice est définie positive (et Hermitienne) en essayant d'effectuer une factorisation de Cholesky de A
, en écrasant A
dans le processus. Voir aussi isposdef
.
Exemples
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
Testez si A
est triangulaire inférieure à partir de la k
-ième superdiagonale.
Exemples
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
Testez si A
est triangulaire supérieure à partir de la k
-ième superdiagonale.
Exemples
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
Testez si une matrice est diagonale dans le sens où iszero(A[i,j])
est vrai sauf si i == j
. Notez qu'il n'est pas nécessaire que A
soit carrée ; si vous souhaitez également vérifier cela, vous devez vérifier que size(A, 1) == size(A, 2)
.
Exemples
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
Testez si une matrice est Hermitienne.
Exemples
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)
Transposition paresseuse. La mutation de l'objet retourné doit muter A
de manière appropriée. Souvent, mais pas toujours, cela donne Transpose(A)
, où Transpose
est un wrapper de transposition paresseuse. Notez que cette opération est récursive.
Cette opération est destinée à un usage en algèbre linéaire - pour la manipulation générale des données, voir permutedims
, qui est non récursive.
Exemples
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 # la transposition d'une transposition déplie le parent
true
julia> Transpose(B) # cependant, le constructeur enveloppe toujours son argument
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # modifier B modifiera automatiquement A
julia> A
2×2 Matrix{Int64}:
3 2
4 0
Pour les matrices complexes, l'opération adjoint
est équivalente à une transposition conjuguée.
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
La transpose
d'un AbstractVector
est un vecteur ligne :
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # retourne un vecteur ligne
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # calcule le produit scalaire
14
Pour une matrice de matrices, les blocs individuels sont opérés de manière récursive :
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # construire une matrice bloc
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # les blocs sont transposés de manière récursive
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)
Transposition paresseuse de la factorisation F
. Par défaut, renvoie une TransposeFactorization
, sauf pour les Factorization
avec un eltype
réel, auquel cas renvoie une AdjointFactorization
.
LinearAlgebra.transpose!
— Functiontranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Transposer la matrice A
et la stocke dans la matrice X
. size(X)
doit être égal à size(transpose(A))
. Aucune mémoire supplémentaire n'est allouée en dehors du redimensionnement de rowval
et nzval
de X
, si nécessaire.
Voir halfperm!
transpose!(dest,src)
Transposer le tableau src
et stocker le résultat dans le tableau préalloué dest
, qui doit avoir une taille correspondant à (size(src,2),size(src,1))
. Aucune transposition en place n'est supportée et des résultats inattendus se produiront si src
et dest
ont des régions de mémoire qui se chevauchent.
Exemples
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
— TypeTransposé
Type d'enveloppe paresseux pour une vue transposée de l'objet d'algèbre linéaire sous-jacent, généralement un AbstractVector
/AbstractMatrix
. En général, le constructeur Transpose
ne doit pas être appelé directement, utilisez plutôt transpose
. Pour matérialiser la vue, utilisez copy
.
Ce type est destiné à une utilisation en algèbre linéaire - pour la manipulation générale des données, voir permutedims
.
Exemples
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
Type d'enveloppe paresseux pour la transposée de l'objet Factorization
sous-jacent. En général, le constructeur TransposeFactorization
ne doit pas être appelé directement, utilisez plutôt transpose(:: Factorization)
.
Base.adjoint
— FunctionA'
adjoint(A)
Adjoint paresseux (transposition conjuguée). Notez que adjoint
est appliqué de manière récursive aux éléments.
Pour les types numériques, adjoint
renvoie le conjugué complexe, et donc il est équivalent à la fonction identité pour les nombres réels.
Cette opération est destinée à une utilisation en algèbre linéaire - pour la manipulation générale des données, voir permutedims
.
Exemples
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> B = A' # équivalent à 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 # l'adjoint d'un adjoint déplie le parent
true
julia> Adjoint(B) # cependant, le constructeur enveloppe toujours son argument
2×2 adjoint(adjoint(::Matrix{Complex{Int64}})) with eltype Complex{Int64}:
3+2im 9+2im
0+0im 0+0im
julia> B[1,2] = 4 + 5im; # modifier B modifiera automatiquement A
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
4-5im 0+0im
Pour les matrices réelles, l'opération adjoint
est équivalente à une 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
L'adjoint d'un AbstractVector
est un vecteur ligne :
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 # calculer le produit scalaire, équivalent à x' * x
25 + 0im
Pour une matrice de matrices, les blocs individuels sont opérés de manière récursive :
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)
Adjoint paresseux de la factorisation F
. Par défaut, renvoie un wrapper AdjointFactorization
.
LinearAlgebra.adjoint!
— Functionadjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Transposer la matrice A
et stocke l'adjoint des éléments dans la matrice X
. size(X)
doit être égal à size(transpose(A))
. Aucune mémoire supplémentaire n'est allouée en dehors du redimensionnement de rowval
et nzval
de X
, si nécessaire.
Voir halfperm!
adjoint!(dest,src)
Transpose conjuguée du tableau src
et stockez le résultat dans le tableau préalloué dest
, qui doit avoir une taille correspondant à (size(src,2),size(src,1))
. Aucune transposition en place n'est prise en charge et des résultats inattendus se produiront si src
et dest
ont des régions de mémoire qui se chevauchent.
Exemples
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
Type d'enveloppe paresseux pour une vue adjoint de l'objet d'algèbre linéaire sous-jacent, généralement un AbstractVector
/AbstractMatrix
. En général, le constructeur Adjoint
ne doit pas être appelé directement, utilisez plutôt adjoint
. Pour matérialiser la vue, utilisez copy
.
Ce type est destiné à une utilisation en algèbre linéaire - pour la manipulation générale des données, voir permutedims
.
Exemples
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
Type d'enveloppe paresseux pour l'adjoint de l'objet Factorization
sous-jacent. En général, le constructeur AdjointFactorization
ne doit pas être appelé directement, utilisez plutôt adjoint(:: Factorization)
.
Base.copy
— Methodcopy(A::Transpose)
copy(A::Adjoint)
Évaluez avec empressement la transposition/adjointe de matrice paresseuse. Notez que la transposition est appliquée de manière récursive aux éléments.
Cette opération est destinée à un usage en algèbre linéaire - pour une manipulation générale des données, voir permutedims
, qui est non récursive.
Exemples
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
Retourne la distance entre les éléments successifs du tableau dans la dimension 1 en unités de taille d'élément.
Exemples
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)
Vérifiez qu'une matrice est carrée, puis renvoyez sa dimension commune. Pour plusieurs arguments, renvoyez un vecteur.
Exemples
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
calcule le taux de flop maximal de l'ordinateur en utilisant la précision double gemm!
. Par défaut, si aucun argument n'est spécifié, il multiplie deux matrices Float64
de taille n x n
, où n = 4096
. Si le BLAS sous-jacent utilise plusieurs threads, des taux de flop plus élevés sont réalisés. Le nombre de threads BLAS peut être défini avec BLAS.set_num_threads(n)
.
Si l'argument clé eltype
est fourni, peakflops
construira des matrices avec des éléments de type eltype
pour calculer le taux de flop maximal.
Par défaut, peakflops
utilisera le meilleur timing parmi 3 essais. Si l'argument clé ntrials
est fourni, peakflops
utilisera ce nombre d'essais pour choisir le meilleur timing.
Si l'argument clé parallel
est défini sur true
, peakflops
est exécuté en parallèle sur tous les processeurs de travail. Le taux de flop de l'ensemble de l'ordinateur parallèle est retourné. Lors de l'exécution en parallèle, un seul thread BLAS est utilisé. L'argument n
fait toujours référence à la taille du problème qui est résolu sur chaque processeur.
Cette fonction nécessite au moins Julia 1.1. Dans Julia 1.0, elle est disponible dans la bibliothèque standard InteractiveUtils
.
LinearAlgebra.hermitianpart
— Functionhermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Retourne la partie hermitienne de la matrice carrée A
, définie comme (A + A') / 2
, sous forme d'une matrice Hermitian
. Pour les matrices réelles A
, cela est également connu sous le nom de partie symétrique de A
; on l'appelle parfois la "partie réelle de l'opérateur". L'argument optionnel uplo
contrôle l'argument correspondant de la vue Hermitian
. Pour les matrices réelles, cette dernière est équivalente à une vue Symmetric
.
Voir aussi hermitianpart!
pour l'opération correspondante en place.
Cette fonction nécessite Julia 1.10 ou une version ultérieure.
LinearAlgebra.hermitianpart!
— Functionhermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Écrasez la matrice carrée A
sur place avec sa partie hermitienne (A + A') / 2
, et retournez Hermitian(A, uplo)
. Pour les matrices réelles A
, cela est également connu sous le nom de partie symétrique de A
.
Voir aussi hermitianpart
pour l'opération correspondante hors place.
Cette fonction nécessite Julia 1.10 ou une version ultérieure.
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
Copier efficacement les éléments de la matrice A
vers B
avec adjunction comme suit :
B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]
Les éléments B[ir_dest, jr_dest]
sont écrasés. De plus, les paramètres de plage d'index doivent satisfaire length(ir_dest) == length(jr_src)
et 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
Copier efficacement les éléments de la matrice A
vers B
avec transposition comme suit :
B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]
Les éléments B[ir_dest, jr_dest]
sont écrasés. De plus, les paramètres de plage d'index doivent satisfaire length(ir_dest) == length(jr_src)
et 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
Copier efficacement les éléments de la matrice M
vers B
en fonction du paramètre de caractère tM
comme suit :
tM | Destination | Source |
---|---|---|
'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] |
Les éléments B[ir_dest, jr_dest]
sont écrasés. De plus, les paramètres de plage d'index doivent satisfaire length(ir_dest) == length(jr_src)
et length(jr_dest) == length(ir_src)
.
Voir aussi copyto!
et copy_adjoint!
.
Low-level matrix operations
Dans de nombreux cas, il existe des versions en place des opérations matricielles qui vous permettent de fournir un vecteur ou une matrice de sortie pré-alloué. Cela est utile lors de l'optimisation de code critique afin d'éviter le surcoût des allocations répétées. Ces opérations en place sont suffixées par !
ci-dessous (par exemple mul!
) selon la convention habituelle de Julia.
LinearAlgebra.mul!
— Functionmul!(Y, A, B) -> Y
Calcule le produit matrice-matrice ou matrice-vecteur $A B$ et stocke le résultat dans Y
, écrasant la valeur existante de Y
. Notez que Y
ne doit pas être aliasé avec A
ou B
.
Exemples
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
Implémentation
Pour les types de matrices et de vecteurs personnalisés, il est recommandé d'implémenter mul!
à 5 arguments plutôt que d'implémenter directement mul!
à 3 arguments si possible.
mul!(C, A, B, α, β) -> C
Multiplication-addition de matrices ou de vecteurs en place combinée $A B α + C β$. Le résultat est stocké dans C
en le remplaçant. Notez que C
ne doit pas être aliasé avec A
ou B
.
mul!
à cinq arguments nécessite au moins Julia 1.3.
Exemples
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]; # Une copie de la valeur originale de C
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!
— Functionlmul!(a::Number, B::AbstractArray)
Échelle d'un tableau B
par un scalaire a
en écrasant B
sur place. Utilisez rmul!
pour multiplier le scalaire par la droite. L'opération de mise à l'échelle respecte la sémantique de la multiplication *
entre a
et un élément de B
. En particulier, cela s'applique également à la multiplication impliquant des nombres non finis tels que NaN
et ±Inf
.
Avant Julia 1.1, les entrées NaN
et ±Inf
dans B
étaient traitées de manière incohérente.
Exemples
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)
Calcule le produit matriciel $AB$, en écrasant B
, et retourne le résultat. Ici, A
doit être d'un type de matrice spécial, comme, par exemple, Diagonal
, UpperTriangular
ou LowerTriangular
, ou d'un type orthogonal, voir QR
.
Exemples
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)
Échelle un tableau A
par un scalaire b
en écrasant A
sur place. Utilisez lmul!
pour multiplier le scalaire par la gauche. L'opération de mise à l'échelle respecte la sémantique de la multiplication *
entre un élément de A
et b
. En particulier, cela s'applique également à la multiplication impliquant des nombres non finis tels que NaN
et ±Inf
.
Avant Julia 1.1, les entrées NaN
et ±Inf
dans A
étaient traitées de manière incohérente.
Exemples
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)
Calcule le produit matrice-matrice $AB$, en écrasant A
, et retourne le résultat. Ici, B
doit être d'un type de matrice spécial, comme, par exemple, Diagonal
, UpperTriangular
ou LowerTriangular
, ou d'un type orthogonal, voir QR
.
Exemples
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
Calcule A \ B
sur place et stocke le résultat dans Y
, en retournant le résultat.
L'argument A
ne doit pas être une matrice. Au lieu de matrices, il doit s'agir d'un objet de factorisation (par exemple, produit par factorize
ou cholesky
). La raison en est que la factorisation elle-même est à la fois coûteuse et nécessite généralement d'allouer de la mémoire (bien qu'elle puisse également être effectuée sur place via, par exemple, lu!
), et les situations critiques en termes de performance nécessitant ldiv!
exigent généralement un contrôle fin sur la factorisation de A
.
Certains types de matrices structurées, tels que Diagonal
et UpperTriangular
, sont autorisés, car ils sont déjà sous une forme factorisée.
Exemples
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)
Calcule A \ B
sur place et écrase B
pour stocker le résultat.
L'argument A
ne doit pas être une matrice. Au lieu de matrices, il doit s'agir d'un objet de factorisation (par exemple, produit par factorize
ou cholesky
). La raison en est que la factorisation elle-même est à la fois coûteuse et nécessite généralement d'allouer de la mémoire (bien qu'elle puisse également être effectuée sur place via, par exemple, lu!
), et les situations critiques en termes de performance nécessitant ldiv!
nécessitent généralement également un contrôle fin sur la factorisation de A
.
Certains types de matrices structurées, tels que Diagonal
et UpperTriangular
, sont autorisés, car ils sont déjà sous une forme factorisée
Exemples
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)
Divise chaque entrée d'un tableau B
par un scalaire a
en écrasant B
sur place. Utilisez rdiv!
pour diviser le scalaire par la droite.
Exemples
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
Calcule A \ B
sur place par élimination de Gauss avec pivotement partiel et stocke le résultat dans B
, retournant le résultat. Dans le processus, les diagonales de A
sont également écrasées.
ldiv!
pour les côtés gauche Tridiagonal
nécessite au moins Julia 1.11.
LinearAlgebra.rdiv!
— Functionrdiv!(A, B)
Calcule A / B
sur place et écrase A
pour stocker le résultat.
L'argument B
ne doit pas être une matrice. Au lieu de matrices, il doit s'agir d'un objet de factorisation (par exemple, produit par factorize
ou cholesky
). La raison en est que la factorisation elle-même est à la fois coûteuse et nécessite généralement de l'allocation de mémoire (bien qu'elle puisse également être effectuée sur place via, par exemple, lu!
), et les situations critiques en termes de performance nécessitant rdiv!
exigent généralement un contrôle fin sur la factorisation de B
.
Certains types de matrices structurées, tels que Diagonal
et UpperTriangular
, sont autorisés, car ils sont déjà sous une forme factorisée.
rdiv!(A::AbstractArray, b::Number)
Divise chaque entrée d'un tableau A
par un scalaire b
en écrasant A
sur place. Utilisez ldiv!
pour diviser le scalaire par la gauche.
Exemples
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
En Julia (comme dans une grande partie du calcul scientifique), les opérations d'algèbre linéaire dense sont basées sur le LAPACK library, qui est lui-même construit sur des blocs de construction d'algèbre linéaire de base connus sous le nom de BLAS. Il existe des implémentations hautement optimisées de BLAS disponibles pour chaque architecture informatique, et parfois, dans des routines d'algèbre linéaire haute performance, il est utile d'appeler directement les fonctions BLAS.
LinearAlgebra.BLAS
fournit des wrappers pour certaines des fonctions BLAS. Les fonctions BLAS qui écrasent l'un des tableaux d'entrée ont des noms se terminant par '!'
. En général, une fonction BLAS a quatre méthodes définies, pour Float32
, Float64
, ComplexF32
, et ComplexF64
tableaux.
BLAS character arguments
De nombreuses fonctions BLAS acceptent des arguments qui déterminent s'il faut transposer un argument (trans
), quel triangle d'une matrice référencer (uplo
ou ul
), si la diagonale d'une matrice triangulaire peut être supposée être entièrement composée de uns (dA
) ou de quel côté d'une multiplication de matrices l'argument d'entrée appartient (side
). Les possibilités sont :
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
— ModuleInterface aux sous-routines BLAS.
LinearAlgebra.BLAS.set_num_threads
— Functionset_num_threads(n::Integer)
set_num_threads(::Nothing)
Définissez le nombre de threads que la bibliothèque BLAS doit utiliser égal à n::Integer
.
Accepte également nothing
, auquel cas julia essaie de deviner le nombre par défaut de threads. Passer nothing
est déconseillé et existe principalement pour des raisons historiques.
LinearAlgebra.BLAS.get_num_threads
— Functionget_num_threads()
Obtenez le nombre de threads que la bibliothèque BLAS utilise.
get_num_threads
nécessite au moins Julia 1.6.
Les fonctions BLAS peuvent être divisées en trois groupes, également appelés trois niveaux, en fonction de la date à laquelle elles ont été proposées pour la première fois, du type de paramètres d'entrée et de la complexité de l'opération.
Level 1 BLAS functions
Les fonctions BLAS de niveau 1 ont été proposées pour la première fois dans [(Lawson, 1979)][Lawson-1979] et définissent des opérations entre des scalaires et des vecteurs.
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!
— Functionrot!(n, X, incx, Y, incy, c, s)
Écrase X
avec c*X + s*Y
et Y
avec -conj(s)*X + c*Y
pour les premiers n
éléments du tableau X
avec un pas incx
et les premiers n
éléments du tableau Y
avec un pas incy
. Renvoie X
et Y
.
rot!
nécessite au moins Julia 1.5.
LinearAlgebra.BLAS.scal!
— Functionscal!(n, a, X, incx)
scal!(a, X)
Écrasez X
avec a*X
pour les premiers n
éléments du tableau X
avec un pas incx
. Renvoie X
.
Si n
et incx
ne sont pas fournis, length(X)
et stride(X,1)
sont utilisés.
LinearAlgebra.BLAS.scal
— Functionscal(n, a, X, incx)
scal(a, X)
Renvoie X
mis à l'échelle par a
pour les premiers n
éléments du tableau X
avec un pas incx
.
Si n
et incx
ne sont pas fournis, length(X)
et stride(X,1)
sont utilisés.
LinearAlgebra.BLAS.blascopy!
— Functionblascopy!(n, X, incx, Y, incy)
Copie n
éléments du tableau X
avec un pas incx
vers le tableau Y
avec un pas incy
. Renvoie Y
.
LinearAlgebra.BLAS.dot
— Functiondot(n, X, incx, Y, incy)
Produit scalaire de deux vecteurs consistant en n
éléments du tableau X
avec un pas incx
et n
éléments du tableau Y
avec un pas incy
.
Exemples
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)
Fonction Dot pour deux vecteurs complexes consistant en n
éléments du tableau X
avec un pas incx
et n
éléments du tableau Y
avec un pas incy
.
Exemples
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)
Fonction Dot pour deux vecteurs complexes, consistant en n
éléments du tableau X
avec un pas incx
et n
éléments du tableau U
avec un pas incy
, conjuguant le premier vecteur.
Exemples
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)
2-norme d'un vecteur composé de n
éléments du tableau X
avec un pas incx
.
Exemples
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)
Somme des magnitudes des premiers n
éléments du tableau X
avec un pas incx
.
Pour un tableau réel, la magnitude est la valeur absolue. Pour un tableau complexe, la magnitude est la somme de la valeur absolue de la partie réelle et de la valeur absolue de la partie imaginaire.
Exemples
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)
Trouvez l'indice de l'élément de dx
ayant la valeur absolue maximale. n
est la longueur de dx
, et incx
est le pas. Si n
et incx
ne sont pas fournis, ils supposent des valeurs par défaut de n=length(dx)
et incx=stride1(dx)
.
Level 2 BLAS functions
Les fonctions BLAS de niveau 2 ont été publiées dans [(Dongarra, 1988)][Dongarra-1988] et définissent des opérations matrice-vecteur.
[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291
retourner un vecteur
LinearAlgebra.BLAS.gemv!
— Functiongemv!(tA, alpha, A, x, beta, y)
Met à jour le vecteur y
comme alpha*A*x + beta*y
ou alpha*A'x + beta*y
selon tA
. alpha
et beta
sont des scalaires. Retourne le y
mis à jour.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, alpha, A, x)
Retourne alpha*A*x
ou alpha*A'x
selon tA
. alpha
est un scalaire.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, A, x)
Retourne A*x
ou A'x
selon tA
.
LinearAlgebra.BLAS.gbmv!
— Functiongbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
Met à jour le vecteur y
comme alpha*A*x + beta*y
ou alpha*A'*x + beta*y
selon trans
. La matrice A
est une matrice bande générale de dimension m
par size(A,2)
avec kl
sous-diagonales et ku
super-diagonales. alpha
et beta
sont des scalaires. Retourne le y
mis à jour.
LinearAlgebra.BLAS.gbmv
— Functiongbmv(trans, m, kl, ku, alpha, A, x)
Retourne alpha*A*x
ou alpha*A'*x
selon trans
. La matrice A
est une matrice bande générale de dimension m
par size(A,2)
avec kl
sous-diagonales et ku
super-diagonales, et alpha
est un scalaire.
LinearAlgebra.BLAS.hemv!
— Functionhemv!(ul, alpha, A, x, beta, y)
Met à jour le vecteur y
comme alpha*A*x + beta*y
. A
est supposé être hermitien. Seul le triangle ul
de A
est utilisé. alpha
et beta
sont des scalaires. Retourne le y
mis à jour.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, alpha, A, x)
Retourne alpha*A*x
. A
est supposé être hermitien. Seule la ul
triangle de A
est utilisée. alpha
est un scalaire.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, A, x)
Retourne A*x
. A
est supposé être hermitien. Seul le triangle ul
de A
est utilisé.
LinearAlgebra.BLAS.hpmv!
— Functionhpmv!(uplo, α, AP, x, β, y)
Met à jour le vecteur y
comme α*A*x + β*y
, où A
est une matrice hermitienne fournie au format packagé AP
.
Avec uplo = 'U'
, le tableau AP doit contenir la partie triangulaire supérieure de la matrice hermitienne packagée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[1, 2]
et A[2, 2]
, et ainsi de suite.
Avec uplo = 'L'
, le tableau AP doit contenir la partie triangulaire inférieure de la matrice hermitienne packagée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[2, 1]
et A[3, 1]
, et ainsi de suite.
Les entrées scalaires α
et β
doivent être des nombres complexes ou réels.
Les entrées de tableau x
, y
et AP
doivent toutes être de type ComplexF32
ou ComplexF64
.
Retourne le y
mis à jour.
hpmv!
nécessite au moins Julia 1.5.
LinearAlgebra.BLAS.symv!
— Functionsymv!(ul, alpha, A, x, beta, y)
Met à jour le vecteur y
comme alpha*A*x + beta*y
. A
est supposé être symétrique. Seule la triangle ul
de A
est utilisée. alpha
et beta
sont des scalaires. Retourne le y
mis à jour.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, alpha, A, x)
Retourne alpha*A*x
. A
est supposé être symétrique. Seule la ul
triangle de A
est utilisée. alpha
est un scalaire.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, A, x)
Retourne A*x
. A
est supposé être symétrique. Seule la ul
triangle de A
est utilisée.
LinearAlgebra.BLAS.sbmv!
— Functionsbmv!(uplo, k, alpha, A, x, beta, y)
Met à jour le vecteur y
comme alpha*A*x + beta*y
où A
est une matrice symétrique en bande d'ordre size(A,2)
avec k
super-diagonales stockées dans l'argument A
. La disposition de stockage pour A
est décrite dans le module de référence BLAS, BLAS de niveau 2 à https://www.netlib.org/lapack/explore-html/. Seul le triangle uplo
de A
est utilisé.
Retourne le y
mis à jour.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, alpha, A, x)
Retourne alpha*A*x
où A
est une matrice symétrique en bande d'ordre size(A,2)
avec k
super-diagonales stockées dans l'argument A
. Seul le triangle uplo
de A
est utilisé.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, A, x)
Retourne A*x
où A
est une matrice symétrique en bande d'ordre size(A,2)
avec k
super-diagonales stockées dans l'argument A
. Seule la triangle uplo
de A
est utilisée.
LinearAlgebra.BLAS.spmv!
— Functionspmv!(uplo, α, AP, x, β, y)
Met à jour le vecteur y
comme α*A*x + β*y
, où A
est une matrice symétrique fournie au format packagé AP
.
Avec uplo = 'U'
, le tableau AP doit contenir la partie triangulaire supérieure de la matrice symétrique emballée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[1, 2]
et A[2, 2]
, et ainsi de suite.
Avec uplo = 'L'
, le tableau AP doit contenir la partie triangulaire inférieure de la matrice symétrique emballée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[2, 1]
et A[3, 1]
, et ainsi de suite.
Les entrées scalaires α
et β
doivent être réelles.
Les entrées de tableau x
, y
et AP
doivent toutes être de type Float32
ou Float64
.
Retourne le y
mis à jour.
spmv!
nécessite au moins Julia 1.5.
LinearAlgebra.BLAS.trmv!
— Functiontrmv!(ul, tA, dA, A, b)
Retourne op(A)*b
, où op
est déterminé par tA
. Seul le triangle ul
de A
est utilisé. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un. La multiplication se fait en place sur b
.
LinearAlgebra.BLAS.trmv
— Functiontrmv(ul, tA, dA, A, b)
Retourne op(A)*b
, où op
est déterminé par tA
. Seule la triangle ul
de A
est utilisée. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un.
LinearAlgebra.BLAS.trsv!
— Functiontrsv!(ul, tA, dA, A, b)
Écrasez b
avec la solution de A*x = b
ou l'une des deux autres variantes déterminées par tA
et ul
. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un. Retournez le b
mis à jour.
LinearAlgebra.BLAS.trsv
— Functiontrsv(ul, tA, dA, A, b)
Retourne la solution de A*x = b
ou l'une des deux autres variantes déterminées par tA
et ul
. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un.
retourner une matrice
LinearAlgebra.BLAS.ger!
— Functionger!(alpha, x, y, A)
Mise à jour de rang-1 de la matrice A
avec les vecteurs x
et y
comme alpha*x*y' + A
.
LinearAlgebra.BLAS.her!
— Functionher!(uplo, alpha, x, A)
Méthodes uniquement pour les tableaux complexes. Mise à jour de rang 1 de la matrice hermitienne A
avec le vecteur x
comme alpha*x*x' + A
. uplo
contrôle quel triangle de A
est mis à jour. Renvoie A
.
LinearAlgebra.BLAS.syr!
— Functionsyr!(uplo, alpha, x, A)
Mise à jour de rang-1 de la matrice symétrique A
avec le vecteur x
sous la forme alpha*x*transpose(x) + A
. uplo
contrôle quel triangle de A
est mis à jour. Renvoie A
.
LinearAlgebra.BLAS.spr!
— Functionspr!(uplo, α, x, AP)
Mettre à jour la matrice A
comme A+α*x*x'
, où A
est une matrice symétrique fournie au format packagé AP
et x
est un vecteur.
Avec uplo = 'U'
, le tableau AP doit contenir la partie triangulaire supérieure de la matrice symétrique emballée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[1, 2]
et A[2, 2]
, et ainsi de suite.
Avec uplo = 'L'
, le tableau AP doit contenir la partie triangulaire inférieure de la matrice symétrique emballée séquentiellement, colonne par colonne, de sorte que AP[1]
contienne A[1, 1]
, AP[2]
et AP[3]
contiennent respectivement A[2, 1]
et A[3, 1]
, et ainsi de suite.
L'entrée scalaire α
doit être réelle.
Les entrées de tableau x
et AP
doivent toutes être de type Float32
ou Float64
. Retournez le AP
mis à jour.
spr!
nécessite au moins Julia 1.8.
Level 3 BLAS functions
Les fonctions BLAS de niveau 3 ont été publiées dans [(Dongarra, 1990)][Dongarra-1990] et définissent des opérations matrice-matrice.
[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!
— Functiongemmt!(uplo, tA, tB, alpha, A, B, beta, C)
Met à jour la partie triangulaire inférieure ou supérieure spécifiée par uplo
de C
comme alpha*A*B + beta*C
ou les autres variantes selon tA
et tB
. Retourne le C
mis à jour.
gemmt!
nécessite au moins Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, alpha, A, B)
Retourne la partie triangulaire inférieure ou supérieure spécifiée par uplo
de A*B
ou les trois autres variantes selon tA
et tB
.
gemmt
nécessite au moins Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, A, B)
Retourne la partie triangulaire inférieure ou supérieure spécifiée par uplo
de A*B
ou les trois autres variantes selon tA
et tB
.
gemmt
nécessite au moins Julia 1.11.
LinearAlgebra.BLAS.gemm!
— Functiongemm!(tA, tB, alpha, A, B, beta, C)
Mettre à jour C
comme alpha*A*B + beta*C
ou les trois autres variantes selon tA
et tB
. Retourner le C
mis à jour.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, alpha, A, B)
Retourne alpha*A*B
ou les trois autres variantes selon tA
et tB
.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, A, B)
Retourne A*B
ou les trois autres variantes selon tA
et tB
.
LinearAlgebra.BLAS.symm!
— Functionsymm!(côté, ul, alpha, A, B, beta, C)
Mettez à jour C
en tant que alpha*A*B + beta*C
ou alpha*B*A + beta*C
selon side
. A
est supposé être symétrique. Seul le triangle ul
de A
est utilisé. Retournez le C
mis à jour.
LinearAlgebra.BLAS.symm
— Methodsymm(côté, ul, alpha, A, B)
Retourne alpha*A*B
ou alpha*B*A
selon side
. A
est supposé être symétrique. Seul le triangle ul
de A
est utilisé.
LinearAlgebra.BLAS.symm
— Methodsymm(côté, ul, A, B)
Retourne A*B
ou B*A
selon côté
. A
est supposé être symétrique. Seul le triangle ul
de A
est utilisé.
LinearAlgebra.BLAS.hemm!
— Functionhemm!(côté, ul, alpha, A, B, beta, C)
Mettez à jour C
en tant que alpha*A*B + beta*C
ou alpha*B*A + beta*C
selon côté
. A
est supposé être hermitien. Seul le triangle ul
de A
est utilisé. Retournez le C
mis à jour.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, alpha, A, B)
Retourne alpha*A*B
ou alpha*B*A
selon side
. A
est supposé être hermitien. Seule la triangle ul
de A
est utilisée.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, A, B)
Retourne A*B
ou B*A
selon side
. A
est supposé être hermitien. Seul le triangle ul
de A
est utilisé.
LinearAlgebra.BLAS.syrk!
— Functionsyrk!(uplo, trans, alpha, A, beta, C)
Mise à jour de rang-k de la matrice symétrique C
sous la forme alpha*A*transpose(A) + beta*C
ou alpha*transpose(A)*A + beta*C
selon trans
. Seul le triangle uplo
de C
est utilisé. Retourne C
.
LinearAlgebra.BLAS.syrk
— Functionsyrk(uplo, trans, alpha, A)
Retourne soit le triangle supérieur soit le triangle inférieur de A
, selon uplo
, de alpha*A*transpose(A)
ou alpha*transpose(A)*A
, selon trans
.
LinearAlgebra.BLAS.herk!
— Functionherk!(uplo, trans, alpha, A, beta, C)
Méthodes uniquement pour les tableaux complexes. Mise à jour de rang-k de la matrice hermitienne C
sous la forme alpha*A*A' + beta*C
ou alpha*A'*A + beta*C
selon trans
. Seul le triangle uplo
de C
est mis à jour. Renvoie C
.
LinearAlgebra.BLAS.herk
— Functionherk(uplo, trans, alpha, A)
Méthodes uniquement pour les tableaux complexes. Renvoie le triangle uplo
de alpha*A*A'
ou alpha*A'*A
, selon trans
.
LinearAlgebra.BLAS.syr2k!
— Functionsyr2k!(uplo, trans, alpha, A, B, beta, C)
Mise à jour de rang-2k de la matrice symétrique C
sous la forme alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C
ou alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C
selon trans
. Seul le triangle uplo
de C
est utilisé. Retourne C
.
LinearAlgebra.BLAS.syr2k
— Functionsyr2k(uplo, trans, alpha, A, B)
Renvoie le triangle uplo
de alpha*A*transpose(B) + alpha*B*transpose(A)
ou alpha*transpose(A)*B + alpha*transpose(B)*A
, selon trans
.
syr2k(uplo, trans, A, B)
Retourne le triangle uplo
de A*transpose(B) + B*transpose(A)
ou transpose(A)*B + transpose(B)*A
, selon trans
.
LinearAlgebra.BLAS.her2k!
— Functionher2k!(uplo, trans, alpha, A, B, beta, C)
Mise à jour de rang-2k de la matrice hermitienne C
sous la forme alpha*A*B' + alpha*B*A' + beta*C
ou alpha*A'*B + alpha*B'*A + beta*C
selon trans
. Le scalaire beta
doit être réel. Seut le triangle uplo
de C
est utilisé. Retourne C
.
LinearAlgebra.BLAS.her2k
— Functionher2k(uplo, trans, alpha, A, B)
Retourne le triangle uplo
de alpha*A*B' + alpha*B*A'
ou alpha*A'*B + alpha*B'*A
, selon trans
.
LinearAlgebra.BLAS.trmm!
— Functiontrmm!(côté, ul, tA, dA, alpha, A, B)
Mettez à jour B
en tant que alpha*A*B
ou l'une des trois autres variantes déterminées par côté
et tA
. Seul le triangle ul
de A
est utilisé. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un. Retournez le B
mis à jour.
LinearAlgebra.BLAS.trmm
— Functiontrmm(côté, ul, tA, dA, alpha, A, B)
Retourne alpha*A*B
ou l'une des trois autres variantes déterminées par side
et tA
. Seul le triangle ul
de A
est utilisé. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un.
LinearAlgebra.BLAS.trsm!
— Functiontrsm!(côté, ul, tA, dA, alpha, A, B)
Écrase B
avec la solution de A*X = alpha*B
ou l'une des trois autres variantes déterminées par side
et tA
. Seul le triangle ul
de A
est utilisé. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un. Renvoie le B
mis à jour.
LinearAlgebra.BLAS.trsm
— Functiontrsm(côté, ul, tA, dA, alpha, A, B)
Retourne la solution de A*X = alpha*B
ou l'une des trois autres variantes déterminées par side
et tA
. Seul le triangle ul
de A
est utilisé. dA
détermine si les valeurs diagonales sont lues ou supposées être toutes égales à un.
LAPACK functions
LinearAlgebra.LAPACK
fournit des wrappers pour certaines des fonctions LAPACK pour l'algèbre linéaire. Les fonctions qui écrasent l'un des tableaux d'entrée ont des noms se terminant par '!'
.
Habituellement, une fonction a 4 méthodes définies, une pour chacune de Float64
, Float32
, ComplexF64
et ComplexF32
tableaux.
Notez que l'API LAPACK fournie par Julia peut et va changer à l'avenir. Étant donné que cette API n'est pas destinée aux utilisateurs, il n'y a aucun engagement à prendre en charge/déprécier cet ensemble spécifique de fonctions dans les futures versions.
LinearAlgebra.LAPACK
— ModuleInterfaces aux sous-routines LAPACK.
LinearAlgebra.LAPACK.gbtrf!
— Functiongbtrf!(kl, ku, m, AB) -> (AB, ipiv)
Calculez la factorisation LU d'une matrice en bande AB
. kl
est la première sous-diagonale contenant une bande non nulle, ku
est la dernière superdiagonale contenant une bande, et m
est la première dimension de la matrice AB
. Renvoie la factorisation LU sur place et ipiv
, le vecteur de pivots utilisés.
LinearAlgebra.LAPACK.gbtrs!
— Functiongbtrs!(trans, kl, ku, m, AB, ipiv, B)
Résoudre l'équation AB * X = B
. trans
détermine l'orientation de AB
. Il peut être N
(pas de transposition), T
(transposition) ou C
(transposition conjuguée). kl
est la première sous-diagonale contenant une bande non nulle, ku
est la dernière superdiagonale contenant une, et m
est la première dimension de la matrice AB
. ipiv
est le vecteur de pivots retourné par gbtrf!
. Renvoie le vecteur ou la matrice X
, écrasant B
sur place.
LinearAlgebra.LAPACK.gebal!
— Functiongebal!(job, A) -> (ilo, ihi, scale)
Équilibrez la matrice A
avant de calculer son système d'eigenvalues ou sa factorisation de Schur. job
peut être l'un de N
(A
ne sera pas permuté ou mis à l'échelle), P
(A
sera seulement permuté), S
(A
sera seulement mis à l'échelle), ou B
(A
sera à la fois permuté et mis à l'échelle). Modifie A
sur place et retourne ilo
, ihi
et scale
. Si la permutation a été activée, A[i,j] = 0
si j > i
et 1 < j < ilo
ou j > ihi
. scale
contient des informations sur les mises à l'échelle/permutations effectuées.
LinearAlgebra.LAPACK.gebak!
— Functiongebak!(job, side, ilo, ihi, scale, V)
Transformez les vecteurs propres V
d'une matrice équilibrée à l'aide de gebal!
en les vecteurs propres non mis à l'échelle/non permutés de la matrice d'origine. Modifie V
sur place. side
peut être L
(les vecteurs propres à gauche sont transformés) ou R
(les vecteurs propres à droite sont transformés).
LinearAlgebra.LAPACK.gebrd!
— Functiongebrd!(A) -> (A, d, e, tauq, taup)
Réduit A
sur place à la forme bidiagonale A = QBP'
. Renvoie A
, contenant la matrice bidiagonale B
; d
, contenant les éléments diagonaux de B
; e
, contenant les éléments hors-diagonaux de B
; tauq
, contenant les réflecteurs élémentaires représentant Q
; et taup
, contenant les réflecteurs élémentaires représentant P
.
LinearAlgebra.LAPACK.gelqf!
— Functiongelqf!(A, tau)
Calcule la factorisation LQ
de A
, A = LQ
. tau
contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation. tau
doit avoir une longueur supérieure ou égale à la plus petite dimension de A
.
Renvoie A
et tau
modifiés sur place.
gelqf!(A) -> (A, tau)
Calcule la factorisation LQ
de A
, A = LQ
.
Renvoie A
, modifié sur place, et tau
, qui contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.geqlf!
— Functiongeqlf!(A, tau)
Calcule la factorisation QL
de A
, A = QL
. tau
contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation. tau
doit avoir une longueur supérieure ou égale à la plus petite dimension de A
.
Renvoie A
et tau
modifiés sur place.
geqlf!(A) -> (A, tau)
Calcule la factorisation QL
de A
, A = QL
.
Renvoie A
, modifié sur place, et tau
, qui contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.geqrf!
— Functiongeqrf!(A, tau)
Calcule la factorisation QR
de A
, A = QR
. tau
contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation. tau
doit avoir une longueur supérieure ou égale à la plus petite dimension de A
.
Renvoie A
et tau
modifiés sur place.
geqrf!(A) -> (A, tau)
Calcule la factorisation QR
de A
, A = QR
.
Renvoie A
, modifié sur place, et tau
, qui contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.geqp3!
— Functiongeqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
Calculez la factorisation QR
pivotée de A
, AP = QR
en utilisant BLAS niveau 3. P
est une matrice de pivotement, représentée par jpvt
. tau
stocke les réflecteurs élémentaires. Les arguments jpvt
et tau
sont optionnels et permettent de passer des tableaux préalloués. Lorsqu'ils sont passés, jpvt
doit avoir une longueur supérieure ou égale à n
si A
est une matrice (m x n)
et tau
doit avoir une longueur supérieure ou égale à la plus petite dimension de A
. À l'entrée, si jpvt[j]
n'est pas égal à zéro, alors la j
-ème colonne de A
est permutée au début de AP
.
A
, jpvt
et tau
sont modifiés sur place.
LinearAlgebra.LAPACK.gerqf!
— Functiongerqf!(A, tau)
Calcule la factorisation RQ
de A
, A = RQ
. tau
contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation. tau
doit avoir une longueur supérieure ou égale à la plus petite dimension de A
.
Renvoie A
et tau
modifiés sur place.
gerqf!(A) -> (A, tau)
Calcule la factorisation RQ
de A
, A = RQ
.
Renvoie A
, modifié sur place, et tau
, qui contient des scalaires qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.geqrt!
— Functiongeqrt!(A, T)
Calcule la factorisation QR
bloquée de A
, A = QR
. T
contient des réflecteurs de blocs triangulaires supérieurs qui paramètrent les réflecteurs élémentaires de la factorisation. La première dimension de T
définit la taille du bloc et doit être comprise entre 1 et n
. La deuxième dimension de T
doit être égale à la plus petite dimension de A
.
Renvoie A
et T
modifiés sur place.
geqrt!(A, nb) -> (A, T)
Calcule la factorisation QR
bloquée de A
, A = QR
. nb
définit la taille du bloc et doit être comprise entre 1 et n
, la deuxième dimension de A
.
Renvoie A
, modifié sur place, et T
, qui contient des réflecteurs de blocs triangulaires supérieurs qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.geqrt3!
— Functiongeqrt3!(A, T)
Calcule récursivement la factorisation QR
bloquée de A
, A = QR
. T
contient des réflecteurs de blocs triangulaires supérieurs qui paramètrent les réflecteurs élémentaires de la factorisation. La première dimension de T
définit la taille du bloc et doit être comprise entre 1 et n
. La deuxième dimension de T
doit être égale à la plus petite dimension de A
.
Renvoie A
et T
modifiés sur place.
geqrt3!(A) -> (A, T)
Calcule de manière récursive la factorisation QR
bloquée de A
, A = QR
.
Renvoie A
, modifié sur place, et T
, qui contient des réflecteurs de blocs triangulaires supérieurs qui paramètrent les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.getrf!
— Functiongetrf!(A, ipiv) -> (A, ipiv, info)
Calculez la factorisation LU
pivotée de A
, A = LU
. ipiv
contient les informations de pivotement et info
un code qui indique le succès (info = 0
), une valeur singulière dans U
(info = i
, dans ce cas U[i,i]
est singulier), ou un code d'erreur (info < 0
).
getrf!(A) -> (A, ipiv, info)
Calcule la factorisation LU
avec pivot de A
, A = LU
.
Renvoie A
, modifié sur place, ipiv
, les informations de pivotement, et un code info
qui indique le succès (info = 0
), une valeur singulière dans U
(info = i
, dans ce cas U[i,i]
est singulier), ou un code d'erreur (info < 0
).
LinearAlgebra.LAPACK.tzrzf!
— Functiontzrzf!(A) -> (A, tau)
Transforme la matrice trapézoïdale supérieure A
en forme triangulaire supérieure sur place. Renvoie A
et tau
, les paramètres scalaires pour les réflecteurs élémentaires de la transformation.
LinearAlgebra.LAPACK.ormrz!
— Functionormrz!(côté, trans, A, tau, C)
Multiplie la matrice C
par Q
à partir de la transformation fournie par tzrzf!
. Selon côté
ou trans
, la multiplication peut être à gauche (côté = L, Q*C
) ou à droite (côté = R, C*Q
) et Q
peut être non modifié (trans = N
), transposé (trans = T
), ou conjugué transposé (trans = C
). Renvoie la matrice C
qui est modifiée en place avec le résultat de la multiplication.
LinearAlgebra.LAPACK.gels!
— Functiongels!(trans, A, B) -> (F, B, ssr)
Résout l'équation linéaire A * X = B
, transpose(A) * X = B
, ou adjoint(A) * X = B
en utilisant une factorisation QR ou LQ. Modifie la matrice/vecteur B
sur place avec la solution. A
est écrasé avec sa factorisation QR
ou LQ
. trans
peut être l'un de N
(aucune modification), T
(transposée), ou C
(transposée conjuguée). gels!
recherche la solution de norme minimale/moins carrés. A
peut être sous ou sur déterminé. La solution est renvoyée dans B
.
LinearAlgebra.LAPACK.gesv!
— Functiongesv!(A, B) -> (B, A, ipiv)
Résout l'équation linéaire A * X = B
où A
est une matrice carrée utilisant la factorisation LU
de A
. A
est écrasé avec sa factorisation LU
et B
est écrasé avec la solution X
. ipiv
contient les informations de pivotage pour la factorisation LU
de A
.
LinearAlgebra.LAPACK.getrs!
— Functiongetrs!(trans, A, ipiv, B)
Résout l'équation linéaire A * X = B
, transpose(A) * X = B
, ou adjoint(A) * X = B
pour une matrice carrée A
. Modifie la matrice/vecteur B
sur place avec la solution. A
est la factorisation LU
provenant de getrf!
, avec ipiv
les informations de pivotement. trans
peut être l'un de N
(aucune modification), T
(transposée), ou C
(transposée conjuguée).
LinearAlgebra.LAPACK.getri!
— Functiongetri!(A, ipiv)
Calcule l'inverse de A
, en utilisant sa factorisation LU
trouvée par getrf!
. ipiv
est l'information de pivot sortie et A
contient la factorisation LU
de getrf!
. A
est écrasé avec son inverse.
LinearAlgebra.LAPACK.gesvx!
— Functiongesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)
Résout l'équation linéaire A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), ou adjoint(A) * X = B
(trans = C
) en utilisant la factorisation LU
de A
. fact
peut être E
, auquel cas A
sera équilibré et copié dans AF
; F
, auquel cas AF
et ipiv
d'une factorisation LU
précédente sont des entrées ; ou N
, auquel cas A
sera copié dans AF
puis factorisé. Si fact = F
, equed
peut être N
, signifiant que A
n'a pas été équilibré ; R
, signifiant que A
a été multiplié par Diagonal(R)
par la gauche ; C
, signifiant que A
a été multiplié par Diagonal(C)
par la droite ; ou B
, signifiant que A
a été multiplié par Diagonal(R)
par la gauche et Diagonal(C)
par la droite. Si fact = F
et equed = R
ou B
, les éléments de R
doivent tous être positifs. Si fact = F
et equed = C
ou B
, les éléments de C
doivent tous être positifs.
Retourne la solution X
; equed
, qui est une sortie si fact
n'est pas N
, et décrit l'équilibrage qui a été effectué ; R
, le diagonal d'équilibrage des lignes ; C
, le diagonal d'équilibrage des colonnes ; B
, qui peut être écrasé par sa forme équilibrée Diagonal(R)*B
(si trans = N
et equed = R,B
) ou Diagonal(C)*B
(si trans = T,C
et equed = C,B
) ; rcond
, le nombre de condition réciproque de A
après équilibrage ; ferr
, la limite d'erreur directe pour chaque vecteur de solution dans X
; berr
, la limite d'erreur directe pour chaque vecteur de solution dans X
; et work
, le facteur de croissance de pivot réciproque.
gesvx!(A, B)
La simplification sans équilibrage et sans transposition de gesvx!
.
LinearAlgebra.LAPACK.gelsd!
— Functiongelsd!(A, B, rcond) -> (B, rnk)
Calcule la solution de norme minimale de A * X = B
en trouvant la factorisation SVD
de A
, puis en divisant et conquérant le problème. B
est écrasé avec la solution X
. Les valeurs singulières inférieures à rcond
seront considérées comme nulles. Renvoie la solution dans B
et le rang effectif de A
dans rnk
.
LinearAlgebra.LAPACK.gelsy!
— Functiongelsy!(A, B, rcond) -> (B, rnk)
Calcule la solution de norme minimale de A * X = B
en trouvant la factorisation complète QR
de A
, puis en divisant et conquérant le problème. B
est écrasé avec la solution X
. Les valeurs singulières inférieures à rcond
seront traitées comme zéro. Renvoie la solution dans B
et le rang effectif de A
dans rnk
.
LinearAlgebra.LAPACK.gglse!
— Functiongglse!(A, c, B, d) -> (X,res)
Résout l'équation A * x = c
où x
est soumis à la contrainte d'égalité B * x = d
. Utilise la formule ||c - A*x||^2 = 0
pour résoudre. Renvoie X
et la somme des carrés résiduels.
LinearAlgebra.LAPACK.geev!
— Functiongeev!(jobvl, jobvr, A) -> (W, VL, VR)
Trouve le système d'autovalues de A
. Si jobvl = N
, les autovecteurs à gauche de A
ne sont pas calculés. Si jobvr = N
, les autovecteurs à droite de A
ne sont pas calculés. Si jobvl = V
ou jobvr = V
, les autovecteurs correspondants sont calculés. Renvoie les autovalues dans W
, les autovecteurs à droite dans VR
, et les autovecteurs à gauche dans VL
.
LinearAlgebra.LAPACK.gesdd!
— Functiongesdd!(job, A) -> (U, S, VT)
Trouve la décomposition en valeurs singulières de A
, A = U * S * V'
, en utilisant une approche de diviser pour régner. Si job = A
, toutes les colonnes de U
et les lignes de V'
sont calculées. Si job = N
, aucune colonne de U
ou ligne de V'
n'est calculée. Si job = O
, A
est écrasé avec les colonnes de (mince) U
et les lignes de (mince) V'
. Si job = S
, les colonnes de (mince) U
et les lignes de (mince) V'
sont calculées et retournées séparément.
LinearAlgebra.LAPACK.gesvd!
— Functiongesvd!(jobu, jobvt, A) -> (U, S, VT)
Trouve la décomposition en valeurs singulières de A
, A = U * S * V'
. Si jobu = A
, toutes les colonnes de U
sont calculées. Si jobvt = A
, toutes les lignes de V'
sont calculées. Si jobu = N
, aucune colonne de U
n'est calculée. Si jobvt = N
, aucune ligne de V'
n'est calculée. Si jobu = O
, A
est écrasé avec les colonnes de (mince) U
. Si jobvt = O
, A
est écrasé avec les lignes de (mince) V'
. Si jobu = S
, les colonnes de (mince) U
sont calculées et retournées séparément. Si jobvt = S
, les lignes de (mince) V'
sont calculées et retournées séparément. jobu
et jobvt
ne peuvent pas être tous deux O
.
Retourne U
, S
, et Vt
, où S
sont les valeurs singulières de A
.
LinearAlgebra.LAPACK.ggsvd!
— Functionggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Trouve la décomposition en valeurs singulières généralisées de A
et B
, U'*A*Q = D1*R
et V'*B*Q = D2*R
. D1
a alpha
sur sa diagonale et D2
a beta
sur sa diagonale. Si jobu = U
, la matrice orthogonale/unitaire U
est calculée. Si jobv = V
, la matrice orthogonale/unitaire V
est calculée. Si jobq = Q
, la matrice orthogonale/unitaire Q
est calculée. Si jobu
, jobv
ou jobq
est N
, cette matrice n'est pas calculée. Cette fonction n'est disponible que dans les versions de LAPACK antérieures à 3.6.0.
LinearAlgebra.LAPACK.ggsvd3!
— Functionggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Trouve la décomposition en valeurs singulières généralisées de A
et B
, U'*A*Q = D1*R
et V'*B*Q = D2*R
. D1
a alpha
sur sa diagonale et D2
a beta
sur sa diagonale. Si jobu = U
, la matrice orthogonale/unitaire U
est calculée. Si jobv = V
, la matrice orthogonale/unitaire V
est calculée. Si jobq = Q
, la matrice orthogonale/unitaire Q
est calculée. Si jobu
, jobv
ou jobq
est N
, cette matrice n'est pas calculée. Cette fonction nécessite LAPACK 3.6.0.
LinearAlgebra.LAPACK.geevx!
— Functiongeevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
Trouve le système d'eigen de A
avec équilibrage de matrice. Si jobvl = N
, les vecteurs propres à gauche de A
ne sont pas calculés. Si jobvr = N
, les vecteurs propres à droite de A
ne sont pas calculés. Si jobvl = V
ou jobvr = V
, les vecteurs propres correspondants sont calculés. Si balanc = N
, aucun équilibrage n'est effectué. Si balanc = P
, A
est permuté mais pas mis à l'échelle. Si balanc = S
, A
est mis à l'échelle mais pas permuté. Si balanc = B
, A
est permuté et mis à l'échelle. Si sense = N
, aucun nombre de condition réciproque n'est calculé. Si sense = E
, des nombres de condition réciproque sont calculés uniquement pour les valeurs propres. Si sense = V
, des nombres de condition réciproque sont calculés uniquement pour les vecteurs propres à droite. Si sense = B
, des nombres de condition réciproque sont calculés pour les vecteurs propres à droite et les vecteurs propres. Si sense = E,B
, les vecteurs propres à droite et à gauche doivent être calculés.
LinearAlgebra.LAPACK.ggev!
— Functionggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Trouve la décomposition des valeurs propres généralisées de A
et B
. Si jobvl = N
, les vecteurs propres à gauche ne sont pas calculés. Si jobvr = N
, les vecteurs propres à droite ne sont pas calculés. Si jobvl = V
ou jobvr = V
, les vecteurs propres correspondants sont calculés.
LinearAlgebra.LAPACK.ggev3!
— Functionggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Trouve la décomposition des valeurs propres généralisées de A
et B
en utilisant un algorithme bloqué. Si jobvl = N
, les vecteurs propres à gauche ne sont pas calculés. Si jobvr = N
, les vecteurs propres à droite ne sont pas calculés. Si jobvl = V
ou jobvr = V
, les vecteurs propres correspondants sont calculés. Cette fonction nécessite LAPACK 3.6.0.
LinearAlgebra.LAPACK.gtsv!
— Functiongtsv!(dl, d, du, B)
Résout l'équation A * X = B
où A
est une matrice tridiagonale avec dl
sur la sous-diagonale, d
sur la diagonale, et du
sur la super-diagonale.
Écrase B
avec la solution X
et la retourne.
LinearAlgebra.LAPACK.gttrf!
— Functiongttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
Trouve la factorisation LU
d'une matrice tridiagonale avec dl
sur la sous-diagonale, d
sur la diagonale, et du
sur la superdiagonale.
Modifie dl
, d
, et du
sur place et les retourne ainsi que la deuxième superdiagonale du2
et le vecteur de pivotage ipiv
.
LinearAlgebra.LAPACK.gttrs!
— Functiongttrs!(trans, dl, d, du, du2, ipiv, B)
Résout l'équation A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), ou adjoint(A) * X = B
(trans = C
) en utilisant la factorisation LU
calculée par gttrf!
. B
est écrasé avec la solution X
.
LinearAlgebra.LAPACK.orglq!
— Functionorglq!(A, tau, k = length(tau))
Trouve explicitement la matrice Q
d'une factorisation LQ
après avoir appelé gelqf!
sur A
. Utilise la sortie de gelqf!
. A
est écrasé par Q
.
LinearAlgebra.LAPACK.orgqr!
— Functionorgqr!(A, tau, k = length(tau))
Trouve explicitement la matrice Q
d'une factorisation QR
après avoir appelé geqrf!
sur A
. Utilise la sortie de geqrf!
. A
est écrasé par Q
.
LinearAlgebra.LAPACK.orgql!
— Functionorgql!(A, tau, k = length(tau))
Trouve explicitement la matrice Q
d'une factorisation QL
après avoir appelé geqlf!
sur A
. Utilise la sortie de geqlf!
. A
est écrasé par Q
.
LinearAlgebra.LAPACK.orgrq!
— Functionorgrq!(A, tau, k = length(tau))
Trouve explicitement la matrice Q
d'une factorisation RQ
après avoir appelé gerqf!
sur A
. Utilise la sortie de gerqf!
. A
est écrasé par Q
.
LinearAlgebra.LAPACK.ormlq!
— Functionormlq!(côté, trans, A, tau, C)
Calcule Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) pour côté = L
ou la multiplication équivalente à droite pour côté = R
en utilisant Q
d'une factorisation LQ
de A
calculée à l'aide de gelqf!
. C
est écrasé.
LinearAlgebra.LAPACK.ormqr!
— Functionormqr!(côté, trans, A, tau, C)
Calcule Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) pour côté = L
ou la multiplication équivalente à droite pour côté = R
en utilisant Q
d'une factorisation QR
de A
calculée à l'aide de geqrf!
. C
est écrasé.
LinearAlgebra.LAPACK.ormql!
— Functionormql!(side, trans, A, tau, C)
Calcule Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) pour side = L
ou la multiplication équivalente à droite pour side = R
en utilisant Q
d'une factorisation QL
de A
calculée à l'aide de geqlf!
. C
est écrasé.
LinearAlgebra.LAPACK.ormrq!
— Functionormrq!(côté, trans, A, tau, C)
Calcule Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) pour côté = L
ou la multiplication équivalente à droite pour côté = R
en utilisant Q
d'une factorisation RQ
de A
calculée à l'aide de gerqf!
. C
est écrasé.
LinearAlgebra.LAPACK.gemqrt!
— Functiongemqrt!(côté, trans, V, T, C)
Calcule Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) pour côté = L
ou la multiplication équivalente à droite pour côté = R
en utilisant Q
d'une factorisation QR
de A
calculée à l'aide de geqrt!
. C
est écrasé.
LinearAlgebra.LAPACK.posv!
— Functionposv!(uplo, A, B) -> (A, B)
Trouve la solution de A * X = B
où A
est une matrice symétrique ou hermitienne définie positive. Si uplo = U
, la décomposition de Cholesky supérieure de A
est calculée. Si uplo = L
, la décomposition de Cholesky inférieure de A
est calculée. A
est écrasée par sa décomposition de Cholesky. B
est écrasé avec la solution X
.
LinearAlgebra.LAPACK.potrf!
— Functionpotrf!(uplo, A)
Calcule la décomposition de Cholesky (supérieure si uplo = U
, inférieure si uplo = L
) de la matrice définie positive A
. A
est écrasée et renvoyée avec un code d'information.
LinearAlgebra.LAPACK.potri!
— Functionpotri!(uplo, A)
Calcule l'inverse de la matrice définie positive A
après avoir appelé potrf!
pour trouver sa décomposition de Cholesky (supérieure si uplo = U
, inférieure si uplo = L
).
A
est écrasée par son inverse et retournée.
LinearAlgebra.LAPACK.potrs!
— Functionpotrs!(uplo, A, B)
Trouve la solution de A * X = B
où A
est une matrice symétrique ou hermitienne définie positive dont la décomposition de Cholesky a été calculée par potrf!
. Si uplo = U
, la décomposition de Cholesky supérieure de A
a été calculée. Si uplo = L
, la décomposition de Cholesky inférieure de A
a été calculée. B
est écrasé avec la solution X
.
LinearAlgebra.LAPACK.pstrf!
— Functionpstrf!(uplo, A, tol) -> (A, piv, rank, info)
Calcule la décomposition de Cholesky pivotée (supérieure si uplo = U
, inférieure si uplo = L
) de la matrice définie positive A
avec une tolérance définie par l'utilisateur tol
. A
est écrasée par sa décomposition de Cholesky.
Renvoie A
, les pivots piv
, le rang de A
, et un code info
. Si info = 0
, la factorisation a réussi. Si info = i > 0
, alors A
est indéfinie ou déficiente en rang.
LinearAlgebra.LAPACK.ptsv!
— Functionptsv!(D, E, B)
Résout A * X = B
pour A
tridiagonale définie positive. D
est la diagonale de A
et E
est l'off-diagonale. B
est écrasé avec la solution X
et retourné.
LinearAlgebra.LAPACK.pttrf!
— Functionpttrf!(D, E)
Calcule la factorisation LDLt d'une matrice tridiagonale définie positive avec D
comme diagonale et E
comme hors-diagonale. D
et E
sont écrasés et retournés.
LinearAlgebra.LAPACK.pttrs!
— Functionpttrs!(D, E, B)
Résout A * X = B
pour A
tridiagonale définie positive avec la diagonale D
et les éléments hors diagonale E
après avoir calculé la factorisation LDLt de A
en utilisant pttrf!
. B
est écrasé avec la solution X
.
LinearAlgebra.LAPACK.trtri!
— Functiontrtri!(uplo, diag, A)
Trouve l'inverse de la matrice triangulaire A
(supérieure si uplo = U
, inférieure si uplo = L
). Si diag = N
, A
a des éléments diagonaux non unitaires. Si diag = U
, tous les éléments diagonaux de A
sont un. A
est écrasé avec son inverse.
LinearAlgebra.LAPACK.trtrs!
— Functiontrtrs!(uplo, trans, diag, A, B)
Résout A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), ou adjoint(A) * X = B
(trans = C
) pour la matrice triangulaire A
(supérieure si uplo = U
, inférieure si uplo = L
). Si diag = N
, A
a des éléments diagonaux non unitaires. Si diag = U
, tous les éléments diagonaux de A
sont un. B
est écrasé avec la solution X
.
LinearAlgebra.LAPACK.trcon!
— Functiontrcon!(norm, uplo, diag, A)
Trouve le nombre de condition réciproque de la matrice triangulaire A
(supérieure si uplo = U
, inférieure si uplo = L
). Si diag = N
, A
a des éléments diagonaux non unitaires. Si diag = U
, tous les éléments diagonaux de A
sont un. Si norm = I
, le nombre de condition est trouvé dans la norme infinie. Si norm = O
ou 1
, le nombre de condition est trouvé dans la norme un.
LinearAlgebra.LAPACK.trevc!
— Functiontrevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))
Trouve le système d'eigen de la matrice triangulaire supérieure T
. Si side = R
, les vecteurs propres droits sont calculés. Si side = L
, les vecteurs propres gauches sont calculés. Si side = B
, les deux ensembles sont calculés. Si howmny = A
, tous les vecteurs propres sont trouvés. Si howmny = B
, tous les vecteurs propres sont trouvés et rétrotransformés en utilisant VL
et VR
. Si howmny = S
, seuls les vecteurs propres correspondant aux valeurs dans select
sont calculés.
LinearAlgebra.LAPACK.trrfs!
— Functiontrrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)
Estime l'erreur dans la solution de A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), adjoint(A) * X = B
(trans = C
) pour side = L
, ou les équations équivalentes d'un side = R
X * A
après avoir calculé X
en utilisant trtrs!
. Si uplo = U
, A
est triangulaire supérieure. Si uplo = L
, A
est triangulaire inférieure. Si diag = N
, A
a des éléments diagonaux non unitaires. Si diag = U
, tous les éléments diagonaux de A
sont un. Ferr
et Berr
sont des entrées optionnelles. Ferr
est l'erreur avant et Berr
est l'erreur arrière, chacune composante par composante.
LinearAlgebra.LAPACK.stev!
— Functionstev!(job, dv, ev) -> (dv, Zmat)
Calcule le système d'autovalues pour une matrice tridiagonale symétrique avec dv
comme diagonale et ev
comme hors-diagonale. Si job = N
, seuls les autovalues sont trouvés et retournés dans dv
. Si job = V
, alors les vecteurs propres sont également trouvés et retournés dans Zmat
.
LinearAlgebra.LAPACK.stebz!
— Functionstebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)
Calcule les valeurs propres pour une matrice tridiagonale symétrique avec dv
comme diagonale et ev
comme hors-diagonale. Si range = A
, toutes les valeurs propres sont trouvées. Si range = V
, les valeurs propres dans l'intervalle semi-ouvert (vl, vu]
sont trouvées. Si range = I
, les valeurs propres avec des indices entre il
et iu
sont trouvées. Si order = B
, les valeurs propres sont ordonnées dans un bloc. Si order = E
, elles sont ordonnées à travers tous les blocs. abstol
peut être défini comme une tolérance pour la convergence.
LinearAlgebra.LAPACK.stegr!
— Functionstegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)
Calcule les valeurs propres (jobz = N
) ou les valeurs propres et les vecteurs propres (jobz = V
) pour une matrice tridiagonale symétrique avec dv
comme diagonale et ev
comme hors-diagonale. Si range = A
, toutes les valeurs propres sont trouvées. Si range = V
, les valeurs propres dans l'intervalle semi-ouvert (vl, vu]
sont trouvées. Si range = I
, les valeurs propres avec des indices entre il
et iu
sont trouvées. Les valeurs propres sont retournées dans w
et les vecteurs propres dans Z
.
LinearAlgebra.LAPACK.stein!
— Functionstein!(dv, ev_in, w_in, iblock_in, isplit_in)
Calcule les vecteurs propres pour une matrice tridiagonale symétrique avec dv
comme diagonale et ev_in
comme hors-diagonale. w_in
spécifie les valeurs propres d'entrée pour lesquelles trouver les vecteurs propres correspondants. iblock_in
spécifie les sous-matrices correspondant aux valeurs propres dans w_in
. isplit_in
spécifie les points de séparation entre les blocs de sous-matrices.
LinearAlgebra.LAPACK.syconv!
— Functionsyconv!(uplo, A, ipiv) -> (A, work)
Convertit une matrice symétrique A
(qui a été factorisée en une matrice triangulaire) en deux matrices L
et D
. Si uplo = U
, A
est triangulaire supérieure. Si uplo = L
, elle est triangulaire inférieure. ipiv
est le vecteur de pivot de la factorisation triangulaire. A
est écrasée par L
et D
.
LinearAlgebra.LAPACK.sysv!
— Functionsysv!(uplo, A, B) -> (B, A, ipiv)
Trouve la solution de A * X = B
pour la matrice symétrique A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. B
est écrasé par la solution X
. A
est écrasé par sa factorisation de Bunch-Kaufman. ipiv
contient des informations de pivotage sur la factorisation.
LinearAlgebra.LAPACK.sytrf!
— Functionsytrf!(uplo, A) -> (A, ipiv, info)
Calcule la factorisation de Bunch-Kaufman d'une matrice symétrique A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée.
Renvoie A
, écrasée par la factorisation, un vecteur de pivots ipiv
, et le code d'erreur info
qui est un entier non négatif. Si info
est positif, la matrice est singulière et la partie diagonale de la factorisation est exactement zéro à la position info
.
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)
Calcule la factorisation de Bunch-Kaufman d'une matrice symétrique A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée.
Renvoie A
, écrasée par la factorisation, le vecteur de pivot ipiv
, et le code d'erreur info
qui est un entier non négatif. Si info
est positif, la matrice est singulière et la partie diagonale de la factorisation est exactement zéro à la position info
.
LinearAlgebra.LAPACK.sytri!
— Functionsytri!(uplo, A, ipiv)
Calcule l'inverse d'une matrice symétrique A
en utilisant les résultats de sytrf!
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. A
est écrasée par son inverse.
LinearAlgebra.LAPACK.sytrs!
— Functionsytrs!(uplo, A, ipiv, B)
Résout l'équation A * X = B
pour une matrice symétrique A
en utilisant les résultats de sytrf!
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. B
est écrasé par la solution X
.
LinearAlgebra.LAPACK.hesv!
— Functionhesv!(uplo, A, B) -> (B, A, ipiv)
Trouve la solution de A * X = B
pour la matrice hermitienne A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. B
est écrasé par la solution X
. A
est écrasé par sa factorisation de Bunch-Kaufman. ipiv
contient des informations de pivotage sur la factorisation.
LinearAlgebra.LAPACK.hetrf!
— Functionhetrf!(uplo, A) -> (A, ipiv, info)
Calcule la factorisation de Bunch-Kaufman d'une matrice hermitienne A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée.
Renvoie A
, écrasée par la factorisation, un vecteur de pivots ipiv
, et le code d'erreur info
qui est un entier non négatif. Si info
est positif, la matrice est singulière et la partie diagonale de la factorisation est exactement zéro à la position info
.
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)
Calcule la factorisation de Bunch-Kaufman d'une matrice hermitienne A
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée.
Renvoie A
, écrasée par la factorisation, le vecteur de pivot ipiv
, et le code d'erreur info
qui est un entier non négatif. Si info
est positif, la matrice est singulière et la partie diagonale de la factorisation est exactement zéro à la position info
.
LinearAlgebra.LAPACK.hetri!
— Functionhetri!(uplo, A, ipiv)
Calcule l'inverse d'une matrice hermitienne A
en utilisant les résultats de sytrf!
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. A
est écrasée par son inverse.
LinearAlgebra.LAPACK.hetrs!
— Functionhetrs!(uplo, A, ipiv, B)
Résout l'équation A * X = B
pour une matrice hermitienne A
en utilisant les résultats de sytrf!
. Si uplo = U
, la moitié supérieure de A
est stockée. Si uplo = L
, la moitié inférieure est stockée. B
est écrasé par la solution X
.
LinearAlgebra.LAPACK.syev!
— Functionsyev!(jobz, uplo, A)
Trouve les valeurs propres (jobz = N
) ou les valeurs propres et les vecteurs propres (jobz = V
) d'une matrice symétrique A
. Si uplo = U
, le triangle supérieur de A
est utilisé. Si uplo = L
, le triangle inférieur de A
est utilisé.
LinearAlgebra.LAPACK.syevr!
— Functionsyevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)
Trouve les valeurs propres (jobz = N
) ou les valeurs propres et les vecteurs propres (jobz = V
) d'une matrice symétrique A
. Si uplo = U
, le triangle supérieur de A
est utilisé. Si uplo = L
, le triangle inférieur de A
est utilisé. Si range = A
, toutes les valeurs propres sont trouvées. Si range = V
, les valeurs propres dans l'intervalle semi-ouvert (vl, vu]
sont trouvées. Si range = I
, les valeurs propres avec des indices entre il
et iu
sont trouvées. abstol
peut être défini comme une tolérance pour la convergence.
Les valeurs propres sont retournées dans W
et les vecteurs propres dans Z
.
LinearAlgebra.LAPACK.syevd!
— Functionsyevd!(jobz, uplo, A)
Trouve les valeurs propres (jobz = N
) ou les valeurs propres et les vecteurs propres (jobz = V
) d'une matrice symétrique A
. Si uplo = U
, le triangle supérieur de A
est utilisé. Si uplo = L
, le triangle inférieur de A
est utilisé.
Utilise la méthode de diviser pour régner, au lieu de l'itération QR utilisée par syev!
ou des représentations relativement robustes multiples utilisées par syevr!
. Voir James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008) pour une comparaison de la précision et des performances des différentes méthodes.
LinearAlgebra.LAPACK.sygvd!
— Functionsygvd!(itype, jobz, uplo, A, B) -> (w, A, B)
Trouve les valeurs propres généralisées (jobz = N
) ou les valeurs propres et vecteurs propres (jobz = V
) d'une matrice symétrique A
et d'une matrice symétrique définie positive B
. Si uplo = U
, les triangles supérieurs de A
et B
sont utilisés. Si uplo = L
, les triangles inférieurs de A
et B
sont utilisés. Si itype = 1
, le problème à résoudre est A * x = lambda * B * x
. Si itype = 2
, le problème à résoudre est A * B * x = lambda * x
. Si itype = 3
, le problème à résoudre est B * A * x = lambda * x
.
LinearAlgebra.LAPACK.bdsqr!
— Functionbdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)
Calcule la décomposition en valeurs singulières d'une matrice bidiagonale avec d
sur la diagonale et e_
sur l'off-diagonale. Si uplo = U
, e_
est la superdiagonale. Si uplo = L
, e_
est la sous-diagonale. Peut également calculer en option le produit Q' * C
.
Renvoie les valeurs singulières dans d
, et la matrice C
écrasée avec Q' * C
.
LinearAlgebra.LAPACK.bdsdc!
— Functionbdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)
Calcule la décomposition en valeurs singulières d'une matrice bidiagonale avec d
sur la diagonale et e_
sur l'off-diagonale en utilisant une méthode de division et conquête. Si uplo = U
, e_
est la superdiagonale. Si uplo = L
, e_
est la sous-diagonale. Si compq = N
, seules les valeurs singulières sont trouvées. Si compq = I
, les valeurs et vecteurs singuliers sont trouvés. Si compq = P
, les valeurs et vecteurs singuliers sont trouvés sous forme compacte. Fonctionne uniquement pour les types réels.
Renvoie les valeurs singulières dans d
, et si compq = P
, les vecteurs singuliers compacts dans iq
.
LinearAlgebra.LAPACK.gecon!
— Functiongecon!(normtype, A, anorm)
Trouve le nombre de condition réciproque de la matrice A
. Si normtype = I
, le nombre de condition est trouvé dans la norme infinie. Si normtype = O
ou 1
, le nombre de condition est trouvé dans la norme un. A
doit être le résultat de getrf!
et anorm
est la norme de A
dans la norme pertinente.
LinearAlgebra.LAPACK.gehrd!
— Functiongehrd!(ilo, ihi, A) -> (A, tau)
Convertit une matrice A
en forme de Hessenberg. Si A
est équilibrée avec gebal!
, alors ilo
et ihi
sont les sorties de gebal!
. Sinon, ils doivent être ilo = 1
et ihi = size(A,2)
. tau
contient les réflecteurs élémentaires de la factorisation.
LinearAlgebra.LAPACK.orghr!
— Functionorghr!(ilo, ihi, A, tau)
Trouve explicitement Q
, la matrice orthogonale/unitaire de gehrd!
. ilo
, ihi
, A
et tau
doivent correspondre à l'entrée/sortie de gehrd!
.
LinearAlgebra.LAPACK.gees!
— Functiongees!(jobvs, A) -> (A, vs, w)
Calcule les valeurs propres (jobvs = N
) ou les valeurs propres et les vecteurs de Schur (jobvs = V
) de la matrice A
. A
est écrasée par sa forme de Schur.
Renvoie A
, vs
contenant les vecteurs de Schur, et w
, contenant les valeurs propres.
LinearAlgebra.LAPACK.gges!
— Functiongges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Calcule les valeurs propres généralisées, la forme de Schur généralisée, les vecteurs de Schur à gauche (jobsvl = V
), ou les vecteurs de Schur à droite (jobvsr = V
) de A
et B
.
Les valeurs propres généralisées sont retournées dans alpha
et beta
. Les vecteurs de Schur à gauche sont retournés dans vsl
et les vecteurs de Schur à droite sont retournés dans vsr
.
LinearAlgebra.LAPACK.gges3!
— Functiongges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Calcule les valeurs propres généralisées, la forme de Schur généralisée, les vecteurs de Schur à gauche (jobsvl = V
), ou les vecteurs de Schur à droite (jobvsr = V
) de A
et B
en utilisant un algorithme bloqué. Cette fonction nécessite LAPACK 3.6.0.
Les valeurs propres généralisées sont retournées dans alpha
et beta
. Les vecteurs de Schur à gauche sont retournés dans vsl
et les vecteurs de Schur à droite sont retournés dans vsr
.
LinearAlgebra.LAPACK.trexc!
— Functiontrexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)
Réorganiser la factorisation de Schur T
d'une matrice, de sorte que le bloc diagonal de T
avec l'indice de ligne ifst
soit déplacé à l'indice de ligne ilst
. Si compq = V
, les vecteurs de Schur Q
sont réordonnés. Si compq = N
, ils ne sont pas modifiés. La méthode à 4 arguments appelle la méthode à 5 arguments avec compq = V
.
LinearAlgebra.LAPACK.trsen!
— Functiontrsen!(job, compq, select, T, Q) -> (T, Q, w, s, sep)
trsen!(select, T, Q) -> (T, Q, w, s, sep)
Réorganise la factorisation de Schur d'une matrice et trouve éventuellement des nombres de condition réciproques. Si job = N
, aucun nombre de condition n'est trouvé. Si job = E
, seul le nombre de condition pour ce groupe de valeurs propres est trouvé. Si job = V
, seul le nombre de condition pour l'espace invariant est trouvé. Si job = B
, alors les nombres de condition pour le groupe et l'espace sont trouvés. Si compq = V
, les vecteurs de Schur Q
sont mis à jour. Si compq = N
, les vecteurs de Schur ne sont pas modifiés. select
détermine quelles valeurs propres sont dans le groupe. La méthode à 3 arguments appelle la méthode à 5 arguments avec job = N
et compq = V
.
Retourne T
, Q
, les valeurs propres réordonnées dans w
, le nombre de condition du groupe de valeurs propres s
, et le nombre de condition de l'espace invariant sep
.
LinearAlgebra.LAPACK.tgsen!
— Functiontgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
Réorganise les vecteurs d'une décomposition de Schur généralisée. select
spécifie les valeurs propres dans chaque cluster.
LinearAlgebra.LAPACK.trsyl!
— Functiontrsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)
Résout l'équation matricielle de Sylvester A * X +/- X * B = scale*C
où A
et B
sont tous deux quasi-triangulaires supérieurs. Si transa = N
, A
n'est pas modifié. Si transa = T
, A
est transposé. Si transa = C
, A
est conjugué transposé. De même pour transb
et B
. Si isgn = 1
, l'équation A * X + X * B = scale * C
est résolue. Si isgn = -1
, l'équation A * X - X * B = scale * C
est résolue.
Renvoie X
(écrasant C
) et scale
.
LinearAlgebra.LAPACK.hseqr!
— Functionhseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
Calcule toutes les valeurs propres et (optionnellement) la factorisation de Schur d'une matrice réduite à la forme de Hessenberg. Si H
est équilibré avec gebal!
, alors ilo
et ihi
sont les sorties de gebal!
. Sinon, ils doivent être ilo = 1
et ihi = size(H,2)
. tau
contient les réflecteurs élémentaires de la factorisation.
- 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 et C Van Loan, "La représentation WY pour les produits de matrices de Householder", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber et C Van Loan, "Une représentation WY efficace en termes de stockage pour les produits de transformations de Householder", 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 et 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 et 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 et Nicholas J. Higham, "Amélioration des algorithmes d'inversion par mise à l'échelle et de mise à l'échelle pour le logarithme matriciel", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham et Samuel D. Relton, "Calcul du dérivé de Fréchet du logarithme matriciel et estimation du nombre de condition", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck et 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 et Nicholas J. Higham, "Fonctions trigonométriques inverses de matrice et fonctions hyperboliques inverses : théorie et algorithmes", MIMS EPrint : 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Mary Aprahamian et Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Mary Aprahamian et Nicholas J. Higham, "Fonctions trigonométriques inverses de matrice et fonctions hyperboliques inverses : théorie et algorithmes", MIMS EPrint : 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Mary Aprahamian et Nicholas J. Higham, "Fonctions trigonométriques inverses de matrice et fonctions hyperboliques inverses : théorie et algorithmes", MIMS EPrint : 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Mary Aprahamian et Nicholas J. Higham, "Fonctions trigonométriques inverses de matrice et fonctions hyperboliques inverses : théorie et algorithmes", MIMS EPrint : 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Mary Aprahamian et Nicholas J. Higham, "Fonctions trigonométriques inverses de matrice et fonctions hyperboliques inverses : théorie et algorithmes", MIMS EPrint : 2016.4. https://doi.org/10.1137/16M1057577