Sparse Arrays

Julia a un support pour les vecteurs creux et sparse matrices dans le module standard SparseArrays. Les tableaux creux sont des tableaux qui contiennent suffisamment de zéros pour que les stocker dans une structure de données spéciale entraîne des économies d'espace et de temps d'exécution, par rapport aux tableaux denses.

Des packages externes qui implémentent différents types de stockage sparse, des tableaux sparse multidimensionnels, et plus encore peuvent être trouvés dans Noteworthy External Sparse Packages

Compressed Sparse Column (CSC) Sparse Matrix Storage

En Julia, les matrices creuses sont stockées dans le Compressed Sparse Column (CSC) format. Les matrices creuses Julia ont le type SparseMatrixCSC{Tv,Ti}, où Tv est le type des valeurs stockées, et Ti est le type entier pour stocker les pointeurs de colonne et les indices de ligne. La représentation interne de SparseMatrixCSC est la suivante :

struct SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}
    m::Int                  # Number of rows
    n::Int                  # Number of columns
    colptr::Vector{Ti}      # Column j is in colptr[j]:(colptr[j+1]-1)
    rowval::Vector{Ti}      # Row indices of stored values
    nzval::Vector{Tv}       # Stored values, typically nonzeros
end

Le stockage en colonne éparse compressé facilite et accélère l'accès aux éléments de la colonne d'une matrice éparse, tandis que l'accès à la matrice éparse par lignes est considérablement plus lent. Des opérations telles que l'insertion d'entrées précédemment non stockées une à une dans la structure CSC tendent à être lentes. Cela est dû au fait que tous les éléments de la matrice éparse qui se trouvent au-delà du point d'insertion doivent être déplacés d'une place.

Toutes les opérations sur les matrices creuses sont soigneusement mises en œuvre pour tirer parti de la structure de données CSC pour des performances optimales et éviter des opérations coûteuses.

Si vous avez des données au format CSC provenant d'une autre application ou bibliothèque, et que vous souhaitez les importer dans Julia, assurez-vous d'utiliser un indexage basé sur 1. Les indices de ligne dans chaque colonne doivent être triés, et s'ils ne le sont pas, la matrice s'affichera incorrectement. Si votre objet SparseMatrixCSC contient des indices de ligne non triés, une façon rapide de les trier est de faire une double transposition. Étant donné que l'opération de transposition est paresseuse, faites une copie pour matérialiser chaque transposition.

Dans certaines applications, il est pratique de stocker des valeurs zéro explicites dans un SparseMatrixCSC. Celles-ci sont acceptées par les fonctions de Base (mais il n'y a aucune garantie qu'elles seront préservées lors des opérations de mutation). Ces zéros stockés explicitement sont traités comme des non-zéros structurels par de nombreuses routines. La fonction nnz renvoie le nombre d'éléments stockés explicitement dans la structure de données sparse, y compris les zéros non structurels. Pour compter le nombre exact de non-zéros numériques, utilisez count(!iszero, x), qui inspecte chaque élément stocké d'une matrice sparse. dropzeros, et le dropzeros! en place, peuvent être utilisés pour supprimer les zéros stockés de la matrice sparse.

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

julia> dropzeros(A)
3×3 SparseMatrixCSC{Int64, Int64} with 2 stored entries:
 ⋅  ⋅  1
 ⋅  2  ⋅
 ⋅  ⋅  ⋅

Sparse Vector Storage

Les vecteurs creux sont stockés dans un analogue proche du format de colonne creuse compressée pour les matrices creuses. En Julia, les vecteurs creux ont le type SparseVector{Tv,Ti}Tv est le type des valeurs stockées et Ti le type entier pour les indices. La représentation interne est la suivante :

struct SparseVector{Tv,Ti<:Integer} <: AbstractSparseVector{Tv,Ti}
    n::Int              # Length of the sparse vector
    nzind::Vector{Ti}   # Indices of stored values
    nzval::Vector{Tv}   # Stored values, typically nonzeros
end

En ce qui concerne SparseMatrixCSC, le type SparseVector peut également contenir des zéros stockés explicitement. (Voir Sparse Matrix Storage.)

Sparse Vector and Matrix Constructors

La manière la plus simple de créer un tableau creux est d'utiliser une fonction équivalente à la fonction zeros que Julia fournit pour travailler avec des tableaux denses. Pour produire un tableau creux à la place, vous pouvez utiliser le même nom avec un préfixe sp :

julia> spzeros(3)
3-element SparseVector{Float64, Int64} with 0 stored entries

La fonction sparse est souvent un moyen pratique de construire des tableaux creux. Par exemple, pour construire une matrice creuse, nous pouvons entrer un vecteur I d'indices de lignes, un vecteur J d'indices de colonnes et un vecteur V de valeurs stockées (ceci est également connu sous le nom de COO (coordinate) format). sparse(I,J,V) construit alors une matrice creuse telle que S[I[k], J[k]] = V[k]. Le constructeur de vecteur creux équivalent est sparsevec, qui prend le vecteur d'indices (de ligne) I et le vecteur V avec les valeurs stockées et construit un vecteur creux R tel que R[I[k]] = V[k].

julia> I = [1, 4, 3, 5]; J = [4, 7, 18, 9]; V = [1, 2, -5, 3];

julia> S = sparse(I,J,V)
5×18 SparseMatrixCSC{Int64, Int64} with 4 stored entries:
⎡⠀⠈⠀⠀⠀⠀⠀⠀⢀⎤
⎣⠀⠀⠀⠂⡀⠀⠀⠀⠀⎦

