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.
Sparse | Dense | Description |
---|---|---|
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:
Type | Description |
---|---|
CHOLMOD.Factor | Cholesky and LDLt factorizations |
UMFPACK.UmfpackLU | LU factorization |
SPQR.QRSparse | QR factorization |
Diese Faktorisierungen werden ausführlicher beschrieben in der Sparse Linear Algebra API section:
SparseArrays API
SparseArrays.AbstractSparseArray
— TypeAbstractSparseArray{Tv,Ti,N}
Obertyp für N
-dimensionale spärliche Arrays (oder array-ähnliche Typen) mit Elementen des Typs Tv
und Indextyp Ti
. SparseMatrixCSC
, SparseVector
und SuiteSparse.CHOLMOD.Sparse
sind Untertypen davon.
SparseArrays.AbstractSparseVector
— TypeAbstractSparseVector{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}
.
SparseArrays.AbstractSparseMatrix
— TypeAbstractSparseMatrix{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}
.
SparseArrays.SparseVector
— TypeSparseVector{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.
SparseArrays.SparseMatrixCSC
— TypeSparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}
Matrixtyp zum Speichern von spärlichen Matrizen im Compressed Sparse Column Format. Die Standardmethode zur Konstruktion von SparseMatrixCSC erfolgt über die sparse
Funktion. Siehe auch spzeros
, spdiagm
und sprand
.
SparseArrays.sparse
— Functionsparse(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
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
SparseArrays.sparse!
— Functionsparse!(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 SparseMatrixCSC
s 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.
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 +
.
Diese Methode erfordert Julia-Version 1.10 oder höher.
SparseArrays.sparsevec
— Functionsparsevec(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
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
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
Base.similar
— Methodsimilar(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.
SparseArrays.issparse
— Functionissparse(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
SparseArrays.nnz
— Functionnnz(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
SparseArrays.findnz
— Functionfindnz(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])
SparseArrays.spzeros
— Functionspzeros([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
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!
.
Diese Methode erfordert Julia-Version 1.10 oder höher.
SparseArrays.spzeros!
— Functionspzeros!(::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.
Diese Methode erfordert Julia-Version 1.10 oder höher.
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)
.
Diese Methode erfordert Julia-Version 1.10 oder höher.
SparseArrays.spdiagm
— Functionspdiagm(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 ⋅ ```
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.
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
SparseArrays.sparse_hcat
— Functionsparse_hcat(A...)
Verkettet entlang Dimension 2. Gibt ein SparseMatrixCSC-Objekt zurück.
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.
SparseArrays.sparse_vcat
— Functionsparse_vcat(A...)
Verkettet entlang Dimension 1. Gibt ein SparseMatrixCSC-Objekt zurück.
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.
SparseArrays.sparse_hvcat
— Functionsparse_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.
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.
SparseArrays.blockdiag
— Functionblockdiag(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
SparseArrays.sprand
— Functionsprand([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
SparseArrays.sprandn
— Functionsprandn([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.
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
SparseArrays.nonzeros
— Functionnonzeros(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
SparseArrays.rowvals
— Functionrowvals(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
SparseArrays.nzrange
— Functionnzrange(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
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.
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
).
SparseArrays.droptol!
— Functiondroptol!(A::AbstractSparseMatrixCSC, tol)
Entfernt gespeicherte Werte aus A
, deren absoluter Wert kleiner oder gleich tol
ist.
droptol!(x::AbstractCompressedVector, tol)
Entfernt gespeicherte Werte aus x
, deren absoluter Wert kleiner oder gleich tol
ist.
SparseArrays.dropzeros!
— Functiondropzeros!(x::AbstractCompressedVector)
Entfernt gespeicherte numerische Nullen aus x
.
Für eine in-place Version siehe dropzeros
. Für algorithmische Informationen siehe fkeep!
.
SparseArrays.dropzeros
— Functiondropzeros(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
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
SparseArrays.permute
— Functionpermute(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 ⋅ ⋅ ⋅
Base.permute!
— Methodpermute!(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
.
SparseArrays.halfperm!
— Functionhalfperm!(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 SparseMatrixCSC
s 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.
SparseArrays.ftranspose!
— Functionftranspose!(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!
Sparse Linear Algebra API
LinearAlgebra.cholesky
— Functioncholesky(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
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
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
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.
LinearAlgebra.cholesky!
— Functioncholesky!(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:
[...]
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.
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.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(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.
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!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(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.
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!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(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.
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!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(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.
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!
.
SparseArrays.CHOLMOD.lowrankupdowndate!
— Functionlowrankupdowndate!(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'
LinearAlgebra.ldlt
— Functionldlt(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
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.
LinearAlgebra.lu
— Functionlu(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:
Komponente | Beschreibung |
---|---|
L | L (untere Dreiecksmatrix) Teil von LU |
U | U (obere Dreiecksmatrix) Teil von LU |
p | rechte Permutation Vector |
q | linke Permutation Vector |
Rs | Vector 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.
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 auchabs
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, dieiszero
unterstützen, aber nichtabs
oder<
.)NoPivot()
: Pivotierung deaktiviert (schlägt fehl, wenn ein Null-Eintrag in einer Pivot-Position auftritt, selbst wennallowsingular = true
).
Die einzelnen Komponenten der Zerlegung F
können über getproperty
abgerufen werden:
Komponente | Beschreibung |
---|---|
F.L | L (untere dreieckige) Teil von LU |
F.U | U (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 Funktion | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
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
LinearAlgebra.qr
— Functionqr(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
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 istF
einQRPivoted
Objekt, - andernfalls, wenn der Elementtyp von
A
ein BLAS-Typ ist (Float32
,Float64
,ComplexF32
oderComplexF64
), dann istF
einQRCompactWY
Objekt, - andernfalls ist
F
einQR
Objekt.
Die einzelnen Komponenten der Zerlegung F
können über Eigenschaftsaccessoren abgerufen werden:
F.Q
: die orthogonale/unitäre MatrixQ
F.R
: die obere DreiecksmatrixR
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.
Noteworthy External Sparse Packages
Mehrere andere Julia-Pakete bieten Implementierungen von spärlichen Matrizen, die erwähnt werden sollten:
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.
CUDA.jl exponiert die CUSPARSE Bibliothek für GPU-sparsame Matrixoperationen.
SparseMatricesCSR.jl bietet eine native Julia-Implementierung des Compressed Sparse Rows (CSR) Formats.
MKLSparse.jl beschleunigt SparseArrays sparse-dense Matrixoperationen mit Intels MKL-Bibliothek.
SparseArrayKit.jl verfügbar für mehrdimensionale spärliche Arrays.
LuxurySparse.jl bietet statische spärliche Array-Formate sowie ein Koordinatenformat.
ExtendableSparse.jl ermöglicht eine schnelle Einfügung in spärliche Matrizen unter Verwendung eines faulen Ansatzes für neue gespeicherte Indizes.
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:
Externe Pakete, die Löser für die iterative Lösung von Eigenwertsystemen und singulären Wertzerlegungen bereitstellen:
Externe Pakete zur Arbeit mit Graphen:
- 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