Sparse Arrays

Julia unterstützt spärliche Vektoren und sparse matrices im SparseArrays-Standardbibliotheksmodul. Spärliche Arrays sind Arrays, die genügend Nullen enthalten, sodass die Speicherung in einer speziellen Datenstruktur zu Einsparungen bei Speicherplatz und Ausführungszeit im Vergleich zu dichten Arrays führt.

Externe Pakete, die verschiedene spärliche Speicherarten, mehrdimensionale spärliche Arrays und mehr implementieren, sind in Noteworthy External Sparse Packages zu finden.

Compressed Sparse Column (CSC) Sparse Matrix Storage

In Julia werden spärliche Matrizen im Compressed Sparse Column (CSC) format gespeichert. Julia spärliche Matrizen haben den Typ SparseMatrixCSC{Tv,Ti}, wobei Tv der Typ der gespeicherten Werte und Ti der Ganzzahltyp für die Speicherung von Spaltenzeigern und Zeilenindizes ist. Die interne Darstellung von SparseMatrixCSC ist wie folgt:

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

Die komprimierte spärliche Spaltenspeicherung erleichtert und beschleunigt den Zugriff auf die Elemente in der Spalte einer spärlichen Matrix, während der Zugriff auf die spärliche Matrix nach Zeilen erheblich langsamer ist. Operationen wie das Einfügen zuvor nicht gespeicherter Einträge einzeln in die CSC-Struktur tendieren dazu, langsam zu sein. Dies liegt daran, dass alle Elemente der spärlichen Matrix, die über den Einfügepunkt hinausgehen, um einen Platz verschoben werden müssen.

Alle Operationen auf spärlichen Matrizen sind sorgfältig implementiert, um die CSC-Datenstruktur für die Leistung zu nutzen und teure Operationen zu vermeiden.

Wenn Sie Daten im CSC-Format aus einer anderen Anwendung oder Bibliothek haben und diese in Julia importieren möchten, stellen Sie sicher, dass Sie die 1-basierte Indizierung verwenden. Die Zeilenindizes in jeder Spalte müssen sortiert sein, und wenn dies nicht der Fall ist, wird die Matrix falsch angezeigt. Wenn Ihr SparseMatrixCSC-Objekt unsortierte Zeilenindizes enthält, ist eine schnelle Möglichkeit, sie zu sortieren, eine doppelte Transponierung durchzuführen. Da die Transponierungsoperation faul ist, erstellen Sie eine Kopie, um jede Transponierung zu materialisieren.

In einigen Anwendungen ist es praktisch, explizite Nullwerte in einer SparseMatrixCSC zu speichern. Diese werden von Funktionen in Base akzeptiert (aber es gibt keine Garantie, dass sie bei mutierenden Operationen erhalten bleiben). Solche explizit gespeicherten Nullen werden von vielen Routinen als strukturelle Nicht-Nullwerte behandelt. Die Funktion nnz gibt die Anzahl der explizit im sparsamen Datenspeicher gespeicherten Elemente zurück, einschließlich nicht-struktureller Nullen. Um die genaue Anzahl der numerischen Nicht-Nullwerte zu zählen, verwenden Sie count(!iszero, x), die jedes gespeicherte Element einer spärlichen Matrix inspiziert. dropzeros und das In-Place dropzeros! können verwendet werden, um gespeicherte Nullen aus der spärlichen Matrix zu entfernen.

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

Sparse-Vektoren werden in einem engen Analogon zum komprimierten spärlichen Spaltenformat für spärliche Matrizen gespeichert. In Julia haben spärliche Vektoren den Typ SparseVector{Tv,Ti}, wobei Tv der Typ der gespeicherten Werte und Ti der Ganzzahltyp für die Indizes ist. Die interne Darstellung ist wie folgt:

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

Was SparseMatrixCSC betrifft, kann der SparseVector-Typ auch explizit gespeicherte Nullen enthalten. (Siehe Sparse Matrix Storage.)

Sparse Vector and Matrix Constructors

Der einfachste Weg, ein spärliches Array zu erstellen, besteht darin, eine Funktion zu verwenden, die der zeros-Funktion entspricht, die Julia für die Arbeit mit dichten Arrays bereitstellt. Um stattdessen ein spärliches Array zu erzeugen, können Sie denselben Namen mit einem sp-Präfix verwenden:

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

Die sparse Funktion ist oft eine praktische Möglichkeit, spärliche Arrays zu konstruieren. Zum Beispiel können wir, um eine spärliche Matrix zu konstruieren, einen Vektor I mit Zeilenindizes, einen Vektor J mit Spaltenindizes und einen Vektor V mit gespeicherten Werten eingeben (dies ist auch bekannt als der COO (coordinate) format). sparse(I,J,V) konstruiert dann eine spärliche Matrix, so dass S[I[k], J[k]] = V[k]. Der entsprechende Konstruktor für spärliche Vektoren ist sparsevec, der den (Zeilen-)Indexvektor I und den Vektor V mit den gespeicherten Werten nimmt und einen spärlichen Vektor R konstruiert, so dass 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

Die Inverse der Funktionen sparse und sparsevec ist findnz, die die Eingaben abruft, die zur Erstellung des spärlichen Arrays verwendet wurden (einschließlich gespeicherter Einträge, die gleich null sind). findall(!iszero, x) gibt die kartesischen Indizes der Nicht-Null-Einträge in x zurück (ohne gespeicherte Einträge, die gleich null sind).

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

Eine weitere Möglichkeit, ein spärliches Array zu erstellen, besteht darin, ein dichtes Array in ein spärliches Array mit der Funktion sparse zu konvertieren:

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

Sie können in die andere Richtung gehen, indem Sie den Array Konstruktor verwenden. Die issparse Funktion kann verwendet werden, um abzufragen, ob eine Matrix spärlich ist.

julia> issparse(spzeros(5))
true

Sparse matrix operations

Arithmetische Operationen auf spärlichen Matrizen funktionieren ebenso wie bei dichten Matrizen. Das Indizieren, die Zuweisung und die Verkettung von spärlichen Matrizen funktionieren auf die gleiche Weise wie bei dichten Matrizen. Indizierungsoperationen, insbesondere Zuweisungen, sind teuer, wenn sie Element für Element durchgeführt werden. In vielen Fällen kann es besser sein, die spärliche Matrix in das (I,J,V)-Format zu konvertieren, indem man findnz verwendet, die Werte oder die Struktur in den dichten Vektoren (I,J,V) zu manipulieren und dann die spärliche Matrix wiederherzustellen.

Correspondence of dense and sparse methods

Die folgende Tabelle zeigt eine Entsprechung zwischen integrierten Methoden für spärliche Matrizen und ihren entsprechenden Methoden für dichte Matrizen. Im Allgemeinen unterscheiden sich Methoden, die spärliche Matrizen erzeugen, von ihren dichten Gegenstücken darin, dass die resultierende Matrix dasselbe Sparsamkeitsmuster wie eine gegebene spärliche Matrix S aufweist oder dass die resultierende spärliche Matrix eine Dichte d hat, d.h. jedes Matrixelement hat eine Wahrscheinlichkeit d, ungleich null zu sein.

Details können im Abschnitt Sparse Vectors and Matrices des Referenzhandbuchs der Standardbibliothek gefunden werden.

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

Sparse-Matrix-Löser rufen Funktionen von SuiteSparse auf. Die folgenden Faktorisierungen sind verfügbar:

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

Diese Faktorisierungen werden ausführlicher beschrieben in der Sparse Linear Algebra API section:

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

SparseArrays API

