Sparse Arrays
Julia, seyrek vektörler ve sparse matrices için SparseArrays
stdlib modülünde destek sunmaktadır. Seyrek diziler, yeterince sıfır içeren dizilerdir; bu dizileri özel bir veri yapısında saklamak, yoğun dizilere kıyasla alan ve yürütme süresinde tasarruf sağlar.
Farklı seyrek depolama türlerini, çok boyutlu seyrek dizileri ve daha fazlasını uygulayan harici paketler Noteworthy External Sparse Packages içinde bulunabilir.
Compressed Sparse Column (CSC) Sparse Matrix Storage
Julia'da seyrek matrisler Compressed Sparse Column (CSC) format içinde saklanır. Julia seyrek matrislerinin tipi SparseMatrixCSC{Tv,Ti}
şeklindedir; burada Tv
saklanan değerlerin tipi ve Ti
sütun işaretçileri ve satır indekslerini saklamak için kullanılan tam sayı tipidir. SparseMatrixCSC
'nin içsel temsili aşağıdaki gibidir:
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
Sıkıştırılmış seyrek sütun depolama, seyrek bir matrisin sütunundaki elemanlara erişimi kolay ve hızlı hale getirirken, seyrek matrisi satırlar halinde erişmek oldukça daha yavaştır. CSC yapısında daha önce depolanmamış girişlerin birer birer eklenmesi gibi işlemler yavaş olma eğilimindedir. Bunun nedeni, ekleme noktasının ötesindeki seyrek matrisin tüm elemanlarının bir yer kaydırılması gerektiğidir.
Seyrek matrisler üzerindeki tüm işlemler, performans için CSC veri yapısını kullanacak şekilde dikkatlice uygulanmıştır ve pahalı işlemlerden kaçınılmıştır.
Eğer farklı bir uygulamadan veya kütüphaneden CSC formatında veriniz varsa ve bunu Julia'ya aktarmak istiyorsanız, 1 tabanlı indeksleme kullandığınızdan emin olun. Her sütundaki satır indeksleri sıralı olmalıdır ve eğer sıralı değillerse, matris yanlış bir şekilde görüntülenecektir. Eğer SparseMatrixCSC
nesneniz sıralanmamış satır indeksleri içeriyorsa, bunları sıralamanın hızlı bir yolu çift transpoz yapmaktır. Transpoz işlemi tembel olduğu için, her transpozun somutlaşması için bir kopya oluşturun.
Bazı uygulamalarda, SparseMatrixCSC
içinde açık sıfır değerlerini saklamak kullanışlıdır. Bu değerler Base
içindeki fonksiyonlar tarafından kabul edilir (ancak mutasyona uğrayan işlemlerde korunacaklarına dair bir garanti yoktur). Açıkça saklanan bu sıfırlar, birçok rutin tarafından yapısal sıfır olmayanlar olarak değerlendirilir. nnz
fonksiyonu, yapısal olmayan sıfırlar da dahil olmak üzere, seyrek veri yapısında açıkça saklanan elemanların sayısını döndürür. Sayısal sıfır olmayanların tam sayısını saymak için, her bir saklanan elemanı inceleyen count(!iszero, x)
fonksiyonunu kullanın. dropzeros
ve yerinde dropzeros!
fonksiyonları, saklanan sıfırları seyrek matrisinden kaldırmak için kullanılabilir.
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
Seyrek vektörler, seyrek matrisler için sıkıştırılmış seyrek sütun formatına yakın bir şekilde saklanır. Julia'da, seyrek vektörlerin tipi SparseVector{Tv,Ti}
şeklindedir; burada Tv
saklanan değerlerin tipi ve Ti
ise indeksler için tam sayı tipidir. İçsel temsil aşağıdaki gibidir:
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
SparseMatrixCSC
için SparseVector
türü ayrıca açıkça saklanan sıfırlar da içerebilir. (Bkz. Sparse Matrix Storage.)
Sparse Vector and Matrix Constructors
En basit seyrek dizi oluşturma yolu, Julia'nın yoğun dizilerle çalışmak için sağladığı zeros
fonksiyonuna eşdeğer bir fonksiyon kullanmaktır. Bunun yerine seyrek bir dizi üretmek için, aynı ismi sp
ön eki ile kullanabilirsiniz:
julia> spzeros(3)
3-element SparseVector{Float64, Int64} with 0 stored entries
sparse
fonksiyonu genellikle seyrek diziler oluşturmak için kullanışlı bir yoldur. Örneğin, bir seyrek matris oluşturmak için bir satır indeksleri vektörü I
, bir sütun indeksleri vektörü J
ve saklanan değerler vektörü V
girebiliriz (bu aynı zamanda COO (coordinate) format olarak bilinir). sparse(I,J,V)
ardından S[I[k], J[k]] = V[k]
olacak şekilde bir seyrek matris oluşturur. Eşdeğer seyrek vektör yapıcı sparsevec
olup, (satır) indeks vektörü I
ve saklanan değerlerle birlikte vektör V
alır ve R[I[k]] = V[k]
olacak şekilde bir seyrek vektör R
oluşturur.
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
sparse
ve sparsevec
fonksiyonlarının tersinin findnz
olduğu, seyrek diziyi oluşturmak için kullanılan girdileri (sıfıra eşit olan saklanan girişler dahil) geri getirdiği belirtilmektedir. findall(!iszero, x)
ise x
içindeki sıfıra eşit olmayan girişlerin Kartezyen indekslerini döndürmektedir (sıfıra eşit olan saklanan girişler dahil değildir).
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
Başka bir seyrek dizi oluşturmanın bir yolu, yoğun bir diziyi sparse
fonksiyonunu kullanarak seyrek bir diziye dönüştürmektir:
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
Diğer yönde Array
yapıcısını kullanarak gidebilirsiniz. issparse
fonksiyonu, bir matrisin seyrek olup olmadığını sorgulamak için kullanılabilir.
julia> issparse(spzeros(5))
true
Sparse matrix operations
Seyrek matrisler üzerinde aritmetik işlemler, yoğun matrislerde olduğu gibi çalışır. Seyrek matrislerin indekslenmesi, atanması ve birleştirilmesi, yoğun matrisler gibi aynı şekilde çalışır. İndeksleme işlemleri, özellikle atama, bir seferde bir eleman üzerinde gerçekleştirildiğinde pahalıdır. Birçok durumda, seyrek matrisi findnz
formatına dönüştürmek, değerleri veya yapıyı yoğun vektörlerde (I,J,V)
manipüle etmek ve ardından seyrek matrisi yeniden inşa etmek daha iyi olabilir.
Correspondence of dense and sparse methods
Aşağıdaki tablo, seyrek matrisler üzerindeki yerleşik yöntemler ile yoğun matris türlerindeki karşılık gelen yöntemler arasındaki ilişkiyi vermektedir. Genel olarak, seyrek matrisler üreten yöntemler, sonuçta elde edilen matrisin belirli bir seyrek matris S
ile aynı seyreklik desenini takip etmesi veya sonuçta elde edilen seyrek matrisin yoğunluğunun d
olması, yani her matris elemanının sıfır olmama olasılığının d
olması açısından yoğun karşıtlarından farklıdır.
Detaylar, standart kütüphane referansının Sparse Vectors and Matrices bölümünde bulunabilir.
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
Seyrek matris çözücüleri SuiteSparse adresinden fonksiyonlar çağırır. Aşağıdaki faktorizasyonlar mevcuttur:
Type | Description |
---|---|
CHOLMOD.Factor | Cholesky and LDLt factorizations |
UMFPACK.UmfpackLU | LU factorization |
SPQR.QRSparse | QR factorization |
Bu faktorizasyonlar, Sparse Linear Algebra API section içinde daha ayrıntılı olarak açıklanmaktadır:
SparseArrays API
SparseArrays.AbstractSparseArray
— TypeAbstractSparseArray{Tv,Ti,N}
Tv
türünde ve Ti
indeks türünde elemanlara sahip N
-boyutlu seyrek diziler (veya dizi benzeri türler) için süpertip. SparseMatrixCSC
, SparseVector
ve SuiteSparse.CHOLMOD.Sparse
bunun alt türleridir.
SparseArrays.AbstractSparseVector
— TypeAbstractSparseVector{Tv,Ti}
Tv
ve Ti
türünde elemanlara sahip bir boyutlu seyrek diziler (veya dizi benzeri türler) için süpertip. AbstractSparseArray{Tv,Ti,1}
için takma ad.
SparseArrays.AbstractSparseMatrix
— TypeAbstractSparseMatrix{Tv,Ti}
İki boyutlu seyrek diziler (veya dizi benzeri türler) için süpertip, Tv
türünde elemanlar ve Ti
türünde indeksler içerir. AbstractSparseArray{Tv,Ti,2}
için takma ad.
SparseArrays.SparseVector
— TypeSparseVector{Tv,Ti<:Integer} <: AbstractSparseVector{Tv,Ti}
Seyrek vektörleri depolamak için vektör türü. Vektörün uzunluğunu, sıralı bir sıfırdan farklı indeksler vektörünü ve sıfırdan farklı değerler vektörünü geçirerek oluşturulabilir.
Örneğin, [5, 6, 0, 7]
vektörü şu şekilde temsil edilebilir:
SparseVector(4, [1, 2, 4], [5, 6, 7])
Bu, indeks 1'de 5, indeks 2'de 6, indeks 3'te zero(Int)
ve indeks 4'te 7 olduğunu gösterir.
Seyrek vektörleri, sparse
kullanarak yoğun vektörlerden doğrudan oluşturmak daha pratik olabilir:
sparse([5, 6, 0, 7])
aynı seyrek vektörü verir.
SparseArrays.SparseMatrixCSC
— TypeSparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}
Seyrek matrisleri Sıkıştırılmış Seyrek Sütun formatında depolamak için matris türü. SparseMatrixCSC'yi oluşturmanın standart yolu sparse
fonksiyonu aracılığıyladır. Ayrıca spzeros
, spdiagm
ve sprand
ile de bakabilirsiniz.
SparseArrays.sparse
— Functionsparse(A)
Bir AbstractMatrix A
'yı seyrek bir matris haline dönüştürür.
Örnekler
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} with 3 stored entries:
1.0 ⋅ ⋅
⋅ 1.0 ⋅
⋅ ⋅ 1.0
sparse(I, J, V,[ m, n, combine])
S
boyutları m x n
olan seyrek bir matris oluşturur, böylece S[I[k], J[k]] = V[k]
. combine
fonksiyonu, tekrar eden değerleri birleştirmek için kullanılır. Eğer m
ve n
belirtilmemişse, bunlar sırasıyla maximum(I)
ve maximum(J)
olarak ayarlanır. Eğer combine
fonksiyonu sağlanmamışsa, combine
varsayılan olarak +
olur, ancak V
'nin elemanları Boolean ise combine
varsayılan olarak |
olur. I
'nin tüm elemanları 1 <= I[k] <= m
koşulunu sağlamalıdır ve J
'nin tüm elemanları 1 <= J[k] <= n
koşulunu sağlamalıdır. (I
, J
, V
) içindeki sayısal sıfırlar yapısal sıfır olarak korunur; sayısal sıfırları atmak için dropzeros!
kullanın.
Ek belgeler ve uzman bir sürücü için SparseArrays.sparse!
'ya bakın.
Örnekler
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} with 3 stored entries:
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}
sparse
için ebeveyn ve uzman sürücü; temel kullanım için sparse
sayfasına bakın. Bu yöntem, kullanıcının aşağıda açıklanan sparse
'ın ara nesneleri ve sonuçları için önceden tahsis edilmiş depolama sağlamasına olanak tanır. Bu yetenek, koordinat temsillerinden SparseMatrixCSC
oluşturulmasını daha verimli hale getirir ve ayrıca sonucun transpozunun sıralanmamış sütun temsilinin ek bir maliyet olmaksızın çıkarılmasını sağlar.
Bu yöntem üç ana adımdan oluşur: (1) Sağlanan koordinat temsilini, tekrar eden girişleri de içeren sıralanmamış satır CSR biçimine sayım sıralaması ile yerleştirmek. (2) CSR biçiminde süzülerek, istenen CSC biçiminin sütun işaretçi dizisini hesaplamak, tekrar eden girişleri tespit etmek ve CSR biçimini tekrar eden girişlerle yeniden paketlemek; bu aşama, tekrar eden girişler içermeyen sıralanmamış satır CSR biçimini verir. (3) Önceki CSR biçimini, tekrar eden girişler içermeyen tamamen sıralı bir CSC biçimine sayım sıralaması ile yerleştirmek.
Girdi dizileri csrrowptr
, csrcolval
ve csrnzval
, ara CSR biçimleri için depolama oluşturur ve length(csrrowptr) >= m + 1
, length(csrcolval) >= length(I)
ve length(csrnzval >= length(I))
gerektirir. İkinci aşama için çalışma alanı olan girdi dizisi klasttouch
, length(klasttouch) >= n
gerektirir. Opsiyonel girdi dizileri csccolptr
, cscrowval
ve cscnzval
, döndürülen CSC biçimi S
için depolama oluşturur. Gerekirse, bunlar otomatik olarak length(csccolptr) = n + 1
, length(cscrowval) = nnz(S)
ve length(cscnzval) = nnz(S)
koşullarını karşılayacak şekilde yeniden boyutlandırılır; bu nedenle, nnz(S)
başlangıçta bilinmiyorsa, uygun türde boş vektörler (Vector{Ti}()
ve Vector{Tv}()
) geçmek yeterlidir veya cscrowval
ve cscnzval
'ı göz ardı ederek sparse!
yöntemini çağırmak yeterlidir.
Dönüşte, csrrowptr
, csrcolval
ve csrnzval
, sonucun transpozunun sıralanmamış sütun temsilini içerir.
Girdi dizilerinin depolamasını (I
, J
, V
) çıktı dizileri (csccolptr
, cscrowval
, cscnzval
) için yeniden kullanabilirsiniz. Örneğin, sparse!(I, J, V, csrrowptr, csrcolval, csrnzval, I, J, V)
çağrısını yapabilirsiniz. Bunların yukarıdaki koşulları karşılayacak şekilde yeniden boyutlandırılacağını unutmayın.
Verimlilik açısından, bu yöntem 1 <= I[k] <= m
ve 1 <= J[k] <= n
dışında hiçbir argüman kontrolü yapmaz. Dikkatli kullanın. --check-bounds=yes
ile test etmek akıllıca olacaktır.
Bu yöntem O(m, n, length(I))
zamanında çalışır. F. Gustavson'un "Sparse Matrisler için iki hızlı algoritma: çarpma ve permütasyon transpozisyonu," ACM TOMS 4(3), 250-269 (1978) adlı eserinde tanımlanan HALFPERM algoritması, bu yöntemin bir çift sayım sıralaması kullanmasını ilham etmiştir.
SparseArrays.sparse!(I, J, V, [m, n, combine]) -> SparseMatrixCSC
Giriş vektörlerini (I
, J
, V
) son matris depolaması için yeniden kullanan sparse!
'ın bir varyantı. Yapıdan sonra giriş vektörleri matris tamponlarıyla alias olacak; S.colptr === I
, S.rowval === J
ve S.nzval === V
geçerlidir ve gerektiğinde resize!
yapılacaktır.
Bazı çalışma tamponlarının hala tahsis edileceğini unutmayın. Özellikle, bu yöntem sparse!(I, J, V, m, n, combine, klasttouch, csrrowptr, csrcolval, csrnzval, csccolptr, cscrowval, cscnzval)
etrafında bir kolaylık sarmalayıcıdır; bu yöntem uygun boyutta klasttouch
, csrrowptr
, csrcolval
ve csrnzval
tahsis eder, ancak csccolptr
, cscrowval
ve cscnzval
için I
, J
ve V
'yi yeniden kullanır.
m
, n
ve combine
argümanları sırasıyla maximum(I)
, maximum(J)
ve +
olarak varsayılan değerlerdir.
Bu yöntem Julia sürümü 1.10 veya daha yenisini gerektirir.
SparseArrays.sparsevec
— Functionsparsevec(I, V, [m, combine])
S
uzunluğunda bir seyrek vektör oluşturur m
böylece S[I[k]] = V[k]
. Tekrar edenler combine
fonksiyonu kullanılarak birleştirilir; eğer combine
argümanı sağlanmazsa varsayılan olarak +
kullanılır, V
'nin elemanları Boolean ise combine
varsayılan olarak |
olur.
Örnekler
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])
m
uzunluğunda, sıfır olmayan indekslerin anahtarları sözlükten ve sıfır olmayan değerlerin sözlükten değerler olduğu seyrek bir vektör oluşturur.
Örnekler
julia> sparsevec(Dict(1 => 3, 2 => 2))
2-element SparseVector{Int64, Int64} with 2 stored entries:
[1] = 3
[2] = 2
sparsevec(A)
Bir vektörü A
uzunluğu m
olan seyrek bir vektöre dönüştür.
Örnekler
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}
Verilen kaynak SparseMatrixCSC
'ye dayanarak, belirtilen eleman türü, indeks türü ve boyut ile başlatılmamış bir değiştirilebilir dizi oluşturur. Yeni seyrek matris, orijinal seyrek matrisin yapısını korur, yalnızca çıkış matrisinin boyutları çıkıştan farklı olduğunda durum farklıdır.
Çıkış matrisinin, girdi ile aynı konumlarda sıfırları vardır, ancak sıfır olmayan konumlar için başlatılmamış değerler içerir.
SparseArrays.issparse
— Functionissparse(S)
S
seyrekse true
, değilse false
döner.
Örnekler
julia> sv = sparsevec([1, 4], [2.3, 2.2], 10)
10-elemanlı SparseVector{Float64, Int64} ile 2 saklanan girdi:
[1] = 2.3
[4] = 2.2
julia> issparse(sv)
true
julia> issparse(Array(sv))
false
SparseArrays.nnz
— Functionnnz(A)
Seyrek bir dizide saklanan (doldurulmuş) elemanların sayısını döndürür.
Örnekler
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> nnz(A)
3
SparseArrays.findnz
— Functionfindnz(A::SparseMatrixCSC)
Sıkıştırılmış matris A
'deki saklanan ("yapısal sıfır olmayan") değerlerin satır ve sütun indekslerini içeren bir tuple (I, J, V)
döndürür; burada I
ve J
saklanan değerlerin satır ve sütun indeksleridir ve V
değerlerin bir vektörüdür.
Örnekler
julia> A = sparse([1 2 0; 0 0 3; 0 4 0])
3×3 SparseMatrixCSC{Int64, Int64} with 4 stored entries:
1 2 ⋅
⋅ ⋅ 3
⋅ 4 ⋅
julia> findnz(A)
([1, 1, 3, 2], [1, 2, 2, 3], [1, 2, 4, 3])
SparseArrays.spzeros
— Functionspzeros([tip,]m[,n])
m
uzunluğunda bir seyrek vektör veya m x n
boyutunda bir seyrek matris oluşturur. Bu seyrek dizi, herhangi bir sıfır olmayan değer içermeyecektir. Yapım sırasında sıfır olmayan değerler için herhangi bir depolama alanı ayrılmayacaktır. Tip belirtilmezse varsayılan olarak Float64
kullanılır.
Örnekler
julia> spzeros(3, 3)
3×3 SparseMatrixCSC{Float64, Int64} with 0 stored entries:
⋅ ⋅ ⋅
⋅ ⋅ ⋅
⋅ ⋅ ⋅
julia> spzeros(Float32, 4)
4-element SparseVector{Float32, Int64} with 0 stored entries
spzeros([type], I::AbstractVector, J::AbstractVector, [m, n])
S
boyutları m x n
olan bir seyrek matris oluşturur ve S[I[k], J[k]]
konumlarında yapısal sıfırlar içerir.
Bu yöntem, matrisin seyreklik desenini oluşturmak için kullanılabilir ve sparse(I, J, zeros(length(I)))
gibi yöntemlerden daha verimlidir.
Ek belgeler ve uzman bir sürücü için SparseArrays.spzeros!
'a bakın.
Bu yöntem Julia sürüm 1.10 veya daha yenisini gerektirir.
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}
spzeros(I, J)
için bir ana ve uzman sürücü, kullanıcının ara nesneler için önceden tahsis edilmiş depolama sağlamasına olanak tanır. Bu yöntem spzeros
için, SparseArrays.sparse!
yönteminin sparse
için yaptığına benzer. Gerekli tampon uzunlukları ve SparseArrays.sparse!
ile ilgili ayrıntılar için belgeleri kontrol edin.
Bu yöntem Julia sürüm 1.10 veya daha yenisini gerektirir.
SparseArrays.spzeros!(::Type{Tv}, I, J, [m, n]) -> SparseMatrixCSC{Tv}
Giriş vektörleri I
ve J
'yi son matris depolaması için yeniden kullanan spzeros!
'ın bir varyantı. İnşa edildikten sonra giriş vektörleri matris tamponlarıyla alias olacak; S.colptr === I
ve S.rowval === J
geçerlidir ve gerektiğinde resize!
yapılacaktır.
Bazı çalışma tamponlarının hala tahsis edileceğini unutmayın. Özellikle, bu yöntem spzeros!(Tv, I, J, m, n, klasttouch, csrrowptr, csrcolval, csccolptr, cscrowval)
etrafında bir kolaylık sarmalayıcıdır; bu yöntem uygun boyutta klasttouch
, csrrowptr
ve csrcolval
tahsis eder, ancak csccolptr
ve cscrowval
için I
ve J
'yi yeniden kullanır.
m
ve n
argümanları varsayılan olarak maximum(I)
ve maximum(J)
'dir.
Bu yöntem Julia sürümü 1.10 veya daha yenisini gerektirir.
SparseArrays.spdiagm
— Functionspdiagm(kv::Pair{<:Integer,<:AbstractVector}...)
spdiagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
`Pair`'lerden ve diyagonalardan oluşan seyrek bir diyagonal matris oluşturur. Her bir vektör `kv.second`, `kv.first` diyagonalında yer alacaktır. Varsayılan olarak, matris kare olup boyutu `kv`'den çıkarılır, ancak `m,n` ilk argümanlar olarak geçilerek dikdörtgen bir boyut `m`×`n` (gerekirse sıfırlarla doldurulmuş) belirtilebilir.
# Örnekler
jldoctest julia> spdiagm(-1 => [1,2,3,4], 1 => [4,3,2,1]) 5×5 SparseMatrixCSC{Int64, Int64} with 8 stored entries: ⋅ 4 ⋅ ⋅ ⋅ 1 ⋅ 3 ⋅ ⋅ ⋅ 2 ⋅ 2 ⋅ ⋅ ⋅ 3 ⋅ 1 ⋅ ⋅ ⋅ 4 ⋅ ```
spdiagm(v::AbstractVector)
spdiagm(m::Integer, n::Integer, v::AbstractVector)
Bir seyrek matris oluşturur ve vektörün elemanlarını köşegen elemanları olarak kullanır. Varsayılan olarak (verilen m
ve n
yoksa), matris kare olup boyutu length(v)
ile belirlenir, ancak m
ve n
ilk argümanlar olarak geçilerek dikdörtgen bir boyut m
×n
belirtilebilir.
Bu fonksiyonlar en az Julia 1.6 gerektirir.
Örnekler
julia> spdiagm([1,2,3])
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
1 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 3
julia> spdiagm(sparse([1,0,3]))
3×3 SparseMatrixCSC{Int64, Int64} with 2 stored entries:
1 ⋅ ⋅
⋅ ⋅ ⋅
⋅ ⋅ 3
SparseArrays.sparse_hcat
— Functionsparse_hcat(A...)
Boyut 2 boyunca birleştir. Bir SparseMatrixCSC nesnesi döndür.
Bu yöntem Julia 1.8'de eklendi. LinearAlgebra.jl'den özel "sparse" matris türleri ile birleştirmenin önceki davranışını taklit eder; burada herhangi bir SparseArray argümanı olmaksızın birleştirme otomatik olarak seyrek çıktı verir.
SparseArrays.sparse_vcat
— Functionsparse_vcat(A...)
Boyut 1 boyunca birleştirir. Bir SparseMatrixCSC nesnesi döner.
Bu yöntem Julia 1.8'de eklendi. Daha önceki birleştirme davranışını taklit eder; LinearAlgebra.jl'den özel "sparse" matris türleri ile birleştirme, herhangi bir SparseArray argümanı olmaksızın otomatik olarak seyrek çıktı verir.
SparseArrays.sparse_hvcat
— Functionsparse_hvcat(rows::Tuple{Vararg{Int}}, values...)
Sıkıştırılmış yatay ve dikey birleştirme tek bir çağrıda. Bu fonksiyon blok matris sözdizimi için çağrılır. İlk argüman, her blok satırında birleştirilecek argüman sayısını belirtir.
Bu yöntem Julia 1.8'de eklendi. Daha önceki birleştirme davranışını taklit eder; burada LinearAlgebra.jl'den özel "sparse" matris türleri ile birleştirme, herhangi bir SparseArray argümanı olmaksızın otomatik olarak sıkıştırılmış çıktı verir.
SparseArrays.blockdiag
— Functionblockdiag(A...)
Matrisleri blok-diagonal olarak birleştirir. Şu anda yalnızca seyrek matrisler için uygulanmıştır.
Örnekler
julia> blockdiag(sparse(2I, 3, 3), sparse(4I, 2, 2))
5×5 SparseMatrixCSC{Int64, Int64} with 5 stored entries:
2 ⋅ ⋅ ⋅ ⋅
⋅ 2 ⋅ ⋅ ⋅
⋅ ⋅ 2 ⋅ ⋅
⋅ ⋅ ⋅ 4 ⋅
⋅ ⋅ ⋅ ⋅ 4
SparseArrays.sprand
— Functionsprand([rng],[T::Type],m,[n],p::AbstractFloat)
sprand([rng],m,[n],p::AbstractFloat,[rfn=rand])
Rastgele uzunlukta m
seyrek vektör veya m
x n
seyrek matris oluşturur; burada herhangi bir elemanın sıfırdan farklı olma olasılığı bağımsız olarak p
ile verilir (ve dolayısıyla sıfırdan farklıların ortalama yoğunluğu da tam olarak p
'dir). İsteğe bağlı rng
argümanı, rastgele sayı üreteci belirtir, bkz. Rastgele Sayılar. İsteğe bağlı T
argümanı, varsayılan olarak Float64
olan eleman türünü belirtir.
Varsayılan olarak, sıfırdan farklı değerler, rand
fonksiyonu kullanılarak, yani rand(T)
veya rng
sağlanmışsa rand(rng, T)
ile, bir uniform dağılımdan örneklenir; varsayılan T=Float64
için bu, sıfırdan farklı değerlerin [0,1)
aralığında uniform olarak örneklenmesi anlamına gelir.
Sıfırdan farklı değerleri farklı bir dağılımdan örneklemek için, rand
yerine özel bir rfn
fonksiyonu geçebilirsiniz. Bu, istenen dağılımdan örneklenen k
rastgele sayıdan oluşan bir dizi döndüren bir fonksiyon rfn(k)
olmalıdır; alternatif olarak, rng
sağlanmışsa, bunun yerine rfn(rng, k)
olmalıdır.
Örnekler
julia> sprand(Bool, 2, 2, 0.5)
2×2 SparseMatrixCSC{Bool, Int64} ile 2 saklanan giriş:
1 1
⋅ ⋅
julia> sprand(Float64, 3, 0.75)
3-elemanlı SparseVector{Float64, Int64} ile 2 saklanan giriş:
[1] = 0.795547
[2] = 0.49425
SparseArrays.sprandn
— Functionsprandn([rng][,Type],m[,n],p::AbstractFloat)
Uzunluğu m
olan rastgele seyrek bir vektör veya m
x n
boyutunda seyrek bir matris oluşturur; burada herhangi bir girişin sıfır olmama olasılığı p
olarak belirtilmiştir ve sıfır olmayan değerler normal dağılımdan örneklenir. İsteğe bağlı rng
argümanı, rastgele sayı üreteciyi belirtir, bkz. Rastgele Sayılar.
Çıktı eleman türünü Type
belirtmek en az Julia 1.1 gerektirir.
Örnekler
julia> sprandn(2, 2, 0.75)
2×2 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
-1.20577 ⋅
0.311817 -0.234641
SparseArrays.nonzeros
— Functionnonzeros(A)
Seyrek dizi A
içindeki yapısal sıfır olmayan değerlerin bir vektörünü döndürür. Bu, seyrek dizide açıkça saklanan sıfırları da içerir. Döndürülen vektör, A
'nın içsel sıfır olmayan depolamasına doğrudan işaret eder ve döndürülen vektördeki herhangi bir değişiklik, A
'yı da değiştirecektir. rowvals
ve nzrange
bakınız.
Örnekler
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> nonzeros(A)
3-element Vector{Int64}:
2
2
2
SparseArrays.rowvals
— Functionrowvals(A::AbstractSparseMatrixCSC)
A
'n satır indekslerinin bir vektörünü döndürür. Döndürülen vektördeki herhangi bir değişiklik A
'yı da değiştirecektir. Satır indekslerinin dahili olarak nasıl saklandığına erişim sağlamak, yapısal sıfır olmayan değerler üzerinde yineleme ile birlikte yararlı olabilir. Ayrıca nonzeros
ve nzrange
ile de bakılabilir.
Örnekler
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> rowvals(A)
3-element Vector{Int64}:
1
2
3
SparseArrays.nzrange
— Functionnzrange(A::AbstractSparseMatrixCSC, col::Integer)
Sıkıştırılmış bir matris sütununun yapısal sıfır olmayan değerlerinin indeks aralığını döndürür. Bu, nonzeros
ve rowvals
ile birlikte kullanıldığında, sıkıştırılmış bir matris üzerinde rahatça yineleme yapmayı sağlar:
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]
# sıkıştırılmış sihirbazlık yap...
end
end
!!! uyarı Matriste sıfır olmayan eleman eklemek veya çıkarmak nzrange
'i geçersiz kılabilir, bu nedenle yineleme sırasında matrisi değiştirmemek gerekir.
nzrange(x::SparseVectorUnion, col)
Seyrek bir vektörün yapısal sıfır olmayan değerlerinin indeks aralığını verir. Sütun indeksi col
göz ardı edilir (1 olduğu varsayılır).
SparseArrays.droptol!
— Functiondroptol!(A::AbstractSparseMatrixCSC, tol)
A
'n mutlak değeri tol
'dan küçük veya eşit olan saklanan değerlerini kaldırır.
droptol!(x::AbstractCompressedVector, tol)
x
'in mutlak değeri tol
'dan küçük veya eşit olan saklanan değerleri kaldırır.
SparseArrays.dropzeros!
— Functiondropzeros!(x::AbstractCompressedVector)
x
'den saklanan sayısal sıfırları kaldırır.
Yerinde olmayan bir versiyon için, dropzeros
kısmına bakın. Algoritmik bilgi için fkeep!
'e bakın.
SparseArrays.dropzeros
— Functiondropzeros(A::AbstractSparseMatrixCSC;)
A
'nın bir kopyasını oluşturur ve o kopyadan saklanan sayısal sıfırları kaldırır.
Yerinde bir versiyon ve algoritmik bilgi için dropzeros!
kısmına bakın.
Örnekler
julia> A = sparse([1, 2, 3], [1, 2, 3], [1.0, 0.0, 1.0])
3×3 SparseMatrixCSC{Float64, Int64} ile 3 saklanan girdi:
1.0 ⋅ ⋅
⋅ 0.0 ⋅
⋅ ⋅ 1.0
julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64, Int64} ile 2 saklanan girdi:
1.0 ⋅ ⋅
⋅ ⋅ ⋅
⋅ ⋅ 1.0
dropzeros(x::AbstractCompressedVector)
x
'in bir kopyasını oluşturur ve o kopyadan sayısal sıfırları kaldırır.
Yerinde bir versiyon ve algoritmik bilgi için dropzeros!
kısmına bakın.
Örnekler
julia> A = sparsevec([1, 2, 3], [1.0, 0.0, 1.0])
3-element SparseVector{Float64, Int64} with 3 stored entries:
[1] = 1.0
[2] = 0.0
[3] = 1.0
julia> dropzeros(A)
3-element SparseVector{Float64, Int64} with 2 stored entries:
[1] = 1.0
[3] = 1.0
SparseArrays.permute
— Functionpermute(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
q::AbstractVector{<:Integer}) where {Tv,Ti}
A
'yı iki yönlü olarak permütasyon yaparak PAQ
(A[p,q]
) döndürür. Sütun permütasyonu q
'nun uzunluğu A
'nın sütun sayısıyla eşleşmelidir (length(q) == size(A, 2)
). Satır permütasyonu p
'nin uzunluğu A
'nın satır sayısıyla eşleşmelidir (length(p) == size(A, 1)
).
Uzman sürücüler ve ek bilgiler için permute!
kısmına bakın.
Örnekler
julia> A = spdiagm(0 => [1, 2, 3, 4], 1 => [5, 6, 7])
4×4 SparseMatrixCSC{Int64, Int64} with 7 stored entries:
1 5 ⋅ ⋅
⋅ 2 6 ⋅
⋅ ⋅ 3 7
⋅ ⋅ ⋅ 4
julia> permute(A, [4, 3, 2, 1], [1, 2, 3, 4])
4×4 SparseMatrixCSC{Int64, Int64} with 7 stored entries:
⋅ ⋅ ⋅ 4
⋅ ⋅ 3 7
⋅ 2 6 ⋅
1 5 ⋅ ⋅
julia> permute(A, [1, 2, 3, 4], [4, 3, 2, 1])
4×4 SparseMatrixCSC{Int64, Int64} with 7 stored entries:
⋅ ⋅ 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}
A
'yı iki yönlü olarak permütasyon yapar ve sonucu PAQ
(A[p,q]
) olarak X
'e kaydeder. Ara sonucu (AQ)^T
(transpose(A[:,q])
) isteğe bağlı argüman C
'ye kaydeder, eğer mevcutsa. X
, A
ve, eğer mevcutsa, C
'nin birbirine alias olmaması gerekmektedir; sonucu A
'ya geri kaydetmek için X
'i içermeyen aşağıdaki yöntemi kullanın:
permute!(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
q::AbstractVector{<:Integer}[, C::AbstractSparseMatrixCSC{Tv,Ti},
[workcolptr::Vector{Ti}]]) where {Tv,Ti}
X
'in boyutları A
'nın boyutlarıyla eşleşmelidir (size(X, 1) == size(A, 1)
ve size(X, 2) == size(A, 2)
), ve X
, A
'daki tüm tahsis edilmiş girişleri karşılayacak kadar depolama alanına sahip olmalıdır (length(rowvals(X)) >= nnz(A)
ve length(nonzeros(X)) >= nnz(A)
). Sütun permütasyonu q
'nun uzunluğu A
'nın sütun sayısıyla eşleşmelidir (length(q) == size(A, 2)
). Satır permütasyonu p
'nin uzunluğu A
'nın satır sayısıyla eşleşmelidir (length(p) == size(A, 1)
).
C
'nin boyutları transpose(A)
ile eşleşmelidir (size(C, 1) == size(A, 2)
ve size(C, 2) == size(A, 1)
), ve C
, A
'daki tüm tahsis edilmiş girişleri karşılayacak kadar depolama alanına sahip olmalıdır (length(rowvals(C)) >= nnz(A)
ve length(nonzeros(C)) >= nnz(A)
).
Ek (algoritmik) bilgi için ve argüman kontrolü yapmayan bu yöntemlerin versiyonları için (ihracat dışı) ana yöntemler unchecked_noalias_permute!
ve unchecked_aliasing_permute!
'ye bakın.
Ayrıca permute
ile de bakabilirsiniz.
SparseArrays.halfperm!
— Functionhalfperm!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{TvA,Ti},
q::AbstractVector{<:Integer}, f::Function = identity) where {Tv,TvA,Ti}
A
'yı sütun-permute edip transpoze edin, aynı zamanda A
'nın her bir girişine f
uygulayın ve sonucu X
'te saklayın (f(A)Q)^T
(map(f, transpose(A[:,q]))
).
X
'in eleman tipi Tv
, A
'nın eleman tipi TvA
ile eşleşmelidir. X
'in boyutları transpose(A)
'nın boyutlarıyla eşleşmelidir (size(X, 1) == size(A, 2)
ve size(X, 2) == size(A, 1)
), ayrıca X
, A
'da tahsis edilen tüm girişleri karşılayacak kadar depolama alanına sahip olmalıdır (length(rowvals(X)) >= nnz(A)
ve length(nonzeros(X)) >= nnz(A)
). Sütun-permutasyon q
'nun uzunluğu A
'nın sütun sayısıyla eşleşmelidir (length(q) == size(A, 2)
).
Bu yöntem, SparseMatrixCSC
üzerinde transpozisyon ve permütasyon işlemleri gerçekleştiren birkaç yöntemin ana yöntemidir. Bu yöntem argüman kontrolü yapmadığı için, doğrudan kullanıma tercih edilen daha güvenli alt yöntemleri ([c]transpose[!]
, permute[!]
) kullanın.
Bu yöntem, F. Gustavson'un "Sparse Matrisler için iki hızlı algoritma: çarpma ve permütasyon transpozisyonu," ACM TOMS 4(3), 250-269 (1978) adlı eserinde tanımlanan HALFPERM
algoritmasını uygular. Algoritma O(size(A, 1), size(A, 2), nnz(A))
zamanında çalışır ve geçilenlerden başka bir alan gerektirmez.
SparseArrays.ftranspose!
— Functionftranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}, f::Function) where {Tv,Ti}
A
'yı transpoze edin ve f
fonksiyonunu sıfır olmayan elemanlara uygulayarak X
'e kaydedin. f
tarafından oluşturulan sıfırları kaldırmaz. size(X)
size(transpose(A))
ile eşit olmalıdır. Gerekirse yalnızca X
'in rowval ve nzval'ını yeniden boyutlandırarak ek bellek tahsis edilmez.
halfperm!
'e bakın.
Sparse Linear Algebra API
LinearAlgebra.cholesky
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
Yoğun simetrik pozitif belirli bir matris A
'nın Cholesky faktorizasyonunu hesaplar ve bir Cholesky
faktorizasyonu döner. Matris A
, ya bir Symmetric
ya da Hermitian
AbstractMatrix
veya tamamen simetrik veya Hermitian bir AbstractMatrix
olabilir.
Üçgen Cholesky faktörü, faktorizasyon F
üzerinden F.L
ve F.U
ile elde edilebilir; burada A ≈ F.U' * F.U ≈ F.L * F.L'
.
Cholesky
nesneleri için aşağıdaki fonksiyonlar mevcuttur: size
, \
, inv
, det
, logdet
ve isposdef
.
Eğer A
matrisiniz, yapımındaki yuvarlama hataları nedeniyle hafifçe non-Hermitian ise, cholesky
'ye geçmeden önce Hermitian(A)
ile sarmalayarak onu tamamen Hermitian olarak ele alabilirsiniz.
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (via issuccess
) kullanıcıya aittir.
Örnekler
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 faktörü:
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
Yoğun simetrik pozitif yarı-tam bir matris A
için pivotlu Cholesky faktörizasyonunu hesaplayın ve bir CholeskyPivoted
faktörizasyonu döndürün. Matris A
, ya bir Symmetric
ya da Hermitian
AbstractMatrix
veya tamamen simetrik veya Hermitian bir AbstractMatrix
olabilir.
Faktörizasyondan F
aracılığıyla üçgen Cholesky faktörü F.L
ve F.U
ile elde edilebilir ve permütasyon F.p
ile elde edilir; burada A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
ile Ur = F.U[1:F.rank, :]
ve Lr = F.L[:, 1:F.rank]
, veya alternatif olarak A ≈ Up' * Up ≈ Lp * Lp'
ile Up = F.U[1:F.rank, invperm(F.p)]
ve Lp = F.L[invperm(F.p), 1:F.rank]
.
CholeskyPivoted
nesneleri için aşağıdaki fonksiyonlar mevcuttur: size
, \
, inv
, det
ve rank
.
tol
argümanı, rengi belirlemek için toleransı belirler. Negatif değerler için tolerans makine hassasiyetidir.
Eğer A
matrisiniz, inşasında yuvarlama hataları nedeniyle hafifçe non-Hermitian ise, cholesky
fonksiyonuna geçmeden önce Hermitian(A)
ile sarmalayın, böylece onu tamamen Hermitian olarak ele alabilirsiniz.
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (via issuccess
) kullanıcıya aittir.
Örnekler
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 faktörü ile rengi 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
permutasyon:
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; # iterasyon ile parçalama
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
Sıkı pozitif belirli bir matris A
'nın Cholesky faktörizasyonunu hesaplar. A
, bir SparseMatrixCSC
veya bir Symmetric
/Hermitian
görünümü olmalıdır. A
'nın tür etiketi olmasa bile, hala simetrik veya Hermitian olması gerekir. perm
verilmemişse, bir dolgu azaltıcı permütasyon kullanılır. F = cholesky(A)
genellikle F\b
ile denklemler sistemlerini çözmek için kullanılır, ancak diag
, det
ve logdet
gibi yöntemler de F
için tanımlanmıştır. Ayrıca, F
'den bireysel faktörler çıkartabilirsiniz, F.L
kullanarak. Ancak, varsayılan olarak pivotlama açık olduğundan, faktörizasyon içsel olarak A == P'*L*L'*P
şeklinde bir permütasyon matris P
ile temsil edilir; sadece L
'yi P
'yi hesaba katmadan kullanmak yanlış sonuçlar verecektir. Permütasyon etkilerini dahil etmek için, genellikle PtL = F.PtL
(eşdeğeri P'*L
) ve LtP = F.UP
(eşdeğeri L'*P
) gibi "birleşik" faktörler çıkartmak tercih edilir.
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (issuccess
aracılığıyla) kullanıcıya aittir.
İsteğe bağlı shift
anahtar argümanını ayarlamak, A
yerine A+shift*I
'nin faktörizasyonunu hesaplar. perm
argümanı sağlanırsa, bu, kullanılacak sıralamayı veren 1:size(A,1)
'in bir permütasyonu olmalıdır (CHOLMOD'un varsayılan AMD sıralaması yerine).
Örnekler
Aşağıdaki örnekte, kullanılan dolgu azaltıcı permütasyon [3, 2, 1]
'dir. perm
1:3
olarak ayarlandığında, yani hiç permütasyon uygulanmadığında, faktördeki sıfırdan farklı eleman sayısı 6'dır.
julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
2 1 1
1 2 0
1 0 2
julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 5
nnz: 5
success: true
julia> C.p
3-element Vector{Int64}:
3
2
1
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.0 1.41421 0.0
0.707107 0.707107 1.0
julia> L * L' ≈ A[C.p, C.p]
true
julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
⋅ ⋅ 1.0
⋅ 1.0 ⋅
1.0 ⋅ ⋅
julia> P' * L * L' * P ≈ A
true
julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 6
nnz: 6
success: true
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.707107 1.22474 0.0
0.707107 -0.408248 1.1547
julia> L * L' ≈ A
true
Bu yöntem, SuiteSparse kütüphanesinden CHOLMOD[ACM887][DavisHager2009] kullanır. CHOLMOD yalnızca tek veya çift hassasiyette gerçek veya karmaşık türleri destekler. Bu element türlerinde olmayan giriş matrisleri uygun şekilde bu türlere dönüştürülecektir.
CHOLMOD'dan birçok başka işlev sarılmıştır ancak Base.SparseArrays.CHOLMOD
modülünden dışa aktarılmamıştır.
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
cholesky
ile aynı, ancak girişi A
üzerine yazarak alan tasarrufu sağlar, kopya oluşturmadan. Faktörizasyon, A
'nın eleman türü tarafından temsil edilemeyen bir sayı üretirse, örneğin tam sayı türleri için, bir InexactError
istisnası fırlatılır.
Örnekler
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> cholesky!(A)
HATA: InexactError: Int64(6.782329983125268)
Yığın İzleme:
[...]
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
cholesky
ile aynı, ancak bir kopya oluşturmak yerine girdi A
'yı üst üste yazarak alan tasarrufu sağlar. Faktörizasyon, A
'nın eleman türü tarafından temsil edilemeyen bir sayı üretirse, örneğin tam sayı türleri için, bir InexactError
istisnası fırlatılır.
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
A
'n Cholesky ($LL'$) faktorizasyonunu F
'yi sembolik faktorizasyon olarak yeniden kullanarak hesaplayın. A
, bir SparseMatrixCSC
veya bir Symmetric
/ Hermitian
görünümü olmalıdır. A
'nın tür etiketi olmasa bile, yine de simetrik veya Hermitian olması gerekir.
Ayrıca bkz. cholesky
.
Bu yöntem, yalnızca tekil veya çift hassasiyette gerçek veya karmaşık türleri destekleyen SuiteSparse'tan CHOLMOD kütüphanesini kullanır. Bu eleman türlerinde olmayan giriş matrisleri, uygun şekilde bu türlere dönüştürülecektir.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Bir Cholesky faktörizasyonu C
'yi v
vektörü ile güncelleyin. Eğer A = C.U'C.U
ise, CC = cholesky(C.U'C.U + v*v')
ancak CC
'nin hesaplanması yalnızca O(n^2)
işlemi kullanır.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Bir LDLt
Faktörizasyonu A + C*C'
için, A
'nın LDLt
veya LLt
faktörizasyonu F
verildiğinde.
Dönen faktör her zaman bir LDLt
faktörizasyonudur.
Ayrıca bkz. lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Bir Cholesky faktörizasyonu C
'yi v
vektörü ile güncelleyin. Eğer A = C.U'C.U
ise, CC = cholesky(C.U'C.U + v*v')
ancak CC
'nin hesaplanması yalnızca O(n^2)
işlemi kullanır. Girdi faktörizasyonu C
yerinde güncellenir, böylece çıkışta C == CC
olur. v
vektörü hesaplama sırasında yok edilir.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
Bir LDLt
veya LLt
Faktörizasyonu F
'yi A + C*C'
'nin bir faktörizasyonuna güncelleyin.
LLt
faktörizasyonları LDLt
'ye dönüştürülür.
Ayrıca bkz. lowrankupdate
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Bir Cholesky faktörizasyonunu C
vektörü v
ile güncelleyin. Eğer A = C.U'C.U
ise, CC = cholesky(C.U'C.U - v*v')
ancak CC
'nin hesaplanması yalnızca O(n^2)
işlemi kullanır.
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Bir LDLt
Faktörizasyonu A + C*C'
için, A
'nın LDLt
veya LLt
faktörizasyonu F
verildiğinde.
Dönen faktör her zaman bir LDLt
faktörizasyonudur.
Ayrıca bkz. lowrankdowndate!
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Bir Cholesky faktörizasyonunu C
vektörü v
ile güncelleyin. Eğer A = C.U'C.U
ise, CC = cholesky(C.U'C.U - v*v')
ancak CC
'nin hesaplanması yalnızca O(n^2)
işlemi kullanır. Girdi faktörizasyonu C
yerinde güncellenir, böylece çıkışta C == CC
olur. Vektör v
hesaplama sırasında yok edilir.
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
Bir LDLt
veya LLt
Faktörizasyonu F
'yi A - C*C'
'nin bir faktörizasyonuna günceller.
LLt
faktörizasyonları LDLt
'ye dönüştürülür.
Ayrıca bkz. lowrankdowndate
, lowrankupdate
, lowrankupdate!
.
SparseArrays.CHOLMOD.lowrankupdowndate!
— Functionlowrankupdowndate!(F::CHOLMOD.Factor, C::Sparse, update::Cint)
Bir LDLt
veya LLt
Faktörizasyonu F
'yi A ± C*C'
faktörizasyonuna güncelleyin.
Eğer seyrekliği koruyan faktörizasyon kullanılıyorsa, yani L*L' == P*A*P'
ise yeni faktör L*L' == P*A*P' + C'*C
olacaktır.
update
: Cint(1)
için A + CC'
, Cint(0)
için A - CC'
LinearAlgebra.ldlt
— Functionldlt(S::SymTridiagonal) -> LDLt
Gerçek simetrik tridiagonal matris S
için LDLt
(yani, $LDL^T$) faktorizasyonu hesaplayın; burada S = L*Diagonal(d)*L'
şeklindedir ve L
birim alt üçgen matris, d
ise bir vektördür. F = ldlt(S)
şeklindeki bir LDLt
faktorizasyonunun ana kullanımı, Sx = b
doğrusal denklemler sistemini F\b
ile çözmektir.
Benzer, ancak pivotlu, genel simetrik veya Hermit matrislerin faktorizasyonu için bunchkaufman
kısmına da bakın.
Örnekler
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
Sıkışık bir matris A
'nın $LDL'$ faktorizasyonunu hesaplar. A
, bir SparseMatrixCSC
veya bir Symmetric
/Hermitian
görünümü olmalıdır. A
'nın tür etiketi olmasa bile, hala simetrik veya Hermitian olmalıdır. Bir dolgu azaltıcı permütasyon kullanılır. F = ldlt(A)
genellikle A*x = b
denklemlerini F\b
ile çözmek için kullanılır. Döndürülen faktorizasyon nesnesi F
, ayrıca diag
, det
, logdet
ve inv
yöntemlerini de destekler. F
'den bireysel faktörleri F.L
kullanarak çıkarabilirsiniz. Ancak, varsayılan olarak pivotlama açık olduğundan, faktorizasyon içsel olarak A == P'*L*D*L'*P
şeklinde temsil edilir; P
ile hesaba katmadan sadece L
kullanmak yanlış sonuçlar verecektir. Permütasyon etkilerini dahil etmek için, genellikle PtL = F.PtL
(eşdeğeri P'*L
) ve LtP = F.UP
(eşdeğeri L'*P
) gibi "birleşik" faktörleri çıkarmak tercih edilir. Desteklenen faktörlerin tam listesi :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
'dir.
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (via issuccess
) kullanıcıya aittir.
İsteğe bağlı shift
anahtar argümanını ayarlamak, A
yerine A+shift*I
'nin faktorizasyonunu hesaplar. perm
argümanı sağlanırsa, bu, kullanılacak sıralamayı veren 1:size(A,1)
'in bir permütasyonu olmalıdır (CHOLMOD'un varsayılan AMD sıralaması yerine).
Bu yöntem, SuiteSparse kütüphanesinden CHOLMOD[ACM887][DavisHager2009] kullanır. CHOLMOD yalnızca tekil veya çift hassasiyetli gerçek veya karmaşık türleri destekler. Bu eleman türlerinde olmayan giriş matrisleri, uygun şekilde bu türlere dönüştürülecektir.
CHOLMOD'dan birçok başka işlev sarılmıştır ancak Base.SparseArrays.CHOLMOD
modülünden dışa aktarılmamıştır.
LinearAlgebra.lu
— Functionlu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU
Seyrek bir matris A
'nın LU faktorizasyonunu hesaplayın.
Gerçek veya karmaşık eleman türüne sahip seyrek A
için, F
'nin dönüş türü UmfpackLU{Tv, Ti}
'dir; burada Tv
= Float64
veya ComplexF64
ve Ti
bir tam sayı türüdür (Int32
veya Int64
).
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (issuccess
aracılığıyla) kullanıcıya aittir.
Permütasyon q
ya bir permütasyon vektörü ya da nothing
olabilir. Eğer hiçbir permütasyon vektörü sağlanmamışsa veya q
nothing
ise, UMFPACK'in varsayılanı kullanılır. Eğer permütasyon sıfır tabanlı değilse, sıfır tabanlı bir kopya yapılır.
control
vektörü, Julia SparseArrays paketinin UMFPACK için varsayılan yapılandırmasına (Not: bu, iteratif iyileştirmeyi devre dışı bırakmak için UMFPACK varsayılanlarından değiştirilmiştir) varsayılan olarak ayarlanmıştır, ancak UMFPACK_CONTROL
uzunluğunda bir vektör geçirerek değiştirilebilir; olası yapılandırmalar için UMFPACK kılavuzuna bakın. Örneğin, iteratif iyileştirmeyi yeniden etkinleştirmek için:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # Float64 seyrek matris için Julia varsayılan yapılandırmasını oku
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # isteğe bağlı - değerleri göster
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # iteratif iyileştirmeyi yeniden etkinleştir (2, UMFPACK varsayılan maksimum iteratif iyileştirme adımıdır)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # Ax = b'yi çöz, UMFPACK iteratif iyileştirmesini de dahil et
Faktorizasyonun F
bireysel bileşenlerine indeksleme ile erişilebilir:
Bileşen | Açıklama |
---|---|
L | LU 'nun L (alt üçgen) kısmı |
U | LU 'nun U (üst üçgen) kısmı |
p | sağ permütasyon Vector |
q | sol permütasyon Vector |
Rs | ölçekleme faktörlerinin Vector 'ı |
: | (L,U,p,q,Rs) bileşenleri |
F
ile A
arasındaki ilişki
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
ayrıca aşağıdaki işlevleri destekler:
Ayrıca lu!
ile de bakın.
lu(A::AbstractSparseMatrixCSC)
SuiteSparse parçası olan UMFPACK[ACM832] kütüphanesini kullanır. Bu kütüphane yalnızca Float64
veya ComplexF64
elemanlarına sahip seyrek matrisleri desteklediğinden, lu
A
'yı uygun şekilde SparseMatrixCSC{Float64}
veya SparseMatrixCSC{ComplexF64}
türünde bir kopyaya dönüştürür.
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
A
'nın LU faktorizasyonunu hesaplayın.
check = true
olduğunda, ayrıştırma başarısız olursa bir hata fırlatılır. check = false
olduğunda, ayrıştırmanın geçerliliğini kontrol etme sorumluluğu (issuccess
aracılığıyla) kullanıcıya aittir.
Varsayılan olarak, check = true
ile, ayrıştırma geçerli faktörler ürettiğinde de bir hata fırlatılır, ancak üst üçgen faktör U
sıralı eksiktir. Bu, allowsingular = true
geçerek değiştirilebilir.
Çoğu durumda, A
, +
, -
, *
ve /
destekleyen bir eleman türü T
ile AbstractMatrix{T}
'nin bir alt türü S
ise, dönüş türü LU{T,S{T}}
'dir.
Genel olarak, LU faktorizasyonu, matrisin satırlarının bir permütasyonunu içerir (aşağıda açıklanan F.p
çıktısına karşılık gelen), "pivotlama" olarak bilinir (çünkü "pivot" olan, F.U
'nun diyagonal girişi hangi satırın içerdiğini seçmekle ilgilidir). Aşağıdaki pivotlama stratejilerinden biri, isteğe bağlı pivot
argümanı aracılığıyla seçilebilir:
RowMaximum()
(varsayılan): standart pivotlama stratejisi; pivot, kalan, faktörleştirilecek satırlar arasında maksimum mutlak değere sahip elemana karşılık gelir. Bu pivotlama stratejisi, eleman türünün deabs
ve<
desteklemesini gerektirir. (Bu, genellikle kayan nokta matrisleri için tek sayısal olarak kararlı seçenektir.)RowNonZero()
: pivot, kalan, faktörleştirilecek satırlar arasında ilk sıfır olmayan elemana karşılık gelir. (Bu, el hesaplamalarında tipik seçime karşılık gelir veiszero
destekleyen ancakabs
veya<
desteklemeyen daha genel cebirsel sayı türleri için de yararlıdır.)NoPivot()
: pivotlama kapalı (bir pivot pozisyonunda sıfır girişi ile karşılaşılırsa başarısız olur, hattaallowsingular = true
olsa bile).
Faktorizasyonun bireysel bileşenlerine getproperty
aracılığıyla erişilebilir:
Bileşen | Açıklama |
---|---|
F.L | LU 'nun L (alt üçgen) kısmı |
F.U | LU 'nun U (üst üçgen) kısmı |
F.p | (sağ) permütasyon Vector |
F.P | (sağ) permütasyon Matrix |
Faktorizasyonu yinelemek, bileşenleri F.L
, F.U
ve F.p
üretir.
F
ile A
arasındaki ilişki
F.L*F.U == A[F.p, :]
F
ayrıca aşağıdaki işlevleri destekler:
Desteklenen işlev | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
allowsingular
anahtar argümanı Julia 1.11'de eklendi.
Örnekler
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 faktörü:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U faktörü:
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); # yineleme ile parçalama
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 faktörü:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U faktörü (sıralı eksik):
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
Seyrek bir matris A
'nın QR
faktorizasyonunu hesaplar. F.R = F.Q'*A[F.prow,F.pcol]
olacak şekilde dolgu azaltıcı satır ve sütun permütasyonları kullanılır. Bu türün ana uygulaması, \
ile en küçük kareler veya yetersiz problemleri çözmektir. Fonksiyon, C kütüphanesi SPQR'yi çağırır[ACM933].
qr(A::SparseMatrixCSC)
SuiteSparse parçası olan SPQR kütüphanesini kullanır. Bu kütüphane yalnızca Float64
veya ComplexF64
elemanlarına sahip seyrek matrisleri desteklediğinden, Julia v1.4 itibarıyla qr
, A
'yı uygun şekilde SparseMatrixCSC{Float64}
veya SparseMatrixCSC{ComplexF64}
türünde bir kopyaya dönüştürür.
Örnekler
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q faktörü:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R faktörü:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
-1.41421 ⋅
⋅ -1.41421
Satır permütasyonu:
4 elemanlı Vector{Int64}:
1
3
4
2
Sütun permütasyonu:
2 elemanlı Vector{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
Matris A
'nın QR faktorizasyonunu hesaplar: ortogonal (veya A
karmaşık değerli ise ünite) bir matris Q
ve
\[A = Q R\]
şeklinde bir üst üçgen matris R
döner.
Dönen nesne F
, faktorizasyonu paketlenmiş bir formatta saklar:
pivot == ColumnNorm()
iseF
birQRPivoted
nesnesidir,- A'nın eleman türü bir BLAS türü (
Float32
,Float64
,ComplexF32
veyaComplexF64
) ise,F
birQRCompactWY
nesnesidir, - aksi takdirde
F
birQR
nesnesidir.
Faktorizasyonun bireysel bileşenleri F
üzerinden özellik erişimcileri ile alınabilir:
F.Q
: ortogonal/ünite matrisQ
F.R
: üst üçgen matrisR
F.p
: pivotun permütasyon vektörü (QRPivoted
yalnızca)F.P
: pivotun permütasyon matris (QRPivoted
yalnızca)
F.R
üzerinden üst üçgen faktöre yapılan her referans yeni bir dizi ayırır. Bu nedenle, o diziyi önbelleğe almak, örneğin R = F.R
ile devam etmek tavsiye edilir.
Faktorizasyonu yineleyerek Q
, R
ve mevcutsa p
bileşenlerini üretir.
QR
nesneleri için aşağıdaki fonksiyonlar mevcuttur: inv
, size
ve \
. A
dikdörtgen olduğunda, \
en küçük kareler çözümünü döner ve çözüm benzersiz değilse, en küçük norm olanı döner. A
tam sıralı değilse, minimum norm çözümünü elde etmek için (sütun) pivotlama ile faktorizasyon gereklidir.
Tam/kare veya tam olmayan/kare Q
ile çarpma mümkündür, yani hem F.Q*F.R
hem de F.Q*A
desteklenir. Bir Q
matrisini Matrix
ile normal bir matrise dönüştürebilirsiniz. Bu işlem "ince" Q faktörünü döner, yani A
m
×n
ise ve m>=n
ise, Matrix(F.Q)
ortonormal sütunlara sahip bir m
×n
matris döner. "Tam" Q faktörünü almak için, bir m
×m
ortogonal matris, F.Q*I
veya collect(F.Q)
kullanın. Eğer m<=n
ise, Matrix(F.Q)
bir m
×m
ortogonal matris döner.
QR faktorizasyonu için blok boyutu, pivot == NoPivot()
ve A isa StridedMatrix{<:BlasFloat}
olduğunda anahtar argüman blocksize :: Integer
ile belirtilebilir. blocksize > minimum(size(A))
olduğunda göz ardı edilir. QRCompactWY
için bakınız.
blocksize
anahtar argümanı Julia 1.4 veya daha yenisini gerektirir.
Örnekler
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 faktörü: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R faktörü:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
birden fazla tür döner çünkü LAPACK, Householder temel yansıtıcılarının ürünlerinin bellek depolama gereksinimlerini en aza indiren birkaç temsil kullanır, böylece Q
ve R
matrisleri ayrı yoğun matrisler olarak saklanabilir.
Noteworthy External Sparse Packages
Birçok diğer Julia paketi, bahsedilmesi gereken seyrek matris uygulamaları sunmaktadır:
SuiteSparseGraphBLAS.jl hızlı, çok iş parçacıklı SuiteSparse:GraphBLAS C kütüphanesinin bir sarmalayıcısıdır. CPU'da bu genellikle en hızlı seçenektir ve genellikle MKLSparse'den önemli ölçüde daha iyi performans gösterir.
CUDA.jl GPU seyrek matris işlemleri için CUSPARSE kütüphanesini açığa çıkarır.
SparseMatricesCSR.jl sıkıştırılmış seyrek satır (CSR) formatının Julia yerel uygulamasını sağlar.
MKLSparse.jl Intel'in MKL kütüphanesini kullanarak SparseArrays seyrek-sık matris işlemlerini hızlandırır.
SparseArrayKit.jl çok boyutlu seyrek diziler için mevcuttur.
LuxurySparse.jl statik seyrek dizi formatları ve bir koordinat formatı sağlar.
ExtendableSparse.jl enables fast insertion into sparse matrices using a lazy approach to new stored indices.
Finch.jl çok boyutlu seyrek dizi formatları ve işlemleri için kapsamlı destek sunar; bu, yerel Julia'da mini bir tensör dili ve derleyici aracılığıyla gerçekleştirilir. COO, CSF, CSR, CSC ve daha fazlası için destek ile birlikte yayın, azaltma vb. gibi işlemler ve özel işlemler de mevcuttur.
Dış paketler, seyrek doğrudan çözücüler sağlar:
Dış paketler, özdeğer sistemlerinin ve tekil değer ayrıştırmalarının yinelemeli çözümü için çözücüler sağlar:
Dışa bağımlı paketler ile grafiklerle çalışma:
- 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). Algoritma 832: UMFPACK V4.3–-bir Asimetrik Desenli Çoklu Yüzey Yöntemi. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM933Foster, L. V., & Davis, T. A. (2013). Algoritma 933: Sayısal Sıra, Null Alan Temelleri, Pseudoinverse Çözümleri ve SuiteSparseQR Kullanarak Temel Çözümlerinin Güvenilir Hesaplanması. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116