Sparse Arrays

تدعم جوليا المتجهات النادرة و sparse matrices في وحدة SparseArrays القياسية. المصفوفات النادرة هي مصفوفات تحتوي على عدد كافٍ من الأصفار بحيث يؤدي تخزينها في هيكل بيانات خاص إلى توفير في المساحة ووقت التنفيذ، مقارنةً بالمصفوفات الكثيفة.

يمكن العثور على حزم خارجية تقوم بتنفيذ أنواع تخزين متفرقة مختلفة، ومصفوفات متفرقة متعددة الأبعاد، والمزيد في Noteworthy External Sparse Packages

Compressed Sparse Column (CSC) Sparse Matrix Storage

في جوليا، يتم تخزين المصفوفات النادرة في Compressed Sparse Column (CSC) format. تحتوي مصفوفات جوليا النادرة على النوع SparseMatrixCSC{Tv,Ti}، حيث Tv هو نوع القيم المخزنة، و Ti هو النوع الصحيح لتخزين مؤشرات الأعمدة ومؤشرات الصفوف. التمثيل الداخلي لـ SparseMatrixCSC هو كما يلي:

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

تجعل تخزين الأعمدة المتفرقة المضغوطة من السهل والسريع الوصول إلى العناصر في عمود مصفوفة متفرقة، بينما يكون الوصول إلى المصفوفة المتفرقة عن طريق الصفوف أبطأ بكثير. العمليات مثل إدخال إدخالات غير مخزنة مسبقًا واحدة تلو الأخرى في هيكل CSC تميل إلى أن تكون بطيئة. وذلك لأن جميع عناصر المصفوفة المتفرقة التي تتجاوز نقطة الإدخال يجب أن تُنقل مكانًا واحدًا.

تم تنفيذ جميع العمليات على المصفوفات النادرة بعناية لاستغلال بنية بيانات CSC من أجل الأداء، ولتجنب العمليات المكلفة.

إذا كان لديك بيانات بتنسيق CSC من تطبيق أو مكتبة مختلفة، وترغب في استيرادها في جوليا، تأكد من أنك تستخدم الفهرسة التي تبدأ من 1. يجب أن تكون مؤشرات الصفوف في كل عمود مرتبة، وإذا لم تكن مرتبة، ستظهر المصفوفة بشكل غير صحيح. إذا كان كائن SparseMatrixCSC الخاص بك يحتوي على مؤشرات صفوف غير مرتبة، فإن إحدى الطرق السريعة لترتيبها هي القيام بعملية نقل مزدوج. نظرًا لأن عملية النقل كسولة، قم بعمل نسخة لتجسيد كل نقل.

في بعض التطبيقات، من الملائم تخزين قيم صفرية صريحة في SparseMatrixCSC. هذه مقبولة من قبل الدوال في Base (لكن لا يوجد ضمان بأنها ستظل محفوظة في العمليات المتغيرة). يتم التعامل مع هذه الأصفار المخزنة صراحة كغير صفرية هيكلية من قبل العديد من الروتينات. دالة nnz تعيد عدد العناصر المخزنة صراحة في هيكل البيانات المتناثر، بما في ذلك الأصفار غير الهيكلية. من أجل حساب العدد الدقيق لغير الأصفار العددية، استخدم count(!iszero, x)، التي تفحص كل عنصر مخزن في مصفوفة متناثرة. يمكن استخدام dropzeros، وdropzeros! في المكان، لإزالة الأصفار المخزنة من المصفوفة المتناثرة.

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

تُخزَّن المتجهات النادرة في تنسيق مشابه جدًا لتنسيق العمود النادر المضغوط للمصفوفات النادرة. في جوليا، تمتلك المتجهات النادرة النوع SparseVector{Tv,Ti} حيث Tv هو نوع القيم المخزنة و Ti هو النوع الصحيح للفهارس. التمثيل الداخلي هو كما يلي:

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، يمكن أن يحتوي نوع SparseVector أيضًا على أصفار مخزنة بشكل صريح. (انظر Sparse Matrix Storage.)

Sparse Vector and Matrix Constructors

أبسط طريقة لإنشاء مصفوفة متفرقة هي استخدام دالة تعادل دالة zeros التي توفرها جوليا للعمل مع المصفوفات الكثيفة. لإنتاج مصفوفة متفرقة بدلاً من ذلك، يمكنك استخدام نفس الاسم مع بادئة sp:

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

تعتبر دالة sparse وسيلة مفيدة غالبًا لبناء المصفوفات المتناثرة. على سبيل المثال، لبناء مصفوفة متناثرة يمكننا إدخال متجه I لمؤشرات الصفوف، ومتجه J لمؤشرات الأعمدة، ومتجه V للقيم المخزنة (وهذا يُعرف أيضًا بـ COO (coordinate) format). تقوم sparse(I,J,V) بعد ذلك بإنشاء مصفوفة متناثرة بحيث S[I[k], J[k]] = V[k]. المُنشئ المعادل للمتجه المتناثر هو sparsevec، الذي يأخذ متجه المؤشر (الصف) I ومتجه V مع القيم المخزنة ويقوم بإنشاء متجه متناثر R بحيث R[I[k]] = V[k].

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

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

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

عكس دالة sparse و sparsevec هو findnz، الذي يسترجع المدخلات المستخدمة لإنشاء المصفوفة المتناثرة (بما في ذلك الإدخالات المخزنة التي تساوي صفر). findall(!iszero, x) تعيد مؤشرات كارتيسية للإدخالات غير الصفرية في x (لا تشمل الإدخالات المخزنة التي تساوي صفر).

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

طريقة أخرى لإنشاء مصفوفة متفرقة هي تحويل مصفوفة كثيفة إلى مصفوفة متفرقة باستخدام دالة sparse:

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

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

يمكنك الذهاب في الاتجاه الآخر باستخدام المُنشئ Array. يمكن استخدام الدالة issparse للاستعلام عما إذا كانت المصفوفة متفرقة.

julia> issparse(spzeros(5))
true

Sparse matrix operations

تعمل العمليات الحسابية على المصفوفات المتناثرة كما تعمل على المصفوفات الكثيفة. يعمل الفهرسة، والتعيين، والدمج للمصفوفات المتناثرة بنفس الطريقة كما في المصفوفات الكثيفة. تعتبر عمليات الفهرسة، وخاصة التعيين، مكلفة، عندما يتم تنفيذها عنصرًا واحدًا في كل مرة. في العديد من الحالات، قد يكون من الأفضل تحويل المصفوفة المتناثرة إلى تنسيق (I,J,V) باستخدام findnz، ومعالجة القيم أو الهيكل في المتجهات الكثيفة (I,J,V)، ثم إعادة بناء المصفوفة المتناثرة.

Correspondence of dense and sparse methods

الجدول التالي يوضح العلاقة بين الطرق المدمجة على المصفوفات المتناثرة والطرق المقابلة لها على أنواع المصفوفات الكثيفة. بشكل عام، تختلف الطرق التي تولد مصفوفات متناثرة عن نظيراتها الكثيفة في أن المصفوفة الناتجة تتبع نفس نمط التشتت لمصفوفة متناثرة معينة S، أو أن المصفوفة المتناثرة الناتجة لها كثافة d، أي أن كل عنصر في المصفوفة لديه احتمال d أن يكون غير صفري.