SparseArrays.AbstractSparseVectorType
AbstractSparseVector{Tv,Ti}

Obertyp für eindimensionale spärliche Arrays (oder array-ähnliche Typen) mit Elementen des Typs Tv und Indextyp Ti. Alias für AbstractSparseArray{Tv,Ti,1}.

source
SparseArrays.AbstractSparseMatrixType
AbstractSparseMatrix{Tv,Ti}

Obertyp für zweidimensionale spärliche Arrays (oder array-ähnliche Typen) mit Elementen des Typs Tv und Indextyp Ti. Alias für AbstractSparseArray{Tv,Ti,2}.

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

Vektortyp für die Speicherung von spärlichen Vektoren. Kann erstellt werden, indem die Länge des Vektors, ein sortierter Vektor von Nicht-Null-Indizes und ein Vektor von Nicht-Null-Werten übergeben werden.

Zum Beispiel kann der Vektor [5, 6, 0, 7] dargestellt werden als

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

Dies zeigt an, dass das Element an Index 1 5 ist, an Index 2 6 ist, an Index 3 zero(Int) ist und an Index 4 7 ist.

Es kann bequemer sein, spärliche Vektoren direkt aus dichten Vektoren mit sparse zu erstellen, da

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

den gleichen spärlichen Vektor ergibt.

source
SparseArrays.sparseFunction
sparse(A)

Konvertiert eine AbstractMatrix A in eine spärliche Matrix.

Beispiele

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} mit 3 gespeicherten Einträgen:
 1.0   ⋅    ⋅
  ⋅   1.0   ⋅
  ⋅    ⋅   1.0
source
sparse(I, J, V,[ m, n, combine])

Erstellen Sie eine spärliche Matrix S der Dimensionen m x n, so dass S[I[k], J[k]] = V[k]. Die Funktion combine wird verwendet, um Duplikate zu kombinieren. Wenn m und n nicht angegeben sind, werden sie auf maximum(I) und maximum(J) gesetzt. Wenn die Funktion combine nicht bereitgestellt wird, ist combine standardmäßig +, es sei denn, die Elemente von V sind Booleans, in diesem Fall ist combine standardmäßig |. Alle Elemente von I müssen die Bedingung 1 <= I[k] <= m erfüllen, und alle Elemente von J müssen die Bedingung 1 <= J[k] <= n erfüllen. Numerische Nullen in (I, J, V) werden als strukturelle Nicht-Nullwerte beibehalten; um numerische Nullen zu entfernen, verwenden Sie dropzeros!.

Für zusätzliche Dokumentation und einen Experten-Treiber siehe SparseArrays.sparse!.

Beispiele

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} mit 3 gespeicherten Einträgen:
 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}

Elternteil und Expertenfahrer für sparse; siehe sparse für die grundlegende Verwendung. Diese Methode ermöglicht es dem Benutzer, vorab zugewiesenen Speicher für die Zwischenobjekte und das Ergebnis von sparse bereitzustellen, wie unten beschrieben. Diese Fähigkeit ermöglicht eine effizientere aufeinanderfolgende Konstruktion von SparseMatrixCSCs aus Koordinatenrepräsentationen und ermöglicht auch die Extraktion einer unsortierten Spaltenrepräsentation der Transponierten des Ergebnisses ohne zusätzliche Kosten.

Diese Methode besteht aus drei Hauptschritten: (1) Zähl-Sortierung der bereitgestellten Koordinatenrepräsentation in eine unsortierte Zeilen-CSR-Form einschließlich wiederholter Einträge. (2) Durchfegen der CSR-Form, während gleichzeitig das gewünschte Spaltenzeiger-Array der CSC-Form berechnet, wiederholte Einträge erkannt und die CSR-Form mit kombinierten wiederholten Einträgen neu verpackt wird; diese Phase ergibt eine unsortierte Zeilen-CSR-Form ohne wiederholte Einträge. (3) Zähl-Sortierung der vorhergehenden CSR-Form in eine vollständig sortierte CSC-Form ohne wiederholte Einträge.

Die Eingabearrays csrrowptr, csrcolval und csrnzval stellen den Speicher für die Zwischen-CSR-Formen dar und erfordern length(csrrowptr) >= m + 1, length(csrcolval) >= length(I) und length(csrnzval >= length(I)). Das Eingabearray klasttouch, der Arbeitsbereich für die zweite Phase, erfordert length(klasttouch) >= n. Optionale Eingabearrays csccolptr, cscrowval und cscnzval stellen den Speicher für die zurückgegebene CSC-Form S dar. Falls erforderlich, werden diese automatisch so angepasst, dass length(csccolptr) = n + 1, length(cscrowval) = nnz(S) und length(cscnzval) = nnz(S); daher genügt es, leere Vektoren des entsprechenden Typs (Vector{Ti}() und Vector{Tv}()) zu übergeben, oder die Methode sparse! aufzurufen, ohne cscrowval und cscnzval zu berücksichtigen.

Bei der Rückgabe enthalten csrrowptr, csrcolval und csrnzval eine unsortierte Spaltenrepräsentation der Transponierten des Ergebnisses.

Sie können den Speicher der Eingabearrays (I, J, V) für die Ausgabearrays (csccolptr, cscrowval, cscnzval) wiederverwenden. Zum Beispiel können Sie sparse!(I, J, V, csrrowptr, csrcolval, csrnzval, I, J, V) aufrufen. Beachten Sie, dass sie angepasst werden, um die oben genannten Bedingungen zu erfüllen.

Im Interesse der Effizienz führt diese Methode keine Argumentüberprüfung über 1 <= I[k] <= m und 1 <= J[k] <= n hinaus durch. Verwenden Sie sie mit Vorsicht. Es ist ratsam, mit --check-bounds=yes zu testen.

Diese Methode läuft in O(m, n, length(I)) Zeit. Der HALFPERM-Algorithmus, der in F. Gustavson, "Two fast algorithms for sparse matrices: multiplication and permuted transposition," ACM TOMS 4(3), 250-269 (1978) beschrieben wird, inspirierte die Verwendung eines Paares von Zähl-Sortierungen in dieser Methode.

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

Variante von sparse!, die die Eingangsvektoren (I, J, V) für die endgültige Matrixspeicherung wiederverwendet. Nach der Konstruktion werden die Eingangsvektoren die Matrixpuffer aliasieren; S.colptr === I, S.rowval === J und S.nzval === V gilt, und sie werden bei Bedarf resize!d.

Beachten Sie, dass einige Arbeitspuffer weiterhin zugewiesen werden. Insbesondere ist diese Methode ein praktischer Wrapper um sparse!(I, J, V, m, n, combine, klasttouch, csrrowptr, csrcolval, csrnzval, csccolptr, cscrowval, cscnzval), wobei diese Methode klasttouch, csrrowptr, csrcolval und csrnzval in geeigneter Größe zuweist, aber I, J und V für csccolptr, cscrowval und cscnzval wiederverwendet.

Die Argumente m, n und combine haben standardmäßig die Werte maximum(I), maximum(J) und +.

Julia 1.10

Diese Methode erfordert Julia-Version 1.10 oder höher.

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

Erstellt einen spärlichen Vektor S der Länge m, so dass S[I[k]] = V[k]. Duplikate werden mit der combine-Funktion kombiniert, die standardmäßig + ist, wenn kein combine-Argument angegeben ist, es sei denn, die Elemente von V sind Booleans, in diesem Fall ist combine standardmäßig |.

Beispiele

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])

Erstellt einen spärlichen Vektor der Länge m, wobei die Nicht-Null-Indizes Schlüssel aus dem Wörterbuch sind und die Nicht-Null-Werte die Werte aus dem Wörterbuch sind.

