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.

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

Sparse Linear Algebra

Seyrek matris çözücüleri SuiteSparse adresinden fonksiyonlar çağırır. Aşağıdaki faktorizasyonlar mevcuttur:

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

Bu faktorizasyonlar, Sparse Linear Algebra API section içinde daha ayrıntılı olarak açıklanmaktadır:

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

SparseArrays API

SparseArrays.AbstractSparseVectorType
AbstractSparseVector{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.

source
SparseArrays.AbstractSparseMatrixType
AbstractSparseMatrix{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.

source
SparseArrays.SparseVectorType
SparseVector{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.

source
SparseArrays.sparseFunction
sparse(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
source
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
source
SparseArrays.sparse!Function
sparse!(I::AbstractVector{Ti}, J::AbstractVector{Ti}, V::AbstractVector{Tv},
        m::Integer, n::Integer, combine, klasttouch::Vector{Ti},
        csrrowptr::Vector{Ti}, csrcolval::Vector{Ti}, csrnzval::Vector{Tv},
        [csccolptr::Vector{Ti}], [cscrowval::Vector{Ti}, cscnzval::Vector{Tv}] ) where {Tv,Ti<:Integer}

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.

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

Julia 1.10

Bu yöntem Julia sürümü 1.10 veya daha yenisini gerektirir.

source
SparseArrays.sparsevecFunction
sparsevec(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
source
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
source
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
source
Base.similarMethod
similar(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.

source
SparseArrays.issparseFunction
issparse(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
source
SparseArrays.nnzFunction
nnz(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
source
SparseArrays.findnzFunction
findnz(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])
source
SparseArrays.spzerosFunction
spzeros([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
source
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.

Julia 1.10

Bu yöntem Julia sürüm 1.10 veya daha yenisini gerektirir.

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

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.

Julia 1.10

Bu yöntem Julia sürüm 1.10 veya daha yenisini gerektirir.

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

Julia 1.10

Bu yöntem Julia sürümü 1.10 veya daha yenisini gerektirir.

source
SparseArrays.spdiagmFunction
spdiagm(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 ⋅ ```

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

Julia 1.6

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
source
SparseArrays.sparse_hcatFunction
sparse_hcat(A...)

Boyut 2 boyunca birleştir. Bir SparseMatrixCSC nesnesi döndür.

Julia 1.8

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.

source
SparseArrays.sparse_vcatFunction
sparse_vcat(A...)

Boyut 1 boyunca birleştirir. Bir SparseMatrixCSC nesnesi döner.

Julia 1.8

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.

source
SparseArrays.sparse_hvcatFunction
sparse_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.

Julia 1.8

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.

source
SparseArrays.blockdiagFunction
blockdiag(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
source
SparseArrays.sprandFunction
sprand([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
source
SparseArrays.sprandnFunction
sprandn([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.

Julia 1.1

Çı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
source
SparseArrays.nonzerosFunction
nonzeros(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
source
SparseArrays.rowvalsFunction
rowvals(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
source
SparseArrays.nzrangeFunction
nzrange(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.

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

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

A'n mutlak değeri tol'dan küçük veya eşit olan saklanan değerlerini kaldırır.

source
droptol!(x::AbstractCompressedVector, tol)

x'in mutlak değeri tol'dan küçük veya eşit olan saklanan değerleri kaldırır.

source
SparseArrays.dropzeros!Function
dropzeros!(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.

source
SparseArrays.dropzerosFunction
dropzeros(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
source
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
source
SparseArrays.permuteFunction
permute(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  ⋅  ⋅  ⋅
source
Base.permute!Method
permute!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti},
         p::AbstractVector{<:Integer}, q::AbstractVector{<:Integer},
         [C::AbstractSparseMatrixCSC{Tv,Ti}]) where {Tv,Ti}

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.

source
SparseArrays.halfperm!Function
halfperm!(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.

source
SparseArrays.ftranspose!Function
ftranspose!(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.

source

Sparse Linear Algebra API

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

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.

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

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

Not

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.

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

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

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

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

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

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

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

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

source
SparseArrays.CHOLMOD.lowrankupdowndate!Function
lowrankupdowndate!(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'

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

Not

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.

source
LinearAlgebra.luFunction
lu(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şenAçıklama
LLU'nun L (alt üçgen) kısmı
ULU'nun U (üst üçgen) kısmı
psağ permütasyon Vector
qsol 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.

Not

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.

source
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 de abs 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 ve iszero destekleyen ancak abs 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, hatta allowsingular = true olsa bile).

Faktorizasyonun bireysel bileşenlerine getproperty aracılığıyla erişilebilir:

BileşenAçıklama
F.LLU'nun L (alt üçgen) kısmı
F.ULU'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şlevLULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

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

Note

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
source
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() ise F bir QRPivoted nesnesidir,
  • A'nın eleman türü bir BLAS türü (Float32, Float64, ComplexF32 veya ComplexF64) ise, F bir QRCompactWY nesnesidir,
  • aksi takdirde F bir QR nesnesidir.

Faktorizasyonun bireysel bileşenleri F üzerinden özellik erişimcileri ile alınabilir:

  • F.Q: ortogonal/ünite matris Q
  • F.R: üst üçgen matris R
  • F.p: pivotun permütasyon vektörü (QRPivoted yalnızca)
  • F.P: pivotun permütasyon matris (QRPivoted yalnızca)
Not

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.

Julia 1.4

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
Not

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.

source

Noteworthy External Sparse Packages

Birçok diğer Julia paketi, bahsedilmesi gereken seyrek matris uygulamaları sunmaktadır:

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

  2. CUDA.jl GPU seyrek matris işlemleri için CUSPARSE kütüphanesini açığa çıkarır.

  3. SparseMatricesCSR.jl sıkıştırılmış seyrek satır (CSR) formatının Julia yerel uygulamasını sağlar.

  4. MKLSparse.jl Intel'in MKL kütüphanesini kullanarak SparseArrays seyrek-sık matris işlemlerini hızlandırır.

  5. SparseArrayKit.jl çok boyutlu seyrek diziler için mevcuttur.

  6. LuxurySparse.jl statik seyrek dizi formatları ve bir koordinat formatı sağlar.

  7. ExtendableSparse.jl enables fast insertion into sparse matrices using a lazy approach to new stored indices.

  8. 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:

  1. KLU.jl
  2. Pardiso.jl

Dış paketler, özdeğer sistemlerinin ve tekil değer ayrıştırmalarının yinelemeli çözümü için çözücüler sağlar:

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

Dışa bağımlı paketler ile grafiklerle çalışma:

  1. Graphs.jl
  • ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
  • DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
  • ACM832Davis, Timothy A. (2004b). 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