يمكن العثور على التفاصيل في قسم Sparse Vectors and Matrices من مرجع مكتبة المعايير.

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

تستدعي حلول المصفوفات المتناثرة دوال من SuiteSparse. التحققات التالية متاحة:

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

تتم مناقشة هذه التحليلات بمزيد من التفصيل في Sparse Linear Algebra API section:

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

SparseArrays API

SparseArrays.AbstractSparseArrayType
AbstractSparseArray{Tv,Ti,N}

نوع أعلى لمصفوفات متفرقة ذات N أبعاد (أو أنواع مشابهة للمصفوفات) مع عناصر من نوع Tv ونوع فهرس Ti. SparseMatrixCSC، SparseVector و SuiteSparse.CHOLMOD.Sparse هي أنواع فرعية من هذا.

source
SparseArrays.AbstractSparseVectorType
AbstractSparseVector{Tv,Ti}

نوع أعلى للمصفوفات النادرة أحادية البعد (أو الأنواع الشبيهة بالمصفوفات) مع عناصر من النوع Tv ونوع الفهرس Ti. اسم مستعار لـ AbstractSparseArray{Tv,Ti,1}.

source
SparseArrays.AbstractSparseMatrixType
AbstractSparseMatrix{Tv,Ti}

نوع أعلى لمصفوفات متفرقة ثنائية الأبعاد (أو أنواع مشابهة للمصفوفات) مع عناصر من نوع Tv ونوع فهرس Ti. اسم مستعار لـ AbstractSparseArray{Tv,Ti,2}.

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

نوع المتجه لتخزين المتجهات المتناثرة. يمكن إنشاؤه عن طريق تمرير طول المتجه، ومتجه مرتّب من الفهارس غير الصفرية، ومتجه من القيم غير الصفرية.

على سبيل المثال، يمكن تمثيل المتجه [5, 6, 0, 7] كالتالي

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

هذا يشير إلى أن العنصر في الفهرس 1 هو 5، وفي الفهرس 2 هو 6، وفي الفهرس 3 هو zero(Int)، وفي الفهرس 4 هو 7.

قد يكون من الأكثر ملاءمة إنشاء المتجهات المتناثرة مباشرة من المتجهات الكثيفة باستخدام sparse كالتالي

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

يؤدي إلى نفس المتجه المتناثر.

source
SparseArrays.sparseFunction
sparse(A)

قم بتحويل مصفوفة AbstractMatrix A إلى مصفوفة متفرقة.

أمثلة

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 بأبعاد m x n بحيث S[I[k], J[k]] = V[k]. تُستخدم دالة combine لدمج العناصر المكررة. إذا لم يتم تحديد m و n، يتم تعيينهما إلى maximum(I) و maximum(J) على التوالي. إذا لم يتم توفير دالة combine، فإن combine الافتراضية هي + ما لم تكن عناصر V من نوع Boolean، وفي هذه الحالة تكون combine الافتراضية هي |. يجب أن تلبي جميع عناصر I الشرط 1 <= I[k] <= m، ويجب أن تلبي جميع عناصر J الشرط 1 <= J[k] <= n. يتم الاحتفاظ بالأصفار العددية في (I, J, V) كأصفار هيكلية غير صفرية؛ لإسقاط الأصفار العددية، استخدم dropzeros!.

للحصول على وثائق إضافية وسائق خبير، انظر SparseArrays.sparse!.

أمثلة

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؛ انظر إلى sparse للاستخدام الأساسي. تتيح هذه الطريقة للمستخدم توفير تخزين مسبق التخصيص لكائنات sparse الوسيطة والنتيجة كما هو موضح أدناه. تمكّن هذه القدرة من بناء أكثر كفاءة لمصفوفات SparseMatrixCSC من التمثيلات الإحداثية، كما تتيح أيضًا استخراج تمثيل عمود غير مرتب لمصفوفة النتيجة المنقولة دون تكلفة إضافية.

تتكون هذه الطريقة من ثلاث خطوات رئيسية: (1) فرز العد للتمثيل الإحداثي المقدم إلى شكل CSR غير مرتب يتضمن إدخالات مكررة. (2) اجتياز الشكل CSR، مع حساب مصفوفة مؤشرات الأعمدة لشكل CSC المطلوب، واكتشاف الإدخالات المكررة، وإعادة تعبئة الشكل CSR مع دمج الإدخالات المكررة؛ هذه المرحلة تنتج شكل CSR غير مرتب بدون إدخالات مكررة. (3) فرز العد للشكل CSR السابق إلى شكل CSC مرتب بالكامل بدون إدخالات مكررة.

تشكل مصفوفات الإدخال csrrowptr و csrcolval و csrnzval تخزينًا للأشكال الوسيطة CSR وتتطلب length(csrrowptr) >= m + 1 و length(csrcolval) >= length(I) و length(csrnzval >= length(I)). تتطلب مصفوفة الإدخال klasttouch، مساحة العمل للمرحلة الثانية، length(klasttouch) >= n. تشكل مصفوفات الإدخال الاختيارية csccolptr و cscrowval و cscnzval تخزينًا لشكل CSC المعاد S. إذا لزم الأمر، يتم تغيير حجمها تلقائيًا لتلبية length(csccolptr) = n + 1 و length(cscrowval) = nnz(S) و length(cscnzval) = nnz(S)؛ وبالتالي، إذا كانت nnz(S) غير معروفة في البداية، فإن تمرير متجهات فارغة من النوع المناسب (Vector{Ti}() و Vector{Tv}() على التوالي) يكفي، أو استدعاء طريقة sparse! متجاهلاً cscrowval و cscnzval.

عند العودة، تحتوي csrrowptr و csrcolval و csrnzval على تمثيل عمود غير مرتب لمصفوفة النتيجة المنقولة.

يمكنك إعادة استخدام تخزين مصفوفات الإدخال (I و J و V) لمصفوفات الإخراج (csccolptr و cscrowval و cscnzval). على سبيل المثال، يمكنك استدعاء sparse!(I, J, V, csrrowptr, csrcolval, csrnzval, I, J, V). لاحظ أنه سيتم تغيير حجمها لتلبية الشروط المذكورة أعلاه.

من أجل الكفاءة، لا تقوم هذه الطريقة بأي فحص للمعاملات بخلاف 1 <= I[k] <= m و 1 <= J[k] <= n. استخدمها بحذر. من الحكمة اختبارها باستخدام --check-bounds=yes.

تعمل هذه الطريقة في زمن O(m, n, length(I)). استلهم استخدام هذه الطريقة من خوارزمية HALFPERM الموصوفة في F. Gustavson، "خوارزميات سريعة لمصفوفات متفرقة: الضرب والنقل الم permuted"، ACM TOMS 4(3)، 250-269 (1978).

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