Beispiele

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

Konvertiere einen Vektor A in einen spärlichen Vektor der Länge m.

Beispiele

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}

Erstellt ein nicht initialisiertes veränderliches Array mit dem angegebenen Elementtyp, Indextyp und der Größe, basierend auf der gegebenen Quelle SparseMatrixCSC. Die neue spärliche Matrix behält die Struktur der ursprünglichen spärlichen Matrix bei, es sei denn, die Dimensionen der Ausgabematrix unterscheiden sich von der Ausgabe.

Die Ausgabematrix hat Nullen an denselben Stellen wie die Eingabe, aber nicht initialisierte Werte für die nicht nullen Stellen.

source
SparseArrays.issparseFunction
issparse(S)

Gibt true zurück, wenn S spärlich ist, und false andernfalls.

Beispiele

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)

Gibt die Anzahl der gespeicherten (gefüllten) Elemente in einem spärlichen Array zurück.

Beispiele

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} mit 3 gespeicherten Einträgen:
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

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

Gibt ein Tupel (I, J, V) zurück, wobei I und J die Zeilen- und Spaltenindizes der gespeicherten ("strukturell nicht null") Werte in der spärlichen Matrix A sind, und V ein Vektor der Werte ist.

Beispiele

julia> A = sparse([1 2 0; 0 0 3; 0 4 0])
3×3 SparseMatrixCSC{Int64, Int64} mit 4 gespeicherten Einträgen:
 1  2  ⋅
 ⋅  ⋅  3
 ⋅  4  ⋅

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

Erstellt einen spärlichen Vektor der Länge m oder eine spärliche Matrix der Größe m x n. Dieses spärliche Array wird keine Nicht-Null-Werte enthalten. Es wird während der Konstruktion kein Speicher für Nicht-Null-Werte reserviert. Der Typ ist standardmäßig Float64, wenn nicht angegeben.

Beispiele

julia> spzeros(3, 3)
3×3 SparseMatrixCSC{Float64, Int64} mit 0 gespeicherten Einträgen:
  ⋅    ⋅    ⋅
  ⋅    ⋅    ⋅
  ⋅    ⋅    ⋅

julia> spzeros(Float32, 4)
4-element SparseVector{Float32, Int64} mit 0 gespeicherten Einträgen
source
spzeros([type], I::AbstractVector, J::AbstractVector, [m, n])

Erstellen Sie eine spärliche Matrix S mit den Dimensionen m x n mit strukturellen Nullen bei S[I[k], J[k]].

Diese Methode kann verwendet werden, um das Sparsamkeitsmuster der Matrix zu konstruieren und ist effizienter als z.B. sparse(I, J, zeros(length(I))).

Für zusätzliche Dokumentation und einen Experten-Treiber siehe SparseArrays.spzeros!.

Julia 1.10

Diese Methode erfordert Julia-Version 1.10 oder höher.

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}

Elternteil und Expertenfahrer für spzeros(I, J), der es dem Benutzer ermöglicht, vorab zugewiesenen Speicher für Zwischenobjekte bereitzustellen. Diese Methode ist zu spzeros, was SparseArrays.sparse! zu sparse ist. Siehe Dokumentation für SparseArrays.sparse! für Details und erforderliche Pufferlängen.

Julia 1.10

Diese Methode erfordert Julia-Version 1.10 oder höher.

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

Variante von spzeros!, die die Eingangsvektoren I und J für die endgültige Matrixspeicherung wiederverwendet. Nach der Konstruktion werden die Eingangsvektoren die Matrixpuffer aliasieren; S.colptr === I und S.rowval === J gilt, und sie werden bei Bedarf resize!d.

Beachten Sie, dass einige Arbeitspuffer weiterhin zugewiesen werden. Insbesondere ist diese Methode ein praktischer Wrapper um spzeros!(Tv, I, J, m, n, klasttouch, csrrowptr, csrcolval, csccolptr, cscrowval), wobei diese Methode klasttouch, csrrowptr und csrcolval in geeigneter Größe zuweist, aber I und J für csccolptr und cscrowval wiederverwendet.

Die Argumente m und n haben standardmäßig den Wert maximum(I) und maximum(J).

Julia 1.10

Diese Methode erfordert Julia-Version 1.10 oder höher.

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

Konstruiere eine spärliche Diagonalmatrize aus `Pair`s von Vektoren und Diagonalen. Jeder Vektor `kv.second` wird auf der `kv.first` Diagonale platziert. Standardmäßig ist die Matrix quadratisch und ihre Größe wird aus `kv` abgeleitet, aber eine nicht-quadratische Größe `m`×`n` (mit Nullen aufgefüllt, falls erforderlich) kann angegeben werden, indem `m,n` als erste Argumente übergeben werden.

# Beispiele