julia> R = sparsevec(I,V)
5-element SparseVector{Int64, Int64} with 4 stored entries:
  [1]  =  1
  [3]  =  -5
  [4]  =  2
  [5]  =  3

L'inverse des fonctions sparse et sparsevec est findnz, qui récupère les entrées utilisées pour créer le tableau sparse (y compris les entrées stockées égales à zéro). findall(!iszero, x) renvoie les indices cartésiens des entrées non nulles dans x (sans inclure les entrées stockées égales à zéro).

julia> findnz(S)
([1, 4, 5, 3], [4, 7, 9, 18], [1, 2, 3, -5])

julia> findall(!iszero, S)
4-element Vector{CartesianIndex{2}}:
 CartesianIndex(1, 4)
 CartesianIndex(4, 7)
 CartesianIndex(5, 9)
 CartesianIndex(3, 18)

julia> findnz(R)
([1, 3, 4, 5], [1, -5, 2, 3])

julia> findall(!iszero, R)
4-element Vector{Int64}:
 1
 3
 4
 5

Une autre façon de créer un tableau sparse est de convertir un tableau dense en un tableau sparse en utilisant la fonction sparse :

julia> sparse(Matrix(1.0I, 5, 5))
5×5 SparseMatrixCSC{Float64, Int64} with 5 stored entries:
 1.0   ⋅    ⋅    ⋅    ⋅
  ⋅   1.0   ⋅    ⋅    ⋅
  ⋅    ⋅   1.0   ⋅    ⋅
  ⋅    ⋅    ⋅   1.0   ⋅
  ⋅    ⋅    ⋅    ⋅   1.0

julia> sparse([1.0, 0.0, 1.0])
3-element SparseVector{Float64, Int64} with 2 stored entries:
  [1]  =  1.0
  [3]  =  1.0

Vous pouvez aller dans l'autre direction en utilisant le constructeur Array. La fonction issparse peut être utilisée pour interroger si une matrice est éparse.

julia> issparse(spzeros(5))
true

Sparse matrix operations

Les opérations arithmétiques sur les matrices creuses fonctionnent également comme sur les matrices denses. L'indexation, l'assignation et la concaténation des matrices creuses fonctionnent de la même manière que pour les matrices denses. Les opérations d'indexation, en particulier l'assignation, sont coûteuses lorsqu'elles sont effectuées un élément à la fois. Dans de nombreux cas, il peut être préférable de convertir la matrice creuse en format (I,J,V) en utilisant findnz, de manipuler les valeurs ou la structure dans les vecteurs denses (I,J,V), puis de reconstruire la matrice creuse.

Correspondence of dense and sparse methods

Le tableau suivant donne une correspondance entre les méthodes intégrées sur les matrices creuses et leurs méthodes correspondantes sur les types de matrices denses. En général, les méthodes qui génèrent des matrices creuses diffèrent de leurs homologues denses en ce sens que la matrice résultante suit le même motif de parcimonie qu'une matrice creuse donnée S, ou que la matrice creuse résultante a une densité d, c'est-à-dire que chaque élément de la matrice a une probabilité d d'être non nul.

Les détails peuvent être trouvés dans la section Sparse Vectors and Matrices de la référence de la bibliothèque standard.

SparseDenseDescription
spzeros(m,n)zeros(m,n)Creates a m-by-n matrix of zeros. (spzeros(m,n) is empty.)
sparse(I,n,n)Matrix(I,n,n)Creates a n-by-n identity matrix.
sparse(A)Array(S)Interconverts between dense and sparse formats.
sprand(m,n,d)rand(m,n)Creates a m-by-n random matrix (of density d) with iid non-zero elements distributed uniformly on the half-open interval $[0, 1)$.
sprandn(m,n,d)randn(m,n)Creates a m-by-n random matrix (of density d) with iid non-zero elements distributed according to the standard normal (Gaussian) distribution.
sprandn(rng,m,n,d)randn(rng,m,n)Creates a m-by-n random matrix (of density d) with iid non-zero elements generated with the rng random number generator

Sparse Linear Algebra

Les solveurs de matrices creuses appellent des fonctions de SuiteSparse. Les factorisations suivantes sont disponibles :

TypeDescription
CHOLMOD.FactorCholesky and LDLt factorizations
UMFPACK.UmfpackLULU factorization
SPQR.QRSparseQR factorization

Ces factorizations sont décrites plus en détail dans le Sparse Linear Algebra API section :

  1. cholesky
  2. ldlt
  3. lu
  4. qr

SparseArrays API

SparseArrays.AbstractSparseVectorType
AbstractSparseVector{Tv,Ti}

Supertype pour les tableaux creux unidimensionnels (ou types similaires de tableaux) avec des éléments de type Tv et un type d'index Ti. Alias pour AbstractSparseArray{Tv,Ti,1}.

source
SparseArrays.AbstractSparseMatrixType
AbstractSparseMatrix{Tv,Ti}

Supertype pour les tableaux creux bidimensionnels (ou types similaires à des tableaux) avec des éléments de type Tv et de type d'index Ti. Alias pour AbstractSparseArray{Tv,Ti,2}.

source
SparseArrays.SparseVectorType
SparseVector{Tv,Ti<:Integer} <: AbstractSparseVector{Tv,Ti}

Type de vecteur pour stocker des vecteurs creux. Peut être créé en passant la longueur du vecteur, un vecteur trié d'indices non nuls, et un vecteur de valeurs non nulles.

Par exemple, le vecteur [5, 6, 0, 7] peut être représenté comme