نسخة من sparse! التي تعيد استخدام المتجهات المدخلة (I, J, V) لتخزين المصفوفة النهائية. بعد البناء، ستشير المتجهات المدخلة إلى مخازن المصفوفة؛ S.colptr === I، S.rowval === J، و S.nzval === V صحيح، وسيتم resize! حسب الحاجة.

لاحظ أن بعض مخازن العمل ستظل مخصصة. على وجه التحديد، هذه الطريقة هي غلاف ملائم حول sparse!(I, J, V, m, n, combine, klasttouch, csrrowptr, csrcolval, csrnzval, csccolptr, cscrowval, cscnzval) حيث تقوم هذه الطريقة بتخصيص klasttouch، csrrowptr، csrcolval، و csrnzval بالحجم المناسب، ولكن تعيد استخدام I، J، و V لـ csccolptr، cscrowval، و cscnzval.

المتغيرات m، n، و combine افتراضيًا إلى maximum(I)، maximum(J)، و +، على التوالي.

Julia 1.10

تتطلب هذه الطريقة إصدار Julia 1.10 أو أحدث.

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

أنشئ متجهًا نادرًا S بطول m بحيث S[I[k]] = V[k]. يتم دمج التكرارات باستخدام دالة combine، التي تكون افتراضيًا + إذا لم يتم توفير أي وسيط combine، ما لم تكن عناصر V من نوع Boolean، وفي هذه الحالة تكون combine افتراضيًا |.

أمثلة

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 حيث تكون الفهارس غير الصفرية هي المفاتيح من القاموس، والقيم غير الصفرية هي القيم من القاموس.

أمثلة

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

قم بتحويل متجه A إلى متجه متفرق بطول m.

أمثلة

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}

قم بإنشاء مصفوفة قابلة للتعديل غير مُهيأة مع نوع العنصر المحدد، ونوع الفهرس، والحجم، بناءً على مصدر SparseMatrixCSC المعطى. تحافظ المصفوفة المتناثرة الجديدة على هيكل المصفوفة المتناثرة الأصلية، باستثناء الحالة التي تكون فيها أبعاد مصفوفة الإخراج مختلفة عن الإخراج.

تحتوي مصفوفة الإخراج على أصفار في نفس المواقع مثل الإدخال، ولكن بقيم غير مُهيأة للمواقع غير الصفرية.

source
SparseArrays.issparseFunction
issparse(S)

ترجع true إذا كان S متفرقًا، و false خلاف ذلك.

أمثلة

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

julia> issparse(sv)
true

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

يُرجع عدد العناصر المخزنة (المملوءة) في مصفوفة متفرقة.

أمثلة

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} مع 3 إدخالات مخزنة:
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

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

إرجاع زوج مرتب (I, J, V) حيث I و J هما مؤشرات الصف والعمود للقيم المخزنة ("غير الصفرية هيكليًا") في المصفوفة المتناثرة A، و V هو متجه القيم.

أمثلة

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([type,]m[,n])

أنشئ متجهًا متفرقًا بطول m أو مصفوفة متفرقة بحجم m x n. لن تحتوي هذه المصفوفة المتفرقة على أي قيم غير صفرية. لن يتم تخصيص أي تخزين للقيم غير الصفرية أثناء الإنشاء. النوع الافتراضي هو Float64 إذا لم يتم تحديده.

أمثلة

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 بأبعاد m x n مع أصفار هيكلية عند S[I[k], J[k]].

يمكن استخدام هذه الطريقة لبناء نمط التفرغ للمصفوفة، وهي أكثر كفاءة من استخدام مثلاً sparse(I, J, zeros(length(I))).

للحصول على وثائق إضافية وسائق خبير، انظر SparseArrays.spzeros!.

Julia 1.10

تتطلب هذه الطريقة إصدار جوليا 1.10 أو أحدث.

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) مما يسمح للمستخدم بتوفير تخزين مسبق التخصيص للكائنات الوسيطة. هذه الطريقة هي لـ spzeros مثلما أن SparseArrays.sparse! هي لـ sparse. راجع الوثائق الخاصة بـ SparseArrays.sparse! للحصول على التفاصيل وأطوال المخازن المطلوبة.

Julia 1.10

تتطلب هذه الطريقة إصدار Julia 1.10 أو أحدث.

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

نسخة من spzeros! التي تعيد استخدام المتجهات المدخلة I و J لتخزين المصفوفة النهائية. بعد الإنشاء، ستتطابق المتجهات المدخلة مع مخازن المصفوفة؛ S.colptr === I و S.rowval === J صحيح، وسيتم resize! حسب الحاجة.

لاحظ أن بعض مخازن العمل ستظل مخصصة. على وجه التحديد، هذه الطريقة هي غلاف ملائم حول spzeros!(Tv, I, J, m, n, klasttouch, csrrowptr, csrcolval, csccolptr, cscrowval) حيث تقوم هذه الطريقة بتخصيص klasttouch و csrrowptr و csrcolval بالحجم المناسب، ولكن تعيد استخدام I و J لـ csccolptr و cscrowval.

المتغيرات m و n افتراضيًا إلى maximum(I) و maximum(J).

Julia 1.10

تتطلب هذه الطريقة إصدار Julia 1.10 أو أحدث.

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

قم بإنشاء مصفوفة قطرية متفرقة من `Pair`s من المتجهات والقطر. سيتم وضع كل متجه `kv.second` على القطر `kv.first`. بشكل افتراضي، تكون المصفوفة مربعة وحجمها مستنتج من `kv`، ولكن يمكن تحديد حجم غير مربع `m`×`n` (مُبطن بالأصفار حسب الحاجة) عن طريق تمرير `m,n` كأول وسيطين.

# أمثلة

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)

قم بإنشاء مصفوفة متفرقة مع عناصر المتجه كعناصر قطرية. بشكل افتراضي (بدون إعطاء m و n)، تكون المصفوفة مربعة وحجمها محدد بواسطة length(v)، ولكن يمكن تحديد حجم غير مربع m×n عن طريق تمرير m و n كأول وسيطين.

Julia 1.6

تتطلب هذه الدوال على الأقل Julia 1.6.

أمثلة

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

قم بالدمج على طول البعد 2. أعد كائن SparseMatrixCSC.

جوليا 1.8

تم إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك الدمج السابق، حيث كان الدمج مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl ينتج تلقائيًا مخرجات نادرة حتى في غياب أي وسيط SparseArray.

source
SparseArrays.sparse_vcatFunction
sparse_vcat(A...)

قم بالدمج على طول البعد 1. أعد كائن SparseMatrixCSC.

جوليا 1.8

تم إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك الدمج السابق، حيث كان الدمج مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl يؤدي تلقائيًا إلى مخرجات نادرة حتى في غياب أي وسيط SparseArray.

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

التجميع الأفقي والعمودي النادر في استدعاء واحد. يتم استدعاء هذه الدالة لكتلة بناء الجملة للمصفوفة. يحدد الوسيط الأول عدد الوسائط التي سيتم تجميعها في كل صف كتلة.

جوليا 1.8