jldoctest julia> spdiagm(-1 => [1,2,3,4], 1 => [4,3,2,1]) 5×5 SparseMatrixCSC{Int64, Int64} mit 8 gespeicherten Einträgen: ⋅ 4 ⋅ ⋅ ⋅ 1 ⋅ 3 ⋅ ⋅ ⋅ 2 ⋅ 2 ⋅ ⋅ ⋅ 3 ⋅ 1 ⋅ ⋅ ⋅ 4 ⋅ ```

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

Konstruiere eine spärliche Matrix mit den Elementen des Vektors als Diagonalelemente. Standardmäßig (ohne angegebenes m und n) ist die Matrix quadratisch und ihre Größe wird durch length(v) bestimmt, aber eine nicht-quadratische Größe m×n kann angegeben werden, indem m und n als die ersten Argumente übergeben werden.

Julia 1.6

Diese Funktionen erfordern mindestens Julia 1.6.

Beispiele

julia> spdiagm([1,2,3])
3×3 SparseMatrixCSC{Int64, Int64} mit 3 gespeicherten Einträgen:
 1  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  3

julia> spdiagm(sparse([1,0,3]))
3×3 SparseMatrixCSC{Int64, Int64} mit 2 gespeicherten Einträgen:
 1  ⋅  ⋅
 ⋅  ⋅  ⋅
 ⋅  ⋅  3
source
SparseArrays.sparse_hcatFunction
sparse_hcat(A...)

Verkettet entlang Dimension 2. Gibt ein SparseMatrixCSC-Objekt zurück.

Julia 1.8

Diese Methode wurde in Julia 1.8 hinzugefügt. Sie ahmt das frühere Verhaltensmuster der Verkettung nach, bei dem die Verkettung mit spezialisierten "sparse" Matrizenarten aus LinearAlgebra.jl automatisch spärliche Ausgaben erzeugte, selbst in Abwesenheit eines SparseArray-Arguments.

source
SparseArrays.sparse_vcatFunction
sparse_vcat(A...)

Verkettet entlang Dimension 1. Gibt ein SparseMatrixCSC-Objekt zurück.

Julia 1.8

Diese Methode wurde in Julia 1.8 hinzugefügt. Sie ahmt das frühere Verhaltensmuster der Verkettung nach, bei dem die Verkettung mit spezialisierten "sparse" Matrizenarten aus LinearAlgebra.jl automatisch spärliche Ausgaben erzeugte, selbst in Abwesenheit eines SparseArray-Arguments.

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

Sparse horizontale und vertikale Verkettung in einem Aufruf. Diese Funktion wird für die Blockmatrix-Syntax aufgerufen. Das erste Argument gibt die Anzahl der Argumente an, die in jeder Blockzeile verkettet werden sollen.

Julia 1.8

Diese Methode wurde in Julia 1.8 hinzugefügt. Sie ahmt das vorherige Verkettungsverhalten nach, bei dem die Verkettung mit spezialisierten "sparse" Matrizen aus LinearAlgebra.jl automatisch spärliche Ausgaben erzeugte, selbst in Abwesenheit eines SparseArray-Arguments.

source
SparseArrays.blockdiagFunction
blockdiag(A...)

Kombiniere Matrizen block-diagonal. Derzeit nur für spärliche Matrizen implementiert.

Beispiele

julia> blockdiag(sparse(2I, 3, 3), sparse(4I, 2, 2))
5×5 SparseMatrixCSC{Int64, Int64} mit 5 gespeicherten Einträgen:
 2  ⋅  ⋅  ⋅  ⋅
 ⋅  2  ⋅  ⋅  ⋅
 ⋅  ⋅  2  ⋅  ⋅
 ⋅  ⋅  ⋅  4  ⋅
 ⋅  ⋅  ⋅  ⋅  4
source
SparseArrays.sprandFunction
sprand([rng],[T::Type],m,[n],p::AbstractFloat)
sprand([rng],m,[n],p::AbstractFloat,[rfn=rand])

Erstellt einen zufälligen Längen m spärlichen Vektor oder eine m mal n spärliche Matrix, in der die Wahrscheinlichkeit, dass ein Element ungleich null ist, unabhängig durch p gegeben ist (und somit die durchschnittliche Dichte der Nicht-Null-Werte ebenfalls genau p beträgt). Das optionale Argument rng gibt einen Zufallszahlengenerator an, siehe Zufallszahlen. Das optionale Argument T gibt den Elementtyp an, der standardmäßig auf Float64 gesetzt ist.

Standardmäßig werden Nicht-Null-Werte aus einer gleichmäßigen Verteilung unter Verwendung der rand Funktion ausgewählt, d.h. durch rand(T) oder rand(rng, T), wenn rng angegeben ist; für das Standard T=Float64 entspricht dies Nicht-Null-Werten, die gleichmäßig in [0,1) ausgewählt werden.

Sie können Nicht-Null-Werte aus einer anderen Verteilung auswählen, indem Sie eine benutzerdefinierte rfn Funktion anstelle von rand übergeben. Dies sollte eine Funktion rfn(k) sein, die ein Array von k Zufallszahlen zurückgibt, die aus der gewünschten Verteilung ausgewählt wurden; alternativ, wenn rng angegeben ist, sollte es stattdessen eine Funktion rfn(rng, k) sein.

Beispiele

julia> sprand(Bool, 2, 2, 0.5)
2×2 SparseMatrixCSC{Bool, Int64} mit 2 gespeicherten Einträgen:
 1  1
 ⋅  ⋅

julia> sprand(Float64, 3, 0.75)
3-element SparseVector{Float64, Int64} mit 2 gespeicherten Einträgen:
  [1]  =  0.795547
  [2]  =  0.49425
source
SparseArrays.sprandnFunction
sprandn([rng][,Typ],m[,n],p::AbstractFloat)

Erstellt einen zufälligen spärlichen Vektor der Länge m oder eine spärliche Matrix der Größe m mal n mit der angegebenen (unabhängigen) Wahrscheinlichkeit p, dass ein Eintrag ungleich null ist, wobei ungleich null Werte aus der Normalverteilung entnommen werden. Das optionale Argument rng gibt einen Zufallszahlengenerator an, siehe Zufallszahlen.

Julia 1.1

Die Angabe des Ausgabeelementtyps Typ erfordert mindestens Julia 1.1.

Beispiele

julia> sprandn(2, 2, 0.75)
2×2 SparseMatrixCSC{Float64, Int64} mit 3 gespeicherten Einträgen:
 -1.20577     ⋅
  0.311817  -0.234641
source
SparseArrays.nonzerosFunction
nonzeros(A)

Gibt einen Vektor der strukturellen Nicht-Null-Werte im spärlichen Array A zurück. Dies umfasst Nullen, die explizit im spärlichen Array gespeichert sind. Der zurückgegebene Vektor verweist direkt auf den internen Nicht-Null-Speicher von A, und alle Änderungen am zurückgegebenen Vektor werden auch A verändern. Siehe rowvals und nzrange.

Beispiele

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} mit 3 gespeicherten Einträgen:
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

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

Gibt einen Vektor der Zeilenindizes von A zurück. Änderungen am zurückgegebenen Vektor wirken sich ebenfalls auf A aus. Der Zugriff darauf, wie die Zeilenindizes intern gespeichert sind, kann nützlich sein, um über strukturelle Nicht-Null-Werte zu iterieren. Siehe auch nonzeros und nzrange.

Beispiele

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} mit 3 gespeicherten Einträgen:
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

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

Gibt den Bereich der Indizes zu den strukturellen Nicht-Null-Werten einer Spalten eines spärlichen Matrizen zurück. In Verbindung mit nonzeros und rowvals ermöglicht dies ein bequemes Iterieren über eine spärliche Matrix:

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]
      # führe spärliche Zauberei aus...
   end
end
Warning

Das Hinzufügen oder Entfernen von Nicht-Null-Elementen zur Matrix kann die nzrange ungültig machen, man sollte die Matrix während des Iterierens nicht verändern.

source
nzrange(x::SparseVectorUnion, col)

Gibt den Bereich der Indizes zu den strukturellen Nicht-Null-Werten eines spärlichen Vektors an. Der Spaltenindex col wird ignoriert (angenommen, er ist 1).

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

Entfernt gespeicherte Werte aus A, deren absoluter Wert kleiner oder gleich tol ist.

source
droptol!(x::AbstractCompressedVector, tol)

Entfernt gespeicherte Werte aus x, deren absoluter Wert kleiner oder gleich tol ist.

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

Entfernt gespeicherte numerische Nullen aus x.

Für eine in-place Version siehe dropzeros. Für algorithmische Informationen siehe fkeep!.

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

Generiert eine Kopie von A und entfernt gespeicherte numerische Nullen aus dieser Kopie.

Für eine In-Place-Version und algorithmische Informationen siehe dropzeros!.

Beispiele

julia> A = sparse([1, 2, 3], [1, 2, 3], [1.0, 0.0, 1.0])
3×3 SparseMatrixCSC{Float64, Int64} mit 3 gespeicherten Einträgen:
 1.0   ⋅    ⋅
  ⋅   0.0   ⋅
  ⋅    ⋅   1.0

julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64, Int64} mit 2 gespeicherten Einträgen:
 1.0   ⋅    ⋅
  ⋅    ⋅    ⋅
  ⋅    ⋅   1.0
source
dropzeros(x::AbstractCompressedVector)

Erzeugt eine Kopie von x und entfernt numerische Nullen aus dieser Kopie.

Für eine In-Place-Version und algorithmische Informationen siehe dropzeros!.

Beispiele

julia> A = sparsevec([1, 2, 3], [1.0, 0.0, 1.0])
3-element SparseVector{Float64, Int64} mit 3 gespeicherten Einträgen:
  [1]  =  1.0
  [2]  =  0.0
  [3]  =  1.0

julia> dropzeros(A)
3-element SparseVector{Float64, Int64} mit 2 gespeicherten Einträgen:
  [1]  =  1.0
  [3]  =  1.0
source
SparseArrays.permuteFunction
permute(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
        q::AbstractVector{<:Integer}) where {Tv,Ti}

Bilateral permutieren von A, Rückgabe von PAQ (A[p,q]). Die Länge der Spaltenpermutation q muss mit der Anzahl der Spalten von A übereinstimmen (length(q) == size(A, 2)). Die Länge der Zeilenpermutation p muss mit der Anzahl der Zeilen von A übereinstimmen (length(p) == size(A, 1)).

Für erfahrene Benutzer und zusätzliche Informationen siehe permute!.

Beispiele

julia> A = spdiagm(0 => [1, 2, 3, 4], 1 => [5, 6, 7])
4×4 SparseMatrixCSC{Int64, Int64} mit 7 gespeicherten Einträgen:
 1  5  ⋅  ⋅
 ⋅  2  6  ⋅
 ⋅  ⋅  3  7
 ⋅  ⋅  ⋅  4

julia> permute(A, [4, 3, 2, 1], [1, 2, 3, 4])
4×4 SparseMatrixCSC{Int64, Int64} mit 7 gespeicherten Einträgen:
 ⋅  ⋅  ⋅  4
 ⋅  ⋅  3  7
 ⋅  2  6  ⋅
 1  5  ⋅  ⋅

julia> permute(A, [1, 2, 3, 4], [4, 3, 2, 1])
4×4 SparseMatrixCSC{Int64, Int64} mit 7 gespeicherten Einträgen:
 ⋅  ⋅  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}

Bilateral permutation von A, Speicherung des Ergebnisses PAQ (A[p,q]) in X. Speichert das Zwischenergebnis (AQ)^T (transpose(A[:,q])) im optionalen Argument C, falls vorhanden. Es wird vorausgesetzt, dass X, A und, falls vorhanden, C sich nicht gegenseitig aliasieren; um das Ergebnis PAQ zurück in A zu speichern, verwenden Sie die folgende Methode ohne X:

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

Die Dimensionen von X müssen mit denen von A übereinstimmen (size(X, 1) == size(A, 1) und size(X, 2) == size(A, 2)), und X muss über genügend Speicherplatz verfügen, um alle zugewiesenen Einträge in A aufzunehmen (length(rowvals(X)) >= nnz(A) und length(nonzeros(X)) >= nnz(A)). Die Länge der Spaltenpermutation q muss mit der Spaltenanzahl von A übereinstimmen (length(q) == size(A, 2)). Die Länge der Zeilenpermutation p muss mit der Zeilenanzahl von A übereinstimmen (length(p) == size(A, 1)).

Die Dimensionen von C müssen mit denen von transpose(A) übereinstimmen (size(C, 1) == size(A, 2) und size(C, 2) == size(A, 1)), und C muss über genügend Speicherplatz verfügen, um alle zugewiesenen Einträge in A aufzunehmen (length(rowvals(C)) >= nnz(A) und length(nonzeros(C)) >= nnz(A)).

Für zusätzliche (algorithmische) Informationen und für Versionen dieser Methoden, die auf die Argumentüberprüfung verzichten, siehe (nicht exportierte) Elternmethoden unchecked_noalias_permute! und unchecked_aliasing_permute!.

Siehe auch permute.

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

Spaltenumordnung und Transponierung von A, während gleichzeitig f auf jeden Eintrag von A angewendet wird, wobei das Ergebnis (f(A)Q)^T (map(f, transpose(A[:,q]))) in X gespeichert wird.

Der Elementtyp Tv von X muss mit f(::TvA) übereinstimmen, wobei TvA der Elementtyp von A ist. Die Dimensionen von X müssen mit denen von transpose(A) übereinstimmen (size(X, 1) == size(A, 2) und size(X, 2) == size(A, 1)), und X muss über genügend Speicherplatz verfügen, um alle zugewiesenen Einträge in A aufzunehmen (length(rowvals(X)) >= nnz(A) und length(nonzeros(X)) >= nnz(A)). Die Länge der Spaltenpermutation q muss mit der Spaltenanzahl von A übereinstimmen (length(q) == size(A, 2)).

Diese Methode ist die Elternmethode mehrerer Methoden, die Transpositions- und Permutationsoperationen auf SparseMatrixCSCs durchführen. Da diese Methode keine Argumentüberprüfung durchführt, sollten die sichereren Kindmethoden ([c]transpose[!], permute[!]) der direkten Verwendung vorgezogen werden.

Diese Methode implementiert den HALFPERM-Algorithmus, der in F. Gustavson, "Two fast algorithms for sparse matrices: multiplication and permuted transposition," ACM TOMS 4(3), 250-269 (1978) beschrieben ist. Der Algorithmus läuft in O(size(A, 1), size(A, 2), nnz(A)) Zeit und benötigt keinen zusätzlichen Speicher über das hinaus, was übergeben wird.

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

Transponiere A und speichere es in X, während die Funktion f auf die Nicht-Null-Elemente angewendet wird. Entfernt nicht die Nullen, die durch f erzeugt werden. size(X) muss gleich size(transpose(A)) sein. Es wird kein zusätzlicher Speicher zugewiesen, außer wenn die rowval und nzval von X bei Bedarf geändert werden.

Siehe halfperm!

source

Sparse Linear Algebra API

LinearAlgebra.choleskyFunction
cholesky(A, NoPivot(); check = true) -> Cholesky

Berechnen Sie die Cholesky-Zerlegung einer dichten symmetrischen positiv definiten Matrix A und geben Sie eine Cholesky Zerlegung zurück. Die Matrix A kann entweder eine Symmetric oder Hermitian AbstractMatrix oder eine perfekt symmetrische oder hermitische AbstractMatrix sein.

Der dreieckige Cholesky-Faktor kann aus der Zerlegung F über F.L und F.U erhalten werden, wobei A ≈ F.U' * F.U ≈ F.L * F.L'.

Die folgenden Funktionen sind für Cholesky-Objekte verfügbar: size, \, inv, det, logdet und isposdef.

Wenn Sie eine Matrix A haben, die aufgrund von Rundungsfehlern bei ihrer Konstruktion leicht nicht-hermitisch ist, wickeln Sie sie in Hermitian(A) ein, bevor Sie sie an cholesky übergeben, um sie als perfekt hermitisch zu behandeln.

Wenn check = true, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Beispiele

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-Faktor:
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

Berechnen Sie die pivotierte Cholesky-Zerlegung einer dichten symmetrischen positiv semi-definierten Matrix A und geben Sie eine CholeskyPivoted Zerlegung zurück. Die Matrix A kann entweder eine Symmetric oder Hermitian AbstractMatrix oder eine perfekt symmetrische oder hermitische AbstractMatrix sein.

Der dreieckige Cholesky-Faktor kann aus der Zerlegung F über F.L und F.U sowie die Permutation über F.p erhalten werden, wobei A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' mit Ur = F.U[1:F.rank, :] und Lr = F.L[:, 1:F.rank], oder alternativ A ≈ Up' * Up ≈ Lp * Lp' mit Up = F.U[1:F.rank, invperm(F.p)] und Lp = F.L[invperm(F.p), 1:F.rank].

Die folgenden Funktionen sind für CholeskyPivoted-Objekte verfügbar: size, \, inv, det und rank.

Das Argument tol bestimmt die Toleranz zur Bestimmung des Rangs. Bei negativen Werten ist die Toleranz die Maschinenpräzision.

Wenn Sie eine Matrix A haben, die aufgrund von Rundungsfehlern bei ihrer Konstruktion leicht nicht-hermitisch ist, wickeln Sie sie in Hermitian(A) ein, bevor Sie sie an cholesky übergeben, um sie als perfekt hermitisch zu behandeln.

Wenn check = true, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Beispiele

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-Faktor mit 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; # Destrukturierung über Iteration

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

Berechnen Sie die Cholesky-Zerlegung einer spärlichen positiv definiten Matrix A. A muss eine SparseMatrixCSC oder eine Symmetric/Hermitian Ansicht einer SparseMatrixCSC sein. Beachten Sie, dass A, auch wenn es nicht den Typ-Tag hat, dennoch symmetrisch oder hermitisch sein muss. Wenn perm nicht angegeben ist, wird eine füllreduzierende Permutation verwendet. F = cholesky(A) wird am häufigsten verwendet, um Gleichungssysteme mit F\b zu lösen, aber auch die Methoden diag, det und logdet sind für F definiert. Sie können auch einzelne Faktoren aus F extrahieren, indem Sie F.L verwenden. Da das Pivotieren standardmäßig aktiviert ist, wird die Zerlegung intern als A == P'*L*L'*P mit einer Permutationsmatrix P dargestellt; die Verwendung von nur L ohne Berücksichtigung von P führt zu falschen Ergebnissen. Um die Auswirkungen der Permutation einzubeziehen, ist es typischerweise vorzuziehen, "kombinierte" Faktoren wie PtL = F.PtL (das Äquivalent von P'*L) und LtP = F.UP (das Äquivalent von L'*P) zu extrahieren.

Wenn check = true, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Durch Setzen des optionalen Schlüsselwortarguments shift wird die Zerlegung von A+shift*I anstelle von A berechnet. Wenn das Argument perm angegeben ist, sollte es eine Permutation von 1:size(A,1) sein, die die zu verwendende Reihenfolge angibt (anstatt der standardmäßigen AMD-Reihenfolge von CHOLMOD).

Beispiele

Im folgenden Beispiel wird die füllreduzierende Permutation verwendet: [3, 2, 1]. Wenn perm auf 1:3 gesetzt wird, um keine Permutation zu erzwingen, beträgt die Anzahl der Nicht-Null-Elemente im Faktor 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} mit 3 gespeicherten Einträgen:
  ⋅    ⋅   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

Diese Methode verwendet die CHOLMOD[ACM887][DavisHager2009] Bibliothek von SuiteSparse. CHOLMOD unterstützt nur reale oder komplexe Typen in einfacher oder doppelter Präzision. Eingabematrizen, die nicht diesen Elementtypen entsprechen, werden bei Bedarf in diese Typen konvertiert.

Viele andere Funktionen von CHOLMOD sind umschlossen, aber nicht aus dem Modul Base.SparseArrays.CHOLMOD exportiert.

source
LinearAlgebra.cholesky!Function
cholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky

Das gleiche wie cholesky, aber spart Speicher, indem es die Eingabe A überschreibt, anstatt eine Kopie zu erstellen. Eine InexactError Ausnahme wird ausgelöst, wenn die Faktorisierung eine Zahl produziert, die vom Elementtyp von A nicht darstellbar ist, z. B. für Ganzzahltypen.

Beispiele

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

Das gleiche wie cholesky, aber spart Speicherplatz, indem es die Eingabe A überschreibt, anstatt eine Kopie zu erstellen. Eine InexactError Ausnahme wird ausgelöst, wenn die Faktorisierung eine Zahl produziert, die vom Elementtyp von A nicht darstellbar ist, z. B. für Ganzzahltypen.

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

Berechne die Cholesky ($LL'$) Faktorisierung von A, indem die symbolische Faktorisierung F wiederverwendet wird. A muss eine SparseMatrixCSC oder eine Symmetric/ Hermitian Ansicht einer SparseMatrixCSC sein. Beachte, dass A, auch wenn es nicht den Typ-Tag hat, dennoch symmetrisch oder hermitesch sein muss.

Siehe auch cholesky.

!!! Hinweis Diese Methode verwendet die CHOLMOD-Bibliothek von SuiteSparse, die nur reale oder komplexe Typen in einfacher oder doppelter Präzision unterstützt. Eingabematrizen, die nicht diesen Elementtypen entsprechen, werden bei Bedarf in diese Typen umgewandelt.

source
LinearAlgebra.lowrankupdateFunction
lowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky

Aktualisiert eine Cholesky-Faktorisierung C mit dem Vektor v. Wenn A = C.U'C.U dann ist CC = cholesky(C.U'C.U + v*v'), aber die Berechnung von CC verwendet nur O(n^2) Operationen.

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

Erhalten Sie eine LDLt-Faktorisierung von A + C*C', gegeben eine LDLt- oder LLt-Faktorisierung F von A.

Der zurückgegebene Faktor ist immer eine LDLt-Faktorisierung.

Siehe auch lowrankupdate!, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankupdate!Function
lowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky

Aktualisiert eine Cholesky-Faktorisierung C mit dem Vektor v. Wenn A = C.U'C.U dann ist CC = cholesky(C.U'C.U + v*v'), aber die Berechnung von CC verwendet nur O(n^2) Operationen. Die Eingabefaktorisierung C wird vor Ort aktualisiert, sodass beim Verlassen C == CC gilt. Der Vektor v wird während der Berechnung zerstört.

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

Aktualisiert eine LDLt- oder LLt-Faktorisierung F von A zu einer Faktorisierung von A + C*C'.

LLt-Faktorisierungen werden in LDLt umgewandelt.

Siehe auch lowrankupdate, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankdowndateFunction
lowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky

Führen Sie eine Downdate einer Cholesky-Faktorisierung C mit dem Vektor v durch. Wenn A = C.U'C.U dann ist CC = cholesky(C.U'C.U - v*v'), aber die Berechnung von CC verwendet nur O(n^2) Operationen.

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

Erhalte eine LDLt-Faktorisierung von A + C*C', gegeben eine LDLt- oder LLt-Faktorisierung F von A.

Der zurückgegebene Faktor ist immer eine LDLt-Faktorisierung.

Siehe auch lowrankdowndate!, lowrankupdate, lowrankupdate!.

source
LinearAlgebra.lowrankdowndate!Function
lowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky

Aktualisieren Sie eine Cholesky-Faktorisierung C mit dem Vektor v. Wenn A = C.U'C.U dann ist CC = cholesky(C.U'C.U - v*v'), aber die Berechnung von CC verwendet nur O(n^2) Operationen. Die Eingabefaktorisierung C wird vor Ort aktualisiert, sodass beim Verlassen C == CC gilt. Der Vektor v wird während der Berechnung zerstört.

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

Aktualisiert eine LDLt- oder LLt-Faktorisierung F von A zu einer Faktorisierung von A - C*C'.

LLt-Faktorisierungen werden in LDLt umgewandelt.

Siehe auch lowrankdowndate, lowrankupdate, lowrankupdate!.

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

Aktualisieren Sie eine LDLt- oder LLt-Faktorisierung F von A zu einer Faktorisierung von A ± C*C'.

Wenn eine spärlichkeitserhaltende Faktorisierung verwendet wird, d.h. L*L' == P*A*P', dann wird der neue Faktor L*L' == P*A*P' + C'*C

update: Cint(1) für A + CC', Cint(0) für A - CC'

source
LinearAlgebra.ldltFunction
ldlt(S::SymTridiagonal) -> LDLt

Berechne eine LDLt (d.h. $LDL^T$) Faktorisierung der reellen symmetrischen tridiagonalen Matrix S, sodass S = L*Diagonal(d)*L', wobei L eine einheitsuntere Dreiecksmatrix und d ein Vektor ist. Der Hauptzweck einer LDLt-Faktorisierung F = ldlt(S) besteht darin, das lineare Gleichungssystem Sx = b mit F\b zu lösen.

Siehe auch bunchkaufman für eine ähnliche, aber pivotierte Faktorisierung beliebiger symmetrischer oder hermitescher Matrizen.

Beispiele

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

Berechnen Sie die $LDL'$-Faktorisierung einer spärlichen Matrix A. A muss eine SparseMatrixCSC oder eine Symmetric/Hermitian Ansicht einer SparseMatrixCSC sein. Beachten Sie, dass A, auch wenn es nicht den Typ-Tag hat, dennoch symmetrisch oder hermitesch sein muss. Eine füllreduzierende Permutation wird verwendet. F = ldlt(A) wird am häufigsten verwendet, um Gleichungssysteme A*x = b mit F\b zu lösen. Das zurückgegebene Faktorisierungsobjekt F unterstützt auch die Methoden diag, det, logdet und inv. Sie können einzelne Faktoren aus F mit F.L extrahieren. Da jedoch das Pivoting standardmäßig aktiviert ist, wird die Faktorisierung intern als A == P'*L*D*L'*P mit einer Permutationsmatrix P dargestellt; die Verwendung von nur L ohne Berücksichtigung von P führt zu falschen Ergebnissen. Um die Auswirkungen der Permutation einzubeziehen, ist es typischerweise vorzuziehen, "kombinierte" Faktoren wie PtL = F.PtL (das Äquivalent von P'*L) und LtP = F.UP (das Äquivalent von L'*P) zu extrahieren. Die vollständige Liste der unterstützten Faktoren ist :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP.

Wenn check = true, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Durch Setzen des optionalen Schlüsselwortarguments shift wird die Faktorisierung von A+shift*I anstelle von A berechnet. Wenn das Argument perm bereitgestellt wird, sollte es eine Permutation von 1:size(A,1) sein, die die zu verwendende Reihenfolge angibt (anstatt der standardmäßigen AMD-Reihenfolge von CHOLMOD).

!!! Hinweis Diese Methode verwendet die CHOLMOD[ACM887][DavisHager2009] Bibliothek von SuiteSparse. CHOLMOD unterstützt nur reale oder komplexe Typen in einfacher oder doppelter Präzision. Eingabematrizen, die nicht diesen Elementtypen entsprechen, werden bei Bedarf in diese Typen konvertiert.

Viele andere Funktionen von CHOLMOD sind verpackt, aber nicht aus dem Modul `Base.SparseArrays.CHOLMOD` exportiert.
source
LinearAlgebra.luFunction
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

Berechnen Sie die LU-Zerlegung einer spärlichen Matrix A.

Für spärliche A mit reellem oder komplexem Elementtyp ist der Rückgabewert von F UmfpackLU{Tv, Ti}, wobei Tv = Float64 oder ComplexF64 entsprechend und Ti ein ganzzahliger Typ (Int32 oder Int64) ist.

Wenn check = true, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Der Permutationsvektor q kann entweder ein Permutationsvektor oder nothing sein. Wenn kein Permutationsvektor bereitgestellt wird oder q nothing ist, wird das Standardverhalten von UMFPACK verwendet. Wenn die Permutation nicht nullbasiert ist, wird eine nullbasierte Kopie erstellt.

Der control-Vektor hat standardmäßig die Standardkonfiguration des Julia SparseArrays-Pakets für UMFPACK (NB: dies wurde von den UMFPACK-Standardeinstellungen geändert, um die iterative Verfeinerung zu deaktivieren), kann jedoch geändert werden, indem ein Vektor der Länge UMFPACK_CONTROL übergeben wird. Siehe das UMFPACK-Handbuch für mögliche Konfigurationen. Um beispielsweise die iterative Verfeinerung wieder zu aktivieren:

umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # Julia-Standardkonfiguration für eine Float64-spärliche Matrix lesen
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # optional - Werte anzeigen
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # iterative Verfeinerung wieder aktivieren (2 ist UMFPACK-Standard für maximale Schritte der iterativen Verfeinerung)

Alu = lu(A; control = umfpack_control)
x = Alu \ b   # löse Ax = b, einschließlich der iterativen Verfeinerung von UMFPACK

Die einzelnen Komponenten der Zerlegung F können durch Indizierung zugegriffen werden:

KomponenteBeschreibung
LL (untere Dreiecksmatrix) Teil von LU
UU (obere Dreiecksmatrix) Teil von LU
prechte Permutation Vector
qlinke Permutation Vector
RsVector der Skalierungsfaktoren
:(L,U,p,q,Rs) Komponenten

Die Beziehung zwischen F und A ist

F.L*F.U == (F.Rs .* A)[F.p, F.q]

F unterstützt außerdem die folgenden Funktionen:

Siehe auch lu!

!!! Hinweis lu(A::AbstractSparseMatrixCSC) verwendet die UMFPACK[ACM832] Bibliothek, die Teil von SuiteSparse ist. Da diese Bibliothek nur spärliche Matrizen mit Float64 oder ComplexF64-Elementen unterstützt, konvertiert lu A in eine Kopie, die vom Typ SparseMatrixCSC{Float64} oder SparseMatrixCSC{ComplexF64} ist, je nach Bedarf.

source
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU

Berechnen Sie die LU-Zerlegung von A.

Wenn check = true ist, wird ein Fehler ausgelöst, wenn die Zerlegung fehlschlägt. Wenn check = false ist, liegt die Verantwortung für die Überprüfung der Gültigkeit der Zerlegung (über issuccess) beim Benutzer.

Standardmäßig wird mit check = true auch ein Fehler ausgelöst, wenn die Zerlegung gültige Faktoren produziert, aber der obere dreieckige Faktor U rangdefizient ist. Dies kann geändert werden, indem allowsingular = true übergeben wird.

In den meisten Fällen, wenn A ein Subtyp S von AbstractMatrix{T} mit einem Elementtyp T ist, der +, -, * und / unterstützt, ist der Rückgabetyp LU{T,S{T}}.

Im Allgemeinen umfasst die LU-Zerlegung eine Permutation der Zeilen der Matrix (entsprechend der F.p Ausgabe, die unten beschrieben ist), bekannt als "Pivotierung" (weil sie entspricht, welche Zeile den "Pivot" enthält, den diagonalen Eintrag von F.U). Eine der folgenden Pivotierungsstrategien kann über das optionale Argument pivot ausgewählt werden:

  • RowMaximum() (Standard): die Standard-Pivotierungsstrategie; der Pivot entspricht dem Element mit dem maximalen Absolutwert unter den verbleibenden, zu zerlegenden Zeilen. Diese Pivotierungsstrategie erfordert, dass der Elementtyp auch abs und < unterstützt. (Dies ist im Allgemeinen die einzige numerisch stabile Option für Gleitkommatrizen.)
  • RowNonZero(): der Pivot entspricht dem ersten nicht-null Element unter den verbleibenden, zu zerlegenden Zeilen. (Dies entspricht der typischen Wahl in Handberechnungen und ist auch nützlich für allgemeinere algebraische Zahlentypen, die iszero unterstützen, aber nicht abs oder <.)
  • NoPivot(): Pivotierung deaktiviert (schlägt fehl, wenn ein Null-Eintrag in einer Pivot-Position auftritt, selbst wenn allowsingular = true).

Die einzelnen Komponenten der Zerlegung F können über getproperty abgerufen werden:

KomponenteBeschreibung
F.LL (untere dreieckige) Teil von LU
F.UU (obere dreieckige) Teil von LU
F.p(rechte) Permutation Vector
F.P(rechte) Permutation Matrix

Die Iteration über die Zerlegung produziert die Komponenten F.L, F.U und F.p.

Die Beziehung zwischen F und A ist

F.L*F.U == A[F.p, :]

F unterstützt außerdem die folgenden Funktionen:

Unterstützte FunktionLULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

Das Schlüsselwortargument allowsingular wurde in Julia 1.11 hinzugefügt.

Beispiele

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-Faktor:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U-Faktor:
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); # Destrukturierung über Iteration

julia> l == F.L && u == F.U && p == F.p
true

julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L-Faktor:
2×2 Matrix{Float64}:
 1.0  0.0
 1.0  1.0
U-Faktor (rangdefizient):
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

Berechnen Sie die QR-Faktorisierung einer spärlichen Matrix A. Es werden zeilen- und spaltenreduzierende Permutationen verwendet, sodass F.R = F.Q'*A[F.prow,F.pcol]. Die Hauptanwendung dieses Typs besteht darin, kleinste Quadrate oder unterbestimmte Probleme mit \ zu lösen. Die Funktion ruft die C-Bibliothek SPQR[ACM933] auf.

!!! Hinweis qr(A::SparseMatrixCSC) verwendet die SPQR-Bibliothek, die Teil von SuiteSparse ist. Da diese Bibliothek nur spärliche Matrizen mit Float64 oder ComplexF64-Elementen unterstützt, konvertiert qr ab Julia v1.4 A in eine Kopie, die vom Typ SparseMatrixCSC{Float64} oder SparseMatrixCSC{ComplexF64} ist, je nach Bedarf.

Beispiele

julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} mit 4 gespeicherten Einträgen:
 1.0   ⋅
 1.0   ⋅
  ⋅   1.0
  ⋅   1.0

julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q-Faktor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R-Faktor:
2×2 SparseMatrixCSC{Float64, Int64} mit 2 gespeicherten Einträgen:
 -1.41421    ⋅
   ⋅       -1.41421
Zeilenpermutation:
4-element Vector{Int64}:
 1
 3
 4
 2
Spaltenpermutation:
2-element Vector{Int64}:
 1
 2
source
qr(A, pivot = NoPivot(); blocksize) -> F

Berechne die QR-Zerlegung der Matrix A: eine orthogonale (oder unitäre, wenn A komplexwertig ist) Matrix Q und eine obere Dreiecksmatrix R, sodass

\[A = Q R\]

Das zurückgegebene Objekt F speichert die Zerlegung in einem kompakten Format:

  • wenn pivot == ColumnNorm() dann ist F ein QRPivoted Objekt,
  • andernfalls, wenn der Elementtyp von A ein BLAS-Typ ist (Float32, Float64, ComplexF32 oder ComplexF64), dann ist F ein QRCompactWY Objekt,
  • andernfalls ist F ein QR Objekt.

Die einzelnen Komponenten der Zerlegung F können über Eigenschaftsaccessoren abgerufen werden:

  • F.Q: die orthogonale/unitäre Matrix Q
  • F.R: die obere Dreiecksmatrix R
  • F.p: der Permutationsvektor des Pivots (QRPivoted nur)
  • F.P: die Permutationsmatrix des Pivots (QRPivoted nur)

!!! Hinweis Jeder Zugriff auf den oberen Dreifaktor über F.R allokiert ein neues Array. Es ist daher ratsam, dieses Array zu cachen, z.B. durch R = F.R und weiter mit R zu arbeiten.

Die Iteration der Zerlegung erzeugt die Komponenten Q, R und, falls vorhanden, p.

Die folgenden Funktionen sind für die QR-Objekte verfügbar: inv, size und \. Wenn A rechteckig ist, gibt \ eine Lösung der kleinsten Quadrate zurück, und wenn die Lösung nicht eindeutig ist, wird die mit der kleinsten Norm zurückgegeben. Wenn A nicht vollen Rang hat, ist eine Zerlegung mit (Spalten-)Pivotierung erforderlich, um eine Lösung mit minimaler Norm zu erhalten.

Die Multiplikation in Bezug auf entweder volle/quadratische oder nicht volle/quadratische Q ist erlaubt, d.h. sowohl F.Q*F.R als auch F.Q*A werden unterstützt. Eine Q-Matrix kann mit Matrix in eine reguläre Matrix umgewandelt werden. Diese Operation gibt den "dünnen" Q-Faktor zurück, d.h., wenn A m×n mit m>=n ist, dann ergibt Matrix(F.Q) eine m×n Matrix mit orthonormalen Spalten. Um den "vollen" Q-Faktor, eine m×m orthogonale Matrix, abzurufen, verwenden Sie F.Q*I oder collect(F.Q). Wenn m<=n, dann ergibt Matrix(F.Q) eine m×m orthogonale Matrix.

Die Blockgröße für die QR-Zerlegung kann durch das Schlüsselwort-Argument blocksize :: Integer angegeben werden, wenn pivot == NoPivot() und A isa StridedMatrix{<:BlasFloat}. Es wird ignoriert, wenn blocksize > minimum(size(A)). Siehe QRCompactWY.

!!! Kompatibilität "Julia 1.4" Das Schlüsselwort-Argument blocksize erfordert Julia 1.4 oder höher.

Beispiele

julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
 3.0  -6.0
 4.0  -8.0
 0.0   1.0

julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q-Faktor: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R-Faktor:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

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

!!! Hinweis qr gibt mehrere Typen zurück, da LAPACK mehrere Darstellungen verwendet, die die Speicheranforderungen für Produkte von Householder-Elementarreflektoren minimieren, sodass die Q- und R-Matrizen kompakt gespeichert werden können, anstatt als zwei separate dichte Matrizen.

source

Noteworthy External Sparse Packages

Mehrere andere Julia-Pakete bieten Implementierungen von spärlichen Matrizen, die erwähnt werden sollten:

  1. SuiteSparseGraphBLAS.jl ist ein Wrapper über die schnelle, multithreaded SuiteSparse:GraphBLAS C-Bibliothek. Auf der CPU ist dies typischerweise die schnellste Option, die oft MKLSparse erheblich übertrifft.

  2. CUDA.jl exponiert die CUSPARSE Bibliothek für GPU-sparsame Matrixoperationen.

  3. SparseMatricesCSR.jl bietet eine native Julia-Implementierung des Compressed Sparse Rows (CSR) Formats.

  4. MKLSparse.jl beschleunigt SparseArrays sparse-dense Matrixoperationen mit Intels MKL-Bibliothek.

  5. SparseArrayKit.jl verfügbar für mehrdimensionale spärliche Arrays.

  6. LuxurySparse.jl bietet statische spärliche Array-Formate sowie ein Koordinatenformat.

  7. ExtendableSparse.jl ermöglicht eine schnelle Einfügung in spärliche Matrizen unter Verwendung eines faulen Ansatzes für neue gespeicherte Indizes.

  8. Finch.jl unterstützt umfangreiche multidimensionale spärliche Array-Formate und -Operationen durch eine Mini-Tensor-Sprache und einen Compiler, alles in nativem Julia. Unterstützung für COO, CSF, CSR, CSC und mehr, sowie Operationen wie Broadcast, Reduce usw. und benutzerdefinierte Operationen.

Externe Pakete, die spärliche direkte Solver bereitstellen:

  1. KLU.jl
  2. Pardiso.jl

Externe Pakete, die Löser für die iterative Lösung von Eigenwertsystemen und singulären Wertzerlegungen bereitstellen:

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

Externe Pakete zur Arbeit mit Graphen:

  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–-eine unsymmetrische Muster-Multifrontal-Methode. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
  • ACM933Foster, L. V., & Davis, T. A. (2013). Algorithmus 933: Zuverlässige Berechnung des numerischen Rangs, der Nullraum-Basen, der Pseudoinversen Lösungen und der grundlegenden Lösungen unter Verwendung von SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116