SparseVector(4, [1, 2, 4], [5, 6, 7])

Cela indique que l'élément à l'index 1 est 5, à l'index 2 est 6, à l'index 3 est zero(Int), et à l'index 4 est 7.

Il peut être plus pratique de créer des vecteurs creux directement à partir de vecteurs denses en utilisant sparse comme

sparse([5, 6, 0, 7])

produit le même vecteur creux.

source
SparseArrays.sparseFunction
sparse(A)

Convertir une AbstractMatrix A en une matrice creuse.

Exemples

julia> A = Matrix(1.0I, 3, 3)
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> sparse(A)
3×3 SparseMatrixCSC{Float64, Int64} avec 3 entrées stockées :
 1.0   ⋅    ⋅
  ⋅   1.0   ⋅
  ⋅    ⋅   1.0
source
sparse(I, J, V,[ m, n, combine])

Créez une matrice creuse S de dimensions m x n telle que S[I[k], J[k]] = V[k]. La fonction combine est utilisée pour combiner les doublons. Si m et n ne sont pas spécifiés, ils sont définis sur maximum(I) et maximum(J) respectivement. Si la fonction combine n'est pas fournie, combine par défaut est + à moins que les éléments de V ne soient des booléens, auquel cas combine par défaut est |. Tous les éléments de I doivent satisfaire 1 <= I[k] <= m, et tous les éléments de J doivent satisfaire 1 <= J[k] <= n. Les zéros numériques dans (I, J, V) sont conservés comme des non-zéros structurels ; pour supprimer les zéros numériques, utilisez dropzeros!.

Pour une documentation supplémentaire et un pilote expert, voir SparseArrays.sparse!.

Exemples

julia> Is = [1; 2; 3];

julia> Js = [1; 2; 3];

julia> Vs = [1; 2; 3];

julia> sparse(Is, Js, Vs)
3×3 SparseMatrixCSC{Int64, Int64} avec 3 entrées stockées :
 1  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  3
source
SparseArrays.sparse!Function
sparse!(I::AbstractVector{Ti}, J::AbstractVector{Ti}, V::AbstractVector{Tv},
        m::Integer, n::Integer, combine, klasttouch::Vector{Ti},
        csrrowptr::Vector{Ti}, csrcolval::Vector{Ti}, csrnzval::Vector{Tv},
        [csccolptr::Vector{Ti}], [cscrowval::Vector{Ti}, cscnzval::Vector{Tv}] ) where {Tv,Ti<:Integer}

Parent et conducteur expert pour sparse; voir sparse pour une utilisation de base. Cette méthode permet à l'utilisateur de fournir un stockage préalloué pour les objets intermédiaires de sparse et le résultat comme décrit ci-dessous. Cette capacité permet une construction successive plus efficace de SparseMatrixCSCs à partir de représentations coordonnées, et permet également l'extraction d'une représentation de colonne non triée de la transposée du résultat sans coût supplémentaire.

Cette méthode se compose de trois étapes majeures : (1) Tri par comptage de la représentation coordonnée fournie en une forme CSR de ligne non triée incluant des entrées répétées. (2) Balayage à travers la forme CSR, calculant simultanément le tableau des pointeurs de colonne de la forme CSC désirée, détectant les entrées répétées et reconditionnant la forme CSR avec les entrées répétées combinées ; cette étape produit une forme CSR de ligne non triée sans entrées répétées. (3) Tri par comptage de la forme CSR précédente en une forme CSC entièrement triée sans entrées répétées.

Les tableaux d'entrée csrrowptr, csrcolval et csrnzval constituent le stockage pour les formes CSR intermédiaires et nécessitent length(csrrowptr) >= m + 1, length(csrcolval) >= length(I), et length(csrnzval >= length(I)). Le tableau d'entrée klasttouch, espace de travail pour la deuxième étape, nécessite length(klasttouch) >= n. Les tableaux d'entrée optionnels csccolptr, cscrowval et cscnzval constituent le stockage pour la forme CSC retournée S. Si nécessaire, ceux-ci sont redimensionnés automatiquement pour satisfaire length(csccolptr) = n + 1, length(cscrowval) = nnz(S) et length(cscnzval) = nnz(S) ; par conséquent, si nnz(S) est inconnu au départ, il suffit de passer des vecteurs vides du type approprié (Vector{Ti}() et Vector{Tv}() respectivement), ou d'appeler la méthode sparse! en négligeant cscrowval et cscnzval.

Au retour, csrrowptr, csrcolval et csrnzval contiennent une représentation de colonne non triée de la transposée du résultat.

Vous pouvez réutiliser le stockage des tableaux d'entrée (I, J, V) pour les tableaux de sortie (csccolptr, cscrowval, cscnzval). Par exemple, vous pouvez appeler sparse!(I, J, V, csrrowptr, csrcolval, csrnzval, I, J, V). Notez qu'ils seront redimensionnés pour satisfaire les conditions ci-dessus.

Pour des raisons d'efficacité, cette méthode ne vérifie pas les arguments au-delà de 1 <= I[k] <= m et 1 <= J[k] <= n. Utilisez avec précaution. Tester avec --check-bounds=yes est judicieux.

Cette méthode s'exécute en temps O(m, n, length(I)). L'algorithme HALFPERM décrit dans F. Gustavson, "Deux algorithmes rapides pour les matrices creuses : multiplication et transposition permutée," ACM TOMS 4(3), 250-269 (1978) a inspiré l'utilisation par cette méthode d'une paire de tris par comptage.

source
SparseArrays.sparse!(I, J, V, [m, n, combine]) -> SparseMatrixCSC