تمت إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك التجميع السابق، حيث كان التجميع مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl ينتج تلقائيًا مخرجات نادرة حتى في غياب أي وسيط SparseArray.

source
SparseArrays.blockdiagFunction
blockdiag(A...)

دمج المصفوفات بشكل قطري. حاليًا تم تنفيذها فقط للمصفوفات المتناثرة.

أمثلة

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

قم بإنشاء متجه متفرق بطول عشوائي m أو مصفوفة متفرقة بحجم m في n، حيث يتم إعطاء احتمال أن يكون أي عنصر غير صفري بشكل مستقل بواسطة p (ومن ثم فإن الكثافة المتوسطة للقيم غير الصفرية هي أيضًا بالضبط p). تحدد الوسيطة الاختيارية rng مولد الأرقام العشوائية، انظر الأرقام العشوائية. تحدد الوسيطة الاختيارية T نوع العنصر، والذي يكون افتراضيًا Float64.

بشكل افتراضي، يتم أخذ القيم غير الصفرية من توزيع موحد باستخدام دالة rand، أي بواسطة rand(T)، أو rand(rng, T) إذا تم توفير rng؛ بالنسبة لـ T=Float64 الافتراضي، يتوافق ذلك مع القيم غير الصفرية المأخوذة بشكل موحد في [0,1).

يمكنك أخذ القيم غير الصفرية من توزيع مختلف عن طريق تمرير دالة مخصصة rfn بدلاً من rand. يجب أن تكون هذه دالة rfn(k) التي تعيد مصفوفة من k أرقام عشوائية مأخوذة من التوزيع المطلوب؛ بدلاً من ذلك، إذا تم توفير rng، يجب أن تكون دالة rfn(rng, k).

أمثلة

julia> sprand(Bool, 2, 2, 0.5)
2×2 SparseMatrixCSC{Bool, Int64} with 2 stored entries:
 1  1
 ⋅  ⋅

julia> sprand(Float64, 3, 0.75)
3-element SparseVector{Float64, Int64} with 2 stored entries:
  [1]  =  0.795547
  [2]  =  0.49425
source
SparseArrays.sprandnFunction
sprandn([rng][,Type],m[,n],p::AbstractFloat)

قم بإنشاء متجه متفرق عشوائي بطول m أو مصفوفة متفرقة بحجم m في n مع الاحتمال المحدد (المستقل) p لأي إدخال يكون غير صفري، حيث يتم أخذ القيم غير الصفرية من التوزيع الطبيعي. تحدد الوسيطة الاختيارية rng مولد الأرقام العشوائية، انظر Random Numbers.

Julia 1.1

يتطلب تحديد نوع عنصر الإخراج Type على الأقل Julia 1.1.

أمثلة

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)

إرجاع متجه للقيم غير الصفرية الهيكلية في المصفوفة النادرة A. يتضمن ذلك الأصفار التي تم تخزينها بشكل صريح في المصفوفة النادرة. يشير المتجه المعاد مباشرة إلى التخزين الداخلي للقيم غير الصفرية لـ A، وأي تعديلات على المتجه المعاد ستؤدي إلى تغيير A أيضًا. انظر rowvals و nzrange.

أمثلة

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. أي تعديلات على المتجه المعاد ستؤدي إلى تغيير A أيضًا. يمكن أن يكون الوصول إلى كيفية تخزين مؤشرات الصفوف داخليًا مفيدًا بالتزامن مع التكرار على القيم غير الصفرية الهيكلية. انظر أيضًا nonzeros و nzrange.

أمثلة

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} مع 3 مدخلات مخزنة:
 2  ⋅  ⋅
 ⋅  2  ⋅
 ⋅  ⋅  2

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

إرجاع نطاق الفهارس للقيم غير الصفرية الهيكلية لعمود مصفوفة متفرقة. بالاشتراك مع nonzeros و rowvals، يتيح ذلك التكرار المريح على مصفوفة متفرقة:

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]
      # قم بأداء السحر المتفرق...
   end
end

!!! تحذير قد يؤدي إضافة أو إزالة عناصر غير صفرية من المصفوفة إلى إبطال nzrange، يجب عدم تعديل المصفوفة أثناء التكرار.

source
nzrange(x::SparseVectorUnion, col)

يعطي نطاق الفهارس للقيم غير الصفرية الهيكلية لمتجه متفرق. يتم تجاهل فهرس العمود col (يُفترض أن يكون 1).

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

يُزيل القيم المخزنة من A التي تكون قيمتها المطلقة أقل من أو تساوي tol.

source
droptol!(x::AbstractCompressedVector, tol)

يُزيل القيم المخزنة من x التي تكون قيمتها المطلقة أقل من أو تساوي tol.

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

يُزيل الأصفار العددية المخزنة من x.

لنسخة خارج المكان، انظر dropzeros. لمعلومات خوارزمية، انظر fkeep!.

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

ينشئ نسخة من A ويزيل الأصفار العددية المخزنة من تلك النسخة.

لنسخة في المكان ومعلومات خوارزمية، انظر dropzeros!.

أمثلة

julia> A = sparse([1, 2, 3], [1, 2, 3], [1.0, 0.0, 1.0])
3×3 SparseMatrixCSC{Float64, Int64} مع 3 مدخلات مخزنة:
 1.0   ⋅    ⋅
  ⋅   0.0   ⋅
  ⋅    ⋅   1.0

julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64, Int64} مع 2 مدخلات مخزنة:
 1.0   ⋅    ⋅
  ⋅    ⋅    ⋅
  ⋅    ⋅   1.0
source
dropzeros(x::AbstractCompressedVector)

يولد نسخة من x ويزيل الأصفار العددية من تلك النسخة.

للحصول على نسخة في المكان ومعلومات خوارزمية، انظر dropzeros!.

أمثلة

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 بشكل ثنائي، مع إرجاع PAQ (A[p,q]). يجب أن يتطابق طول ترتيب الأعمدة q مع عدد أعمدة A (length(q) == size(A, 2)). يجب أن يتطابق طول ترتيب الصفوف p مع عدد صفوف A (length(p) == size(A, 1)).

للسائقين الخبراء ومعلومات إضافية، انظر permute!.

أمثلة

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 بشكل ثنائي، مع تخزين النتيجة PAQ (A[p,q]) في X. يخزن النتيجة الوسيطة (AQ)^T (transpose(A[:,q])) في الوسيطة الاختيارية C إذا كانت موجودة. يتطلب ألا يكون أي من X، A، وإذا كانت موجودة، C متطابقة مع بعضها؛ لتخزين النتيجة PAQ مرة أخرى في A، استخدم الطريقة التالية التي تفتقر إلى X:

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

يجب أن تتطابق أبعاد X مع أبعاد A (size(X, 1) == size(A, 1) و size(X, 2) == size(A, 2))، ويجب أن يحتوي X على مساحة تخزين كافية لاستيعاب جميع الإدخالات المخصصة في A (length(rowvals(X)) >= nnz(A) و length(nonzeros(X)) >= nnz(A)). يجب أن يتطابق طول إعادة ترتيب الأعمدة q مع عدد أعمدة A (length(q) == size(A, 2)). يجب أن يتطابق طول إعادة ترتيب الصفوف p مع عدد صفوف A (length(p) == size(A, 1)).

يجب أن تتطابق أبعاد C مع أبعاد transpose(A) (size(C, 1) == size(A, 2) و size(C, 2) == size(A, 1))، ويجب أن يحتوي C على مساحة تخزين كافية لاستيعاب جميع الإدخالات المخصصة في A (length(rowvals(C)) >= nnz(A) و length(nonzeros(C)) >= nnz(A)).

للحصول على معلومات إضافية (خوارزمية)، ولإصدارات من هذه الطرق التي تتجاوز التحقق من الوسائط، انظر الطرق الأبوية (غير المصدرة) unchecked_noalias_permute! و unchecked_aliasing_permute!.

انظر أيضًا permute.

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

قم بإعادة ترتيب الأعمدة ونسخ A، مع تطبيق f على كل عنصر من عناصر A، وتخزين النتيجة (f(A)Q)^T (map(f, transpose(A[:,q]))) في X.

يجب أن يتطابق نوع العنصر Tv في X مع f(::TvA)، حيث TvA هو نوع العنصر في A. يجب أن تتطابق أبعاد X مع أبعاد transpose(A) (size(X, 1) == size(A, 2) و size(X, 2) == size(A, 1))، ويجب أن يحتوي X على مساحة كافية لاستيعاب جميع العناصر المخصصة في A (length(rowvals(X)) >= nnz(A) و length(nonzeros(X)) >= nnz(A)). يجب أن يتطابق طول ترتيب الأعمدة q مع عدد أعمدة A (length(q) == size(A, 2)).

تعتبر هذه الطريقة الأصل للعديد من الطرق التي تقوم بعمليات النسخ وإعادة الترتيب على SparseMatrixCSCs. نظرًا لأن هذه الطريقة لا تقوم بأي فحص للمعاملات، يُفضل استخدام الطرق الفرعية الأكثر أمانًا ([c]transpose[!], permute[!]) بدلاً من الاستخدام المباشر.

تقوم هذه الطريقة بتنفيذ خوارزمية HALFPERM الموضحة في F. Gustavson، "خوارزميات سريعة لمصفوفات متفرقة: الضرب والنسخ المعاد ترتيبها"، ACM TOMS 4(3)، 250-269 (1978). تعمل الخوارزمية في زمن O(size(A, 1), size(A, 2), nnz(A)) ولا تتطلب أي مساحة إضافية بخلاف ما تم تمريره.

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

قم بنقل A وتخزينه في X مع تطبيق الدالة f على العناصر غير الصفرية. لا يتم إزالة الأصفار التي تم إنشاؤها بواسطة f. يجب أن يكون size(X) مساوياً لـ size(transpose(A)). لا يتم تخصيص ذاكرة إضافية بخلاف تغيير حجم rowval و nzval لـ X، إذا لزم الأمر.

انظر halfperm!

source

Sparse Linear Algebra API

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

احسب تحليل شولي (Cholesky) لمصفوفة كثيفة متناظرة موجبة محددة A وأعد Cholesky كتحليل. يمكن أن تكون المصفوفة A إما Symmetric أو Hermitian AbstractMatrix أو مصفوفة AbstractMatrix متناظرة أو هيرميتية تمامًا.

يمكن الحصول على عامل شولي المثلثي من التحليل F عبر F.L و F.U، حيث A ≈ F.U' * F.U ≈ F.L * F.L'.

تتوفر الوظائف التالية لأجسام Cholesky: size، \، inv، det، logdet و isposdef.

إذا كان لديك مصفوفة A غير هيرميتية قليلاً بسبب أخطاء التقريب في إنشائها، قم بلفها في Hermitian(A) قبل تمريرها إلى cholesky لمعالجتها كهرميتية تمامًا.

عندما يكون check = true، يتم إلقاء خطأ إذا فشلت التحليل. عندما يكون check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

أمثلة

julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
   4.0   12.0  -16.0
  12.0   37.0  -43.0
 -16.0  -43.0   98.0

julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true
source
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

احسب التحليل العوامل شوليكي المدعوم لمصفوفة كثيفة متناظرة إيجابية شبه محددة A وأعد CholeskyPivoted التحليل. يمكن أن تكون المصفوفة A إما Symmetric أو Hermitian AbstractMatrix أو مصفوفة AbstractMatrix متناظرة أو هيرميتية تمامًا.

يمكن الحصول على عامل شوليكي المثلث من التحليل F عبر F.L و F.U، والتبديل عبر F.p، حيث A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' مع Ur = F.U[1:F.rank, :] و Lr = F.L[:, 1:F.rank]، أو بدلاً من ذلك A ≈ Up' * Up ≈ Lp * Lp' مع Up = F.U[1:F.rank, invperm(F.p)] و Lp = F.L[invperm(F.p), 1:F.rank].

الوظائف التالية متاحة لكائنات CholeskyPivoted: size، \، inv، det، و rank.

تحدد المعلمة tol التسامح لتحديد الرتبة. بالنسبة للقيم السلبية، يكون التسامح هو دقة الآلة.

إذا كان لديك مصفوفة A غير هيرميتية قليلاً بسبب أخطاء التقريب في إنشائها، قم بلفها في Hermitian(A) قبل تمريرها إلى cholesky من أجل التعامل معها على أنها هيرميتية تمامًا.

عندما يكون check = true، يتم طرح خطأ إذا فشل التحليل. عندما يكون check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

أمثلة

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 factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # destructuring via iteration

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

احسب تحليل شولي (Cholesky) لمصفوفة متفرقة موجبة محددة A. يجب أن تكون A إما SparseMatrixCSC أو عرض Symmetric/Hermitian لمصفوفة SparseMatrixCSC. لاحظ أنه حتى إذا لم يكن لـ A علامة نوع، يجب أن تكون متماثلة أو هيرميتية. إذا لم يتم إعطاء perm، يتم استخدام ترتيب يقلل من التعبئة. F = cholesky(A) هو الأكثر استخدامًا لحل أنظمة المعادلات باستخدام F\b، ولكن أيضًا يتم تعريف الطرق diag، det، وlogdet لـ F. يمكنك أيضًا استخراج عوامل فردية من F، باستخدام F.L. ومع ذلك، نظرًا لأن التدوير مفعل بشكل افتراضي، يتم تمثيل التحليل داخليًا كـ A == P'*L*L'*P مع مصفوفة ترتيب P؛ استخدام L فقط دون مراعاة P سيعطي إجابات غير صحيحة. لتضمين تأثيرات الترتيب، من المفضل عادةً استخراج "عوامل مجمعة" مثل PtL = F.PtL (ما يعادل P'*L) و LtP = F.UP (ما يعادل L'*P).

عندما يكون check = true، يتم إلقاء خطأ إذا فشل التحليل. عندما يكون check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

تعيين وسيط الكلمة الاختياري shift يحسب التحليل لـ A+shift*I بدلاً من A. إذا تم توفير وسيط perm، يجب أن يكون ترتيبًا لـ 1:size(A,1) يعطي الترتيب الذي يجب استخدامه (بدلاً من ترتيب AMD الافتراضي لـ CHOLMOD).