Variante de sparse! qui réutilise les vecteurs d'entrée (I, J, V) pour le stockage final de la matrice. Après construction, les vecteurs d'entrée aliaseront les tampons de la matrice ; S.colptr === I, S.rowval === J, et S.nzval === V est vrai, et ils seront redimensionnés si nécessaire.

Notez que certains tampons de travail seront toujours alloués. En particulier, cette méthode est un wrapper de commodité autour de sparse!(I, J, V, m, n, combine, klasttouch, csrrowptr, csrcolval, csrnzval, csccolptr, cscrowval, cscnzval) où cette méthode alloue klasttouch, csrrowptr, csrcolval, et csrnzval de taille appropriée, mais réutilise I, J, et V pour csccolptr, cscrowval, et cscnzval.

Les arguments m, n, et combine par défaut à maximum(I), maximum(J), et +, respectivement.

Julia 1.10

Cette méthode nécessite la version Julia 1.10 ou ultérieure.

source
SparseArrays.sparsevecFunction
sparsevec(I, V, [m, combine])

Créez un vecteur sparse S de longueur m tel que S[I[k]] = V[k]. Les doublons sont combinés à l'aide de la fonction combine, qui par défaut est + si aucun argument combine n'est fourni, sauf si les éléments de V sont des booléens, auquel cas combine par défaut est |.

Exemples

julia> II = [1, 3, 3, 5]; V = [0.1, 0.2, 0.3, 0.2];

julia> sparsevec(II, V)
5-element SparseVector{Float64, Int64} with 3 stored entries:
  [1]  =  0.1
  [3]  =  0.5
  [5]  =  0.2

julia> sparsevec(II, V, 8, -)
8-element SparseVector{Float64, Int64} with 3 stored entries:
  [1]  =  0.1
  [3]  =  -0.1
  [5]  =  0.2

julia> sparsevec([1, 3, 1, 2, 2], [true, true, false, false, false])
3-element SparseVector{Bool, Int64} with 3 stored entries:
  [1]  =  1
  [2]  =  0
  [3]  =  1
source
sparsevec(d::Dict, [m])

Crée un vecteur creux de longueur m où les indices non nuls sont des clés du dictionnaire, et les valeurs non nulles sont les valeurs du dictionnaire.

Exemples

julia> sparsevec(Dict(1 => 3, 2 => 2))
2-element SparseVector{Int64, Int64} with 2 stored entries:
  [1]  =  3
  [2]  =  2
source
sparsevec(A)

Convertir un vecteur A en un vecteur épars de longueur m.

Exemples

julia> sparsevec([1.0, 2.0, 0.0, 0.0, 3.0, 0.0])
6-element SparseVector{Float64, Int64} with 3 stored entries:
  [1]  =  1.0
  [2]  =  2.0
  [5]  =  3.0
source
Base.similarMethod
similar(A::AbstractSparseMatrixCSC{Tv,Ti}, [::Type{TvNew}, ::Type{TiNew}, m::Integer, n::Integer]) where {Tv,Ti}

Créez un tableau mutable non initialisé avec le type d'élément, le type d'index et la taille donnés, basé sur la source SparseMatrixCSC donnée. La nouvelle matrice creuse maintient la structure de la matrice creuse originale, sauf dans le cas où les dimensions de la matrice de sortie sont différentes de la sortie.

La matrice de sortie a des zéros aux mêmes emplacements que l'entrée, mais des valeurs non initialisées pour les emplacements non nuls.

source
SparseArrays.issparseFunction
issparse(S)

Renvoie true si S est sparse, et false sinon.

Exemples

julia> sv = sparsevec([1, 4], [2.3, 2.2], 10)
10-element SparseVector{Float64, Int64} with 2 stored entries:
  [1]  =  2.3
  [4]  =  2.2

julia> issparse(sv)
true

julia> issparse(Array(sv))
false
source
SparseArrays.nnzFunction
nnz(A)

Renvoie le nombre d'éléments stockés (remplis) dans un tableau sparse.

Exemples

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} avec 3 entrées stockées :
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

julia> nnz(A)
3
source
SparseArrays.findnzFunction
findnz(A::SparseMatrixCSC)

Renvoie un tuple (I, J, V)I et J sont les indices de ligne et de colonne des valeurs stockées ("non nulles structurellement") dans la matrice creuse A, et V est un vecteur des valeurs.

Exemples

julia> A = sparse([1 2 0; 0 0 3; 0 4 0])
3×3 SparseMatrixCSC{Int64, Int64} avec 4 entrées stockées :
 1  2  ⋅
 ⋅  ⋅  3
 ⋅  4  ⋅

julia> findnz(A)
([1, 1, 3, 2], [1, 2, 2, 3], [1, 2, 4, 3])
source
SparseArrays.spzerosFunction
spzeros([type,]m[,n])

Crée un vecteur sparse de longueur m ou une matrice sparse de taille m x n. Ce tableau sparse ne contiendra aucune valeur non nulle. Aucun stockage ne sera alloué pour les valeurs non nulles lors de la construction. Le type par défaut est Float64 s'il n'est pas spécifié.

Exemples

julia> spzeros(3, 3)
3×3 SparseMatrixCSC{Float64, Int64} avec 0 entrées stockées :
  ⋅    ⋅    ⋅
  ⋅    ⋅    ⋅
  ⋅    ⋅    ⋅

julia> spzeros(Float32, 4)
4-élément SparseVector{Float32, Int64} avec 0 entrées stockées
source
spzeros([type], I::AbstractVector, J::AbstractVector, [m, n])

Créez une matrice creuse S de dimensions m x n avec des zéros structurels à S[I[k], J[k]].

Cette méthode peut être utilisée pour construire le motif de sparsité de la matrice, et est plus efficace que d'utiliser par exemple sparse(I, J, zeros(length(I))).

Pour une documentation supplémentaire et un pilote expert, voir SparseArrays.spzeros!.

Julia 1.10

Cette méthode nécessite la version 1.10 de Julia ou ultérieure.

source
SparseArrays.spzeros!Function
spzeros!(::Type{Tv}, I::AbstractVector{Ti}, J::AbstractVector{Ti}, m::Integer, n::Integer,
         klasttouch::Vector{Ti}, csrrowptr::Vector{Ti}, csrcolval::Vector{Ti},
         [csccolptr::Vector{Ti}], [cscrowval::Vector{Ti}, cscnzval::Vector{Tv}]) where {Tv,Ti<:Integer}

Parent et conducteur expert pour spzeros(I, J) permettant à l'utilisateur de fournir un stockage préalloué pour les objets intermédiaires. Cette méthode est à spzeros ce que SparseArrays.sparse! est à sparse. Voir la documentation de SparseArrays.sparse! pour plus de détails et les longueurs de tampon requises.

Julia 1.10

Cette méthode nécessite la version 1.10 de Julia ou ultérieure.

source
SparseArrays.spzeros!(::Type{Tv}, I, J, [m, n]) -> SparseMatrixCSC{Tv}

Variante de spzeros! qui réutilise les vecteurs d'entrée I et J pour le stockage de la matrice finale. Après construction, les vecteurs d'entrée aliaseront les tampons de la matrice ; S.colptr === I et S.rowval === J est vrai, et ils seront redimensionnés si nécessaire.

Notez que certains tampons de travail seront toujours alloués. En particulier, cette méthode est un wrapper de commodité autour de spzeros!(Tv, I, J, m, n, klasttouch, csrrowptr, csrcolval, csccolptr, cscrowval) où cette méthode alloue klasttouch, csrrowptr, et csrcolval de taille appropriée, mais réutilise I et J pour csccolptr et cscrowval.

Les arguments m et n par défaut à maximum(I) et maximum(J).

Julia 1.10

Cette méthode nécessite la version Julia 1.10 ou ultérieure.

source
SparseArrays.spdiagmFunction
spdiagm(kv::Pair{<:Integer,<:AbstractVector}...)
spdiagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)

Construit une matrice diagonale creuse à partir de `Pair`s de vecteurs et de diagonales. Chaque 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.

# Exemples