أمثلة

في المثال التالي، يتم استخدام ترتيب يقلل من التعبئة وهو [3, 2, 1]. إذا تم تعيين perm إلى 1:3 لفرض عدم وجود ترتيب، فإن عدد العناصر غير الصفرية في العامل هو 6.

julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
 2  1  1
 1  2  0
 1  0  2

julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  5
nnz:     5
success: true

julia> C.p
3-element Vector{Int64}:
 3
 2
 1

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421   0.0       0.0
 0.0       1.41421   0.0
 0.707107  0.707107  1.0

julia> L * L' ≈ A[C.p, C.p]
true

julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} 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

!!! ملاحظة تستخدم هذه الطريقة مكتبة CHOLMOD[ACM887][DavisHager2009] من SuiteSparse. تدعم CHOLMOD فقط الأنواع الحقيقية أو المعقدة بدقة مفردة أو مزدوجة. سيتم تحويل مصفوفات الإدخال التي ليست من تلك الأنواع إلى هذه الأنواع حسب الاقتضاء.

يتم لف العديد من الوظائف الأخرى من CHOLMOD ولكنها ليست مصدرة من وحدة `Base.SparseArrays.CHOLMOD`.
source
LinearAlgebra.cholesky!Function
cholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky

نفس الشيء كما في cholesky، ولكن يوفر المساحة عن طريق الكتابة فوق المدخل A، بدلاً من إنشاء نسخة. يتم رمي استثناء InexactError إذا كانت التحليل ينتج عددًا لا يمكن تمثيله بواسطة نوع عنصر A، على سبيل المثال، لأنواع الأعداد الصحيحة.

أمثلة

julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
 1   2
 2  50

julia> cholesky!(A)
ERROR: InexactError: Int64(6.782329983125268)
Stacktrace:
[...]
source
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

نفس الشيء كما هو موضح في cholesky، ولكن يوفر المساحة عن طريق الكتابة فوق المدخل A، بدلاً من إنشاء نسخة. يتم رمي استثناء InexactError إذا كانت التحليل ينتج عنه رقم لا يمكن تمثيله بواسطة نوع عنصر A، على سبيل المثال، لأنواع الأعداد الصحيحة.

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