jldoctest julia> spdiagm(-1 => [1,2,3,4], 1 => [4,3,2,1]) 5×5 SparseMatrixCSC{Int64, Int64} avec 8 entrées stockées : ⋅ 4 ⋅ ⋅ ⋅ 1 ⋅ 3 ⋅ ⋅ ⋅ 2 ⋅ 2 ⋅ ⋅ ⋅ 3 ⋅ 1 ⋅ ⋅ ⋅ 4 ⋅ ```

source
spdiagm(v::AbstractVector)
spdiagm(m::Integer, n::Integer, v::AbstractVector)

Construit une matrice creuse avec les éléments du vecteur comme éléments diagonaux. Par défaut (sans m et n donnés), 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 et n comme premiers arguments.

Julia 1.6

Ces fonctions nécessitent au moins Julia 1.6.

Exemples

julia> spdiagm([1,2,3])
3×3 SparseMatrixCSC{Int64, Int64} avec 3 entrées stockées :
 1  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  3

julia> spdiagm(sparse([1,0,3]))
3×3 SparseMatrixCSC{Int64, Int64} avec 2 entrées stockées :
 1  ⋅  ⋅
 ⋅  ⋅  ⋅
 ⋅  ⋅  3
source
SparseArrays.sparse_hcatFunction
sparse_hcat(A...)

Concaténer le long de la dimension 2. Retourne un objet SparseMatrixCSC.

Julia 1.8

Cette méthode a été ajoutée dans Julia 1.8. Elle imite le comportement de concaténation précédent, où la concaténation avec des types de matrices "sparse" spécialisés de LinearAlgebra.jl produisait automatiquement une sortie sparse même en l'absence de tout argument SparseArray.

source
SparseArrays.sparse_vcatFunction
sparse_vcat(A...)

Concaténer le long de la dimension 1. Retourne un objet SparseMatrixCSC.

Julia 1.8

Cette méthode a été ajoutée dans Julia 1.8. Elle imite le comportement de concaténation précédent, où la concaténation avec des types de matrices "sparse" spécialisés de LinearAlgebra.jl produisait automatiquement une sortie sparse même en l'absence de tout argument SparseArray.

source
SparseArrays.sparse_hvcatFunction
sparse_hvcat(rows::Tuple{Vararg{Int}}, values...)

Concaténation horizontale et verticale sparse en un seul appel. Cette fonction est appelée pour la syntaxe de matrice bloc. Le premier argument spécifie le nombre d'arguments à concaténer dans chaque ligne de bloc.

Julia 1.8

Cette méthode a été ajoutée dans Julia 1.8. Elle imite le comportement de concaténation précédent, où la concaténation avec des types de matrice "sparse" spécialisés de LinearAlgebra.jl produisait automatiquement une sortie sparse même en l'absence de tout argument SparseArray.

source
SparseArrays.blockdiagFunction
blockdiag(A...)

Concaténer des matrices de manière bloc-diagonale. Actuellement, cela n'est implémenté que pour les matrices creuses.

Exemples

julia> blockdiag(sparse(2I, 3, 3), sparse(4I, 2, 2))
5×5 SparseMatrixCSC{Int64, Int64} avec 5 entrées stockées :
 2  ⋅  ⋅  ⋅  ⋅
 ⋅  2  ⋅  ⋅  ⋅
 ⋅  ⋅  2  ⋅  ⋅
 ⋅  ⋅  ⋅  4  ⋅
 ⋅  ⋅  ⋅  ⋅  4
source
SparseArrays.sprandFunction
sprand([rng],[T::Type],m,[n],p::AbstractFloat)
sprand([rng],m,[n],p::AbstractFloat,[rfn=rand])

Créez un vecteur sparse de longueur aléatoire m ou une matrice sparse de m par n, dans laquelle la probabilité qu'un élément soit non nul est indépendamment donnée par p (et donc la densité moyenne des non-nuls est également exactement p). L'argument optionnel rng spécifie un générateur de nombres aléatoires, voir Random Numbers. L'argument optionnel T spécifie le type d'élément, qui par défaut est Float64.

Par défaut, les valeurs non nulles sont échantillonnées à partir d'une distribution uniforme en utilisant la fonction rand, c'est-à-dire par rand(T), ou rand(rng, T) si rng est fourni ; pour le T=Float64 par défaut, cela correspond à des valeurs non nulles échantillonnées uniformément dans [0,1).

Vous pouvez échantillonner des valeurs non nulles à partir d'une distribution différente en passant une fonction rfn personnalisée au lieu de rand. Cela devrait être une fonction rfn(k) qui retourne un tableau de k nombres aléatoires échantillonnés à partir de la distribution souhaitée ; alternativement, si rng est fourni, cela devrait plutôt être une fonction rfn(rng, k).

Exemples

julia> sprand(Bool, 2, 2, 0.5)
2×2 SparseMatrixCSC{Bool, Int64} avec 2 entrées stockées :
 1  1
 ⋅  ⋅

julia> sprand(Float64, 3, 0.75)
3-élément SparseVector{Float64, Int64} avec 2 entrées stockées :
  [1]  =  0.795547
  [2]  =  0.49425
source
SparseArrays.sprandnFunction
sprandn([rng][,Type],m[,n],p::AbstractFloat)

Crée un vecteur sparse aléatoire de longueur m ou une matrice sparse de taille m par n avec la probabilité (indépendante) spécifiée p qu'une entrée soit non nulle, où les valeurs non nulles sont échantillonnées à partir de la distribution normale. L'argument optionnel rng spécifie un générateur de nombres aléatoires, voir Random Numbers.

Julia 1.1

La spécification du type d'élément de sortie Type nécessite au moins Julia 1.1.

Exemples

julia> sprandn(2, 2, 0.75)
2×2 SparseMatrixCSC{Float64, Int64} avec 3 entrées stockées :
 -1.20577     ⋅
  0.311817  -0.234641
source
SparseArrays.nonzerosFunction
nonzeros(A)

Renvoie un vecteur des valeurs non nulles structurelles dans le tableau sparse A. Cela inclut les zéros qui sont explicitement stockés dans le tableau sparse. Le vecteur retourné pointe directement vers le stockage interne des non-zéros de A, et toute modification du vecteur retourné modifiera également A. Voir rowvals et nzrange.

Exemples

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} avec 3 entrées stockées :
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

julia> nonzeros(A)
3-element Vector{Int64}:
 2
 2
 2
source
SparseArrays.rowvalsFunction
rowvals(A::AbstractSparseMatrixCSC)

Renvoie un vecteur des indices de ligne de A. Toute modification du vecteur retourné modifiera également A. Fournir un accès à la façon dont les indices de ligne sont stockés en interne peut être utile en conjonction avec l'itération sur les valeurs non nulles structurelles. Voir aussi nonzeros et nzrange.

Exemples

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} avec 3 entrées stockées :
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

julia> rowvals(A)
3-element Vector{Int64}:
 1
 2
 3
source
SparseArrays.nzrangeFunction
nzrange(A::AbstractSparseMatrixCSC, col::Integer)

Retourne la plage d'indices des valeurs non nulles structurelles d'une colonne de matrice creuse. En conjonction avec nonzeros et rowvals, cela permet d'itérer de manière pratique sur une matrice creuse :

A = sparse(I,J,V)
rows = rowvals(A)
vals = nonzeros(A)
m, n = size(A)
for j = 1:n
   for i in nzrange(A, j)
      row = rows[i]
      val = vals[i]
      # effectuer des tours de magie sur les matrices creuses...
   end
end
Avertissement

Ajouter ou supprimer des éléments non nuls de la matrice peut invalider le nzrange, il ne faut pas modifier la matrice pendant l'itération.

source
nzrange(x::SparseVectorUnion, col)

Donne la plage d'indices des valeurs non nulles structurelles d'un vecteur sparse. L'index de colonne col est ignoré (supposé être 1).

source
SparseArrays.droptol!Function
droptol!(A::AbstractSparseMatrixCSC, tol)

Supprime les valeurs stockées dans A dont la valeur absolue est inférieure ou égale à tol.

source
droptol!(x::AbstractCompressedVector, tol)

Supprime les valeurs stockées dans x dont la valeur absolue est inférieure ou égale à tol.

source
SparseArrays.dropzeros!Function
dropzeros!(x::AbstractCompressedVector)

Supprime les zéros numériques stockés de x.

Pour une version sans modification, voir dropzeros. Pour des informations algorithmiques, voir fkeep!.

source
SparseArrays.dropzerosFunction
dropzeros(A::AbstractSparseMatrixCSC;)

Génère une copie de A et supprime les zéros numériques stockés de cette copie.

Pour une version en place et des informations algorithmiques, voir dropzeros!.

Exemples

julia> A = sparse([1, 2, 3], [1, 2, 3], [1.0, 0.0, 1.0])
3×3 SparseMatrixCSC{Float64, Int64} avec 3 entrées stockées :
 1.0   ⋅    ⋅
  ⋅   0.0   ⋅
  ⋅    ⋅   1.0

julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64, Int64} avec 2 entrées stockées :
 1.0   ⋅    ⋅
  ⋅    ⋅    ⋅
  ⋅    ⋅   1.0
source
dropzeros(x::AbstractCompressedVector)

Génère une copie de x et supprime les zéros numériques de cette copie.

Pour une version en place et des informations algorithmiques, voir dropzeros!.

Exemples

julia> A = sparsevec([1, 2, 3], [1.0, 0.0, 1.0])
3-élément SparseVector{Float64, Int64} avec 3 entrées stockées :
  [1]  =  1.0
  [2]  =  0.0
  [3]  =  1.0

julia> dropzeros(A)
3-élément SparseVector{Float64, Int64} avec 2 entrées stockées :
  [1]  =  1.0
  [3]  =  1.0
source
SparseArrays.permuteFunction
permute(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
        q::AbstractVector{<:Integer}) where {Tv,Ti}

Permute bilatéralement A, retournant PAQ (A[p,q]). La longueur de la permutation de colonne q doit correspondre au nombre de colonnes de A (length(q) == size(A, 2)). La longueur de la permutation de ligne p doit correspondre au nombre de lignes de A (length(p) == size(A, 1)).

Pour des utilisateurs avancés et des informations supplémentaires, voir permute!.

Exemples

julia> A = spdiagm(0 => [1, 2, 3, 4], 1 => [5, 6, 7])
4×4 SparseMatrixCSC{Int64, Int64} avec 7 entrées stockées :
 1  5  ⋅  ⋅
 ⋅  2  6  ⋅
 ⋅  ⋅  3  7
 ⋅  ⋅  ⋅  4

julia> permute(A, [4, 3, 2, 1], [1, 2, 3, 4])
4×4 SparseMatrixCSC{Int64, Int64} avec 7 entrées stockées :
 ⋅  ⋅  ⋅  4
 ⋅  ⋅  3  7
 ⋅  2  6  ⋅
 1  5  ⋅  ⋅

julia> permute(A, [1, 2, 3, 4], [4, 3, 2, 1])
4×4 SparseMatrixCSC{Int64, Int64} avec 7 entrées stockées :
 ⋅  ⋅  5  1
 ⋅  6  2  ⋅
 7  3  ⋅  ⋅
 4  ⋅  ⋅  ⋅
source
Base.permute!Method
permute!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti},
         p::AbstractVector{<:Integer}, q::AbstractVector{<:Integer},
         [C::AbstractSparseMatrixCSC{Tv,Ti}]) where {Tv,Ti}

Permute bilatéralement A, en stockant le résultat PAQ (A[p,q]) dans X. Stocke le résultat intermédiaire (AQ)^T (transpose(A[:,q])) dans l'argument optionnel C s'il est présent. Nécessite qu'aucun de X, A, et, si présent, C ne s'aliasent ; pour stocker le résultat PAQ de nouveau dans A, utilisez la méthode suivante sans X :

permute!(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
         q::AbstractVector{<:Integer}[, C::AbstractSparseMatrixCSC{Tv,Ti},
         [workcolptr::Vector{Ti}]]) where {Tv,Ti}

Les dimensions de X doivent correspondre à celles de A (size(X, 1) == size(A, 1) et size(X, 2) == size(A, 2)), et X doit avoir suffisamment de stockage pour accueillir toutes les entrées allouées dans A (length(rowvals(X)) >= nnz(A) et length(nonzeros(X)) >= nnz(A)). La longueur de la permutation de colonne q doit correspondre au nombre de colonnes de A (length(q) == size(A, 2)). La longueur de la permutation de ligne p doit correspondre au nombre de lignes de A (length(p) == size(A, 1)).

Les dimensions de C doivent correspondre à celles de transpose(A) (size(C, 1) == size(A, 2) et size(C, 2) == size(A, 1)), et C doit avoir suffisamment de stockage pour accueillir toutes les entrées allouées dans A (length(rowvals(C)) >= nnz(A) et length(nonzeros(C)) >= nnz(A)).

Pour des informations supplémentaires (algorithmique), et pour des versions de ces méthodes qui se passent de vérification des arguments, voir les méthodes parentes (non exportées) unchecked_noalias_permute! et unchecked_aliasing_permute!.

Voir aussi permute.

source
SparseArrays.halfperm!Function
halfperm!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{TvA,Ti},
          q::AbstractVector{<:Integer}, f::Function = identity) where {Tv,TvA,Ti}

Permute par colonne et transpose A, en appliquant simultanément f à chaque entrée de A, en stockant le résultat (f(A)Q)^T (map(f, transpose(A[:,q]))) dans X.

Le type d'élément Tv de X doit correspondre à f(::TvA), où TvA est le type d'élément de A. Les dimensions de X doivent correspondre à celles de transpose(A) (size(X, 1) == size(A, 2) et size(X, 2) == size(A, 1)), et X doit avoir suffisamment de stockage pour accueillir toutes les entrées allouées dans A (length(rowvals(X)) >= nnz(A) et length(nonzeros(X)) >= nnz(A)). La longueur de la permutation par colonne q doit correspondre au nombre de colonnes de A (length(q) == size(A, 2)).

Cette méthode est la méthode parente de plusieurs méthodes effectuant des opérations de transposition et de permutation sur SparseMatrixCSCs. Comme cette méthode ne vérifie pas les arguments, il est préférable d'utiliser les méthodes enfants plus sûres ([c]transpose[!], permute[!]) plutôt que d'utiliser directement celle-ci.

Cette méthode implémente l'algorithme HALFPERM décrit dans F. Gustavson, "Two fast algorithms for sparse matrices: multiplication and permuted transposition," ACM TOMS 4(3), 250-269 (1978). L'algorithme s'exécute en temps O(size(A, 1), size(A, 2), nnz(A)) et ne nécessite pas d'espace au-delà de celui passé en entrée.

source
SparseArrays.ftranspose!Function
ftranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}, f::Function) where {Tv,Ti}

Transposer A et le stocker dans X tout en appliquant la fonction f aux éléments non nuls. Ne supprime pas les zéros créés par f. 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!

source

Sparse Linear Algebra API

LinearAlgebra.choleskyFunction
cholesky(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
source
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
source
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
Note

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.

source
LinearAlgebra.cholesky!Function
cholesky!(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:
[...]
source
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.

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

Note

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.

source
LinearAlgebra.lowrankupdateFunction
lowrankupdate(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.

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

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

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

source
LinearAlgebra.lowrankdowndateFunction
lowrankdowndate(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.

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

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

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

source
SparseArrays.CHOLMOD.lowrankupdowndate!Function
lowrankupdowndate!(F::CHOLMOD.Factor, C::Sparse, update::Cint)

Met à jour une factorisation LDLt ou LLt F de A à une factorisation de A ± C*C'.

Si une factorisation préservant la sparsité est utilisée, c'est-à-dire L*L' == P*A*P', alors le nouveau facteur sera L*L' == P*A*P' + C'*C

update: Cint(1) pour A + CC', Cint(0) pour A - CC'

source
LinearAlgebra.ldltFunction
ldlt(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'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
source
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).

Note

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.

source
LinearAlgebra.luFunction
lu(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 :

ComposantDescription
Lpartie L (triangulaire inférieure) de LU
Upartie U (triangulaire supérieure) de LU
ppermutation à droite Vector
qpermutation à gauche Vector
RsVector 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!

Note

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.

source
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 également abs 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 supportent iszero mais pas abs ou <.)
  • NoPivot() : pivotement désactivé (échouera si une entrée nulle est rencontrée dans une position de pivot, même lorsque allowsingular = true).

Les composants individuels de la factorisation F peuvent être accessibles via getproperty :

ComposantDescription
F.LL (partie triangulaire inférieure) de LU
F.UU (partie triangulaire supérieure) de LU
F.ppermutation Vector (droite)
F.Ppermutation 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 chargeLULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

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
source
LinearAlgebra.qrFunction
qr(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].

Note

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
source
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() alors F est un objet QRPivoted,
  • sinon, si le type d'élément de A est un type BLAS (Float32, Float64, ComplexF32 ou ComplexF64), alors F est un objet QRCompactWY,
  • sinon F est un objet QR.

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/unitaire Q
  • F.R : la matrice triangulaire supérieure R
  • F.p : le vecteur de permutation du pivot (QRPivoted uniquement)
  • F.P : la matrice de permutation du pivot (QRPivoted uniquement)
Note

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.

Julia 1.4

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
Note

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.

source

Noteworthy External Sparse Packages

Plusieurs autres packages Julia fournissent des implémentations de matrices creuses qui devraient être mentionnées :

  1. SuiteSparseGraphBLAS.jl est un wrapper sur la bibliothèque C SuiteSparse:GraphBLAS rapide et multithreadée. Sur CPU, c'est généralement l'option la plus rapide, surpassant souvent de manière significative MKLSparse.

  2. CUDA.jl expose la bibliothèque CUSPARSE pour les opérations de matrices creuses sur GPU.

  3. SparseMatricesCSR.jl fournit une implémentation native en Julia du format Compressed Sparse Rows (CSR).

  4. MKLSparse.jl accélère les opérations de matrices creuses-denses SparseArrays en utilisant la bibliothèque MKL d'Intel.

  5. SparseArrayKit.jl disponible pour des tableaux creux multidimensionnels.

  6. LuxurySparse.jl fournit des formats de tableau clairsemé statiques, ainsi qu'un format de coordonnées.

  7. ExtendableSparse.jl permet une insertion rapide dans des matrices creuses en utilisant une approche paresseuse pour les nouveaux indices stockés.

  8. Finch.jl prend en charge des formats et des opérations de tableaux creux multidimensionnels étendus grâce à un mini langage de tenseurs et un compilateur, le tout en Julia natif. Prise en charge de COO, CSF, CSR, CSC et plus encore, ainsi que des opérations comme le broadcast, la réduction, etc. et des opérations personnalisées.

Packages externes fournissant des solveurs directs creux :

  1. KLU.jl
  2. Pardiso.jl

Packages externes fournissant des solveurs pour la solution itérative des systèmes d'eigenvalues et des décompositions en valeurs singulières :

  1. ArnoldiMethods.jl
  2. KrylovKit
  3. Arpack.jl

Packages externes pour travailler avec des graphes :

  1. Graphs.jl
  • 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
  • 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
  • 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