احسب تحليل شولي ( $LL'$ ) لعامل A، مع إعادة استخدام التحليل الرمزي F. يجب أن تكون A عبارة عن SparseMatrixCSC أو عرض Symmetric/ Hermitian لـ SparseMatrixCSC. لاحظ أنه حتى إذا لم يكن لـ A علامة نوع، يجب أن تظل متماثلة أو هيرميتية.

انظر أيضًا cholesky.

!!! ملاحظة تستخدم هذه الطريقة مكتبة CHOLMOD من SuiteSparse، التي تدعم فقط الأنواع الحقيقية أو المعقدة بدقة مفردة أو مزدوجة. سيتم تحويل المصفوفات المدخلة التي ليست من تلك الأنواع العنصرية إلى هذه الأنواع حسب الاقتضاء.

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

تحديث تحليل شولي C مع المتجه v. إذا كان A = C.U'C.U فإن CC = cholesky(C.U'C.U + v*v') ولكن حساب CC يستخدم فقط O(n^2) عمليات.

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

احصل على تحليل LDLt لـ A + C*C' معطى تحليل LDLt أو LLt لـ F من A.

العامل المعاد هو دائمًا تحليل LDLt.

انظر أيضًا lowrankupdate!, lowrankdowndate, lowrankdowndate!.

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

قم بتحديث تحليل شولي C باستخدام المتجه v. إذا كان A = C.U'C.U فإن CC = cholesky(C.U'C.U + v*v') ولكن حساب CC يستخدم فقط O(n^2) عمليات. يتم تحديث تحليل الإدخال C في المكان بحيث عند الخروج C == CC. يتم تدمير المتجه v أثناء الحساب.

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

تحديث LDLt أو LLt تحليل F لـ A إلى تحليل لـ A + C*C'.

يتم تحويل تحليلات LLt إلى LDLt.

انظر أيضًا lowrankupdate، lowrankdowndate، lowrankdowndate!.

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

تحديث منخفض الرتبة لتحليل شولي C باستخدام المتجه v. إذا كان A = C.U'C.U فإن CC = cholesky(C.U'C.U - v*v') ولكن حساب CC يستخدم فقط O(n^2) عمليات.

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

احصل على تحليل LDLt لـ A + C*C' معطى تحليل LDLt أو LLt لـ F من A.

العامل المعاد هو دائمًا تحليل LDLt.

انظر أيضًا lowrankdowndate!, lowrankupdate, lowrankupdate!.

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

تحديث عامل تشولسكي C باستخدام المتجه v. إذا كان A = C.U'C.U فإن CC = cholesky(C.U'C.U - v*v') ولكن حساب CC يستخدم فقط O(n^2) عمليات. يتم تحديث عامل الإدخال C في المكان بحيث عند الخروج C == CC. يتم تدمير المتجه v أثناء الحساب.

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

قم بتحديث عامل LDLt أو LLt F لـ A إلى عامل لـ A - C*C'.

يتم تحويل عوامل LLt إلى LDLt.

انظر أيضًا lowrankdowndate، lowrankupdate، lowrankupdate!.

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

تحديث تحليل LDLt أو LLt لـ F من A إلى تحليل لـ A ± C*C'.

إذا تم استخدام تحليل يحافظ على التشتت، أي L*L' == P*A*P'، فإن العامل الجديد سيكون L*L' == P*A*P' + C'*C

update: Cint(1) لـ A + CC'، Cint(0) لـ A - CC'

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

احسب تحليل LDLt (أي، $LDL^T$) لمصفوفة ثلاثية القطر الحقيقية المتماثلة S بحيث S = L*Diagonal(d)*L' حيث L هي مصفوفة مثلثية سفلية وحدوية و d هو متجه. الاستخدام الرئيسي لتحليل LDLt F = ldlt(S) هو حل نظام المعادلات الخطية Sx = b باستخدام F\b.

انظر أيضًا bunchkaufman لتحليل مشابه، ولكن مع التدوير، لمصفوفات متماثلة أو هيرميتية عشوائية.

أمثلة

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

احسب تحليل $LDL'$ لمصفوفة متفرقة A. يجب أن تكون A إما SparseMatrixCSC أو عرض Symmetric/Hermitian لمصفوفة متفرقة SparseMatrixCSC. لاحظ أنه حتى إذا لم يكن لدى A علامة نوع، يجب أن تظل متماثلة أو هيرميتية. يتم استخدام ترتيب يقلل من التعبئة. F = ldlt(A) هو الأكثر استخدامًا لحل أنظمة المعادلات A*x = b باستخدام F\b. يدعم كائن التحليل المعاد F أيضًا الطرق diag، det، logdet، وinv. يمكنك استخراج العوامل الفردية من F باستخدام F.L. ومع ذلك، نظرًا لأن التدوير مفعل بشكل افتراضي، يتم تمثيل التحليل داخليًا كـ A == P'*L*D*L'*P مع مصفوفة ترتيب P؛ استخدام L فقط دون مراعاة P سيعطي إجابات غير صحيحة. لتضمين آثار الترتيب، من المفضل عادةً استخراج العوامل "المجمعة" مثل PtL = F.PtL (ما يعادل P'*L) و LtP = F.UP (ما يعادل L'*P). القائمة الكاملة للعوامل المدعومة هي :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP.

عند check = true، يتم إلقاء خطأ إذا فشل التحليل. عند check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

تعيين وسيط الكلمة الاختياري shift يحسب التحليل لـ A+shift*I بدلاً من A. إذا تم توفير وسيط perm، يجب أن يكون ترتيبًا لـ 1:size(A,1) يعطي الترتيب الذي يجب استخدامه (بدلاً من ترتيب AMD الافتراضي لـ CHOLMOD).

!!! ملاحظة تستخدم هذه الطريقة مكتبة CHOLMOD[ACM887][DavisHager2009] من SuiteSparse. تدعم CHOLMOD فقط الأنواع الحقيقية أو المعقدة بدقة مفردة أو مزدوجة. سيتم تحويل المصفوفات المدخلة التي ليست من تلك الأنواع العنصرية إلى هذه الأنواع حسب الاقتضاء.

تم لف العديد من الوظائف الأخرى من CHOLMOD ولكن لم يتم تصديرها من وحدة `Base.SparseArrays.CHOLMOD`.
source
LinearAlgebra.luFunction
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

احسب تحليل LU لمصفوفة متفرقة A.

بالنسبة لـ A المتفرقة مع نوع عنصر حقيقي أو مركب، نوع الإرجاع لـ F هو UmfpackLU{Tv, Ti}، حيث Tv = Float64 أو ComplexF64 على التوالي و Ti هو نوع صحيح (Int32 أو Int64).

عندما يكون check = true، يتم إلقاء خطأ إذا فشل التحليل. عندما يكون check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

يمكن أن يكون التبديل q إما متجه تبديل أو nothing. إذا لم يتم توفير متجه تبديل أو كان q هو nothing، يتم استخدام الافتراضي لـ UMFPACK. إذا لم يكن التبديل يعتمد على الصفر، يتم عمل نسخة تعتمد على الصفر.

يتضمن متجه control التكوين الافتراضي لحزمة Julia SparseArrays لـ UMFPACK (ملاحظة: تم تعديل هذا من الافتراضيات لـ UMFPACK لتعطيل التحسين التكراري)، ولكن يمكن تغييره عن طريق تمرير متجه بطول UMFPACK_CONTROL، انظر دليل UMFPACK للتكوينات الممكنة. على سبيل المثال لإعادة تمكين التحسين التكراري:

umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # قراءة التكوين الافتراضي لجوليا لمصفوفة متفرقة من نوع Float64
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # اختياري - عرض القيم
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # إعادة تمكين التحسين التكراري (2 هو الحد الأقصى الافتراضي لخطوات التحسين التكراري لـ UMFPACK)

Alu = lu(A; control = umfpack_control)
x = Alu \ b   # حل Ax = b، بما في ذلك التحسين التكراري لـ UMFPACK

يمكن الوصول إلى المكونات الفردية للتحليل F عن طريق الفهرسة:

المكونالوصف
Lالجزء L (مثلث سفلي) من LU
Uالجزء U (مثلث علوي) من LU
pتبديل يميني Vector
qتبديل يساري Vector
RsVector من عوامل التوسيع
:مكونات (L,U,p,q,Rs)

العلاقة بين F و A هي

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

يدعم F أيضًا الوظائف التالية:

انظر أيضًا lu!

!!! ملاحظة lu(A::AbstractSparseMatrixCSC) يستخدم مكتبة UMFPACK[ACM832] التي هي جزء من SuiteSparse. حيث أن هذه المكتبة تدعم فقط المصفوفات المتفرقة مع عناصر Float64 أو ComplexF64، يقوم lu بتحويل A إلى نسخة من النوع SparseMatrixCSC{Float64} أو SparseMatrixCSC{ComplexF64} حسب الاقتضاء.

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

احسب تحليل LU لـ A.

عندما يكون check = true، يتم إلقاء خطأ إذا فشلت التحليل. عندما يكون check = false، تقع مسؤولية التحقق من صحة التحليل (عبر issuccess) على عاتق المستخدم.

بشكل افتراضي، مع check = true، يتم أيضًا إلقاء خطأ عندما ينتج التحليل عوامل صالحة، ولكن العامل العلوي المثلث U يعاني من نقص في الرتبة. يمكن تغيير ذلك عن طريق تمرير allowsingular = true.

في معظم الحالات، إذا كانت A نوعًا فرعيًا S من AbstractMatrix{T} مع نوع عنصر T يدعم + و - و * و /، فإن نوع الإرجاع هو LU{T,S{T}}.

بشكل عام، يتضمن تحليل LU تبديل صفوف المصفوفة (الذي يتوافق مع مخرجات F.p الموضحة أدناه)، والمعروف باسم "التحويل" (لأنه يتوافق مع اختيار الصف الذي يحتوي على "التحويل"، المدخل القطري لـ F.U). يمكن اختيار واحدة من استراتيجيات التحويل التالية عبر وسيط pivot الاختياري:

  • RowMaximum() (افتراضي): استراتيجية التحويل القياسية؛ يتوافق التحويل مع العنصر الذي له أكبر قيمة مطلقة بين الصفوف المتبقية التي سيتم تحليلها. تتطلب هذه الاستراتيجية أن يدعم نوع العنصر أيضًا abs و <. (هذه هي الخيار الوحيد المستقر عدديًا لمصفوفات النقاط العائمة بشكل عام.)
  • RowNonZero(): يتوافق التحويل مع أول عنصر غير صفري بين الصفوف المتبقية التي سيتم تحليلها. (هذا يتوافق مع الاختيار النموذجي في الحسابات اليدوية، وهو مفيد أيضًا لأنواع الأعداد الجبرية الأكثر عمومية التي تدعم iszero ولكن ليس abs أو <.)
  • NoPivot(): تم إيقاف التحويل (سيفشل إذا تم مواجهة إدخال صفري في موضع التحويل، حتى عندما يكون allowsingular = true).

يمكن الوصول إلى المكونات الفردية للتحليل F عبر getproperty:

المكونالوصف
F.LL (جزء مثلث سفلي) من LU
F.UU (جزء مثلث علوي) من LU
F.p(يمين) تبديل Vector
F.P(يمين) تبديل Matrix

يؤدي تكرار التحليل إلى إنتاج المكونات F.L و F.U و F.p.

العلاقة بين F و A هي

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

يدعم F أيضًا الوظائف التالية:

الوظيفة المدعومةLULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
جوليا 1.11

تم إضافة وسيط الكلمة الرئيسية allowsingular في جوليا 1.11.

أمثلة

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 factor:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U factor:
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); # تفكيك عبر التكرار

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 factor:
2×2 Matrix{Float64}:
 1.0  0.0
 1.0  1.0
U factor (rank-deficient):
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

احسب تحليل QR لمصفوفة متفرقة A. يتم استخدام تبديلات الصفوف والأعمدة التي تقلل من التعبئة بحيث F.R = F.Q'*A[F.prow,F.pcol]. التطبيق الرئيسي لهذا النوع هو حل مشاكل المربعات الصغرى أو المشاكل غير المحددة باستخدام \. تستدعي الدالة مكتبة C SPQR[ACM933].

!!! ملاحظة qr(A::SparseMatrixCSC) يستخدم مكتبة SPQR التي هي جزء من SuiteSparse. حيث أن هذه المكتبة تدعم فقط المصفوفات المتفرقة التي تحتوي على عناصر من نوع Float64 أو ComplexF64، اعتبارًا من Julia v1.4، يقوم qr بتحويل A إلى نسخة من النوع SparseMatrixCSC{Float64} أو SparseMatrixCSC{ComplexF64} حسب الاقتضاء.

أمثلة

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 factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
 -1.41421    ⋅
   ⋅       -1.41421
Row permutation:
4-element Vector{Int64}:
 1
 3
 4
 2
Column permutation:
2-element Vector{Int64}:
 1
 2
source
qr(A, pivot = NoPivot(); blocksize) -> F

احسب تحليل QR للمصفوفة A: مصفوفة متعامدة (أو موحدة إذا كانت A ذات قيم مركبة) Q، ومصفوفة مثلثية علوية R بحيث

\[A = Q R\]

يخزن الكائن المعاد F التحليل في تنسيق مضغوط:

  • إذا كان pivot == ColumnNorm() فإن F هو كائن QRPivoted،
  • خلاف ذلك إذا كان نوع العنصر في A هو نوع BLAS (Float32، Float64، ComplexF32 أو ComplexF64)، فإن F هو كائن QRCompactWY،
  • خلاف ذلك F هو كائن QR.

يمكن استرداد المكونات الفردية للتحليل F عبر ملحقات الخصائص:

  • F.Q: المصفوفة المتعامدة/الموحدة Q
  • F.R: المصفوفة المثلثية العلوية R
  • F.p: متجه التبديل للتمرير (QRPivoted فقط)
  • F.P: مصفوفة التبديل للتمرير (QRPivoted فقط)

!!! ملاحظة كل إشارة إلى العامل المثلثي العلوي عبر F.R يخصص مصفوفة جديدة. لذلك من المستحسن تخزين تلك المصفوفة، على سبيل المثال، بواسطة R = F.R ومتابعة العمل مع R.

تنتج عملية التكرار على التحليل المكونات Q، R، وإذا كانت موجودة p.

تتوفر الوظائف التالية لكائنات QR: inv، size، و\. عندما تكون A مستطيلة، ستعيد \ حلاً لأقل المربعات وإذا لم يكن الحل فريداً، يتم إرجاع الحل بأقل معيار. عندما لا تكون A كاملة الرتبة، يتطلب التحليل مع (العمود) التبديل للحصول على حل بأقل معيار.

يسمح بالضرب بالنسبة لـ Q كاملة/مربعة أو غير كاملة/مربعة، أي أن كلا من F.Q*F.R و F.Q*A مدعومة. يمكن تحويل مصفوفة Q إلى مصفوفة عادية باستخدام Matrix. تعيد هذه العملية عامل Q "الرقيق"، أي، إذا كانت A هي m×n مع m>=n، فإن Matrix(F.Q) ينتج مصفوفة m×n بأعمدة متعامدة. لاسترداد عامل Q "الكامل"، وهو مصفوفة متعامدة m×m، استخدم F.Q*I أو collect(F.Q). إذا كانت m<=n، فإن Matrix(F.Q) ينتج مصفوفة متعامدة m×m.

يمكن تحديد حجم الكتلة لتحليل QR بواسطة وسيط الكلمة blocksize :: Integer عندما يكون pivot == NoPivot() و A isa StridedMatrix{<:BlasFloat}. يتم تجاهله عندما يكون blocksize > minimum(size(A)). انظر QRCompactWY.

!!! توافق "جوليا 1.4" يتطلب وسيط الكلمة blocksize جوليا 1.4 أو أحدث.

أمثلة

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 factor: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

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

!!! ملاحظة qr تعيد أنواع متعددة لأن LAPACK تستخدم عدة تمثيلات تقلل من متطلبات تخزين الذاكرة لمنتجات عواكس هوسهولدر الأساسية، بحيث يمكن تخزين مصفوفتا Q و R بشكل مضغوط بدلاً من مصفوفتين كثيفتين منفصلتين.

source

Noteworthy External Sparse Packages

توجد العديد من حزم جوليا الأخرى التي توفر تنفيذات لمصفوفات متفرقة والتي يجب ذكرها:

  1. SuiteSparseGraphBLAS.jl هو غلاف فوق مكتبة SuiteSparse:GraphBLAS C السريعة والمتعددة الخيوط. على وحدة المعالجة المركزية، يعد هذا عادةً الخيار الأسرع، وغالبًا ما يتفوق بشكل كبير على MKLSparse.
  2. CUDA.jl يكشف عن مكتبة CUSPARSE لعمليات مصفوفات متفرقة على وحدة المعالجة الرسومية.
  3. SparseMatricesCSR.jl يوفر تنفيذًا محليًا بلغة جوليا لصيغة الصفوف المتفرقة المضغوطة (CSR).
  4. MKLSparse.jl يسرع عمليات المصفوفات النادرة والكثيفة باستخدام مكتبة MKL من إنتل.
  5. SparseArrayKit.jl متاحة للمصفوفات المتناثرة متعددة الأبعاد.
  6. LuxurySparse.jl يوفر تنسيقات مصفوفات متفرقة ثابتة، بالإضافة إلى تنسيق الإحداثيات.
  7. ExtendableSparse.jl يتيح إدخالًا سريعًا في المصفوفات المتناثرة باستخدام نهج كسول للمؤشرات المخزنة الجديدة.
  8. Finch.jl يدعم تنسيقات وممارسات مصفوفات متفرقة متعددة الأبعاد من خلال لغة مصغرة للتنسور ومترجم، كل ذلك بلغة جوليا الأصلية. دعم لـ COO و CSF و CSR و CSC والمزيد، بالإضافة إلى عمليات مثل البث، والتقليل، وما إلى ذلك، وعمليات مخصصة.

الحزم الخارجية التي توفر حلول مباشرة نادرة:

  1. KLU.jl
  2. Pardiso.jl

الحزم الخارجية التي توفر حلولًا لحل أنظمة القيم الذاتية وتحليل القيمsingular:

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

حزم خارجية للعمل مع الرسوم البيانية:

  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
  • ACM832ديفيس، تيموثي أ. (2004b). الخوارزمية 832: UMFPACK V4.3 - طريقة متعددة الجوانب غير المتماثلة. ACM Trans. Math. Softw.، 30(2)، 196–199. doi:10.1145/992200.992206
  • ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116