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 من مرجع مكتبة المعايير.
Sparse | Dense | Description |
---|---|---|
spzeros(m,n) | zeros(m,n) | Creates a m-by-n matrix of zeros. (spzeros(m,n) is empty.) |
sparse(I,n,n) | Matrix(I,n,n) | Creates a n-by-n identity matrix. |
sparse(A) | Array(S) | Interconverts between dense and sparse formats. |
sprand(m,n,d) | rand(m,n) | Creates a m-by-n random matrix (of density d) with iid non-zero elements distributed uniformly on the half-open interval $[0, 1)$. |
sprandn(m,n,d) | randn(m,n) | Creates a m-by-n random matrix (of density d) with iid non-zero elements distributed according to the standard normal (Gaussian) distribution. |
sprandn(rng,m,n,d) | randn(rng,m,n) | Creates a m-by-n random matrix (of density d) with iid non-zero elements generated with the rng random number generator |
Sparse Linear Algebra
تستدعي حلول المصفوفات المتناثرة دوال من SuiteSparse. التحققات التالية متاحة:
Type | Description |
---|---|
CHOLMOD.Factor | Cholesky and LDLt factorizations |
UMFPACK.UmfpackLU | LU factorization |
SPQR.QRSparse | QR factorization |
تتم مناقشة هذه التحليلات بمزيد من التفصيل في Sparse Linear Algebra API section:
SparseArrays API
SparseArrays.AbstractSparseArray
— TypeAbstractSparseArray{Tv,Ti,N}
نوع أعلى لمصفوفات متفرقة ذات N
أبعاد (أو أنواع مشابهة للمصفوفات) مع عناصر من نوع Tv
ونوع فهرس Ti
. SparseMatrixCSC
، SparseVector
و SuiteSparse.CHOLMOD.Sparse
هي أنواع فرعية من هذا.
SparseArrays.AbstractSparseVector
— TypeAbstractSparseVector{Tv,Ti}
نوع أعلى للمصفوفات النادرة أحادية البعد (أو الأنواع الشبيهة بالمصفوفات) مع عناصر من النوع Tv
ونوع الفهرس Ti
. اسم مستعار لـ AbstractSparseArray{Tv,Ti,1}
.
SparseArrays.AbstractSparseMatrix
— TypeAbstractSparseMatrix{Tv,Ti}
نوع أعلى لمصفوفات متفرقة ثنائية الأبعاد (أو أنواع مشابهة للمصفوفات) مع عناصر من نوع Tv
ونوع فهرس Ti
. اسم مستعار لـ AbstractSparseArray{Tv,Ti,2}
.
SparseArrays.SparseVector
— TypeSparseVector{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])
يؤدي إلى نفس المتجه المتناثر.
SparseArrays.SparseMatrixCSC
— TypeSparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}
نوع المصفوفة لتخزين المصفوفات المتناثرة بتنسيق Compressed Sparse Column. الطريقة القياسية لبناء SparseMatrixCSC هي من خلال دالة sparse
. انظر أيضًا spzeros
و spdiagm
و sprand
.
SparseArrays.sparse
— Functionsparse(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
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
SparseArrays.sparse!
— Functionsparse!(I::AbstractVector{Ti}, J::AbstractVector{Ti}, V::AbstractVector{Tv},
m::Integer, n::Integer, combine, klasttouch::Vector{Ti},
csrrowptr::Vector{Ti}, csrcolval::Vector{Ti}, csrnzval::Vector{Tv},
[csccolptr::Vector{Ti}], [cscrowval::Vector{Ti}, cscnzval::Vector{Tv}] ) where {Tv,Ti<:Integer}
والد وموصل خبير لـ sparse
؛ انظر إلى 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).
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 أو أحدث.
SparseArrays.sparsevec
— Functionsparsevec(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
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
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
Base.similar
— Methodsimilar(A::AbstractSparseMatrixCSC{Tv,Ti}, [::Type{TvNew}, ::Type{TiNew}, m::Integer, n::Integer]) where {Tv,Ti}
قم بإنشاء مصفوفة قابلة للتعديل غير مُهيأة مع نوع العنصر المحدد، ونوع الفهرس، والحجم، بناءً على مصدر SparseMatrixCSC
المعطى. تحافظ المصفوفة المتناثرة الجديدة على هيكل المصفوفة المتناثرة الأصلية، باستثناء الحالة التي تكون فيها أبعاد مصفوفة الإخراج مختلفة عن الإخراج.
تحتوي مصفوفة الإخراج على أصفار في نفس المواقع مثل الإدخال، ولكن بقيم غير مُهيأة للمواقع غير الصفرية.
SparseArrays.issparse
— Functionissparse(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
SparseArrays.nnz
— Functionnnz(A)
يُرجع عدد العناصر المخزنة (المملوءة) في مصفوفة متفرقة.
أمثلة
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} مع 3 إدخالات مخزنة:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> nnz(A)
3
SparseArrays.findnz
— Functionfindnz(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])
SparseArrays.spzeros
— Functionspzeros([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
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!
.
تتطلب هذه الطريقة إصدار جوليا 1.10 أو أحدث.
SparseArrays.spzeros!
— Functionspzeros!(::Type{Tv}, I::AbstractVector{Ti}, J::AbstractVector{Ti}, m::Integer, n::Integer,
klasttouch::Vector{Ti}, csrrowptr::Vector{Ti}, csrcolval::Vector{Ti},
[csccolptr::Vector{Ti}], [cscrowval::Vector{Ti}, cscnzval::Vector{Tv}]) where {Tv,Ti<:Integer}
الأب والسائق الخبير لـ spzeros(I, J)
مما يسمح للمستخدم بتوفير تخزين مسبق التخصيص للكائنات الوسيطة. هذه الطريقة هي لـ spzeros
مثلما أن SparseArrays.sparse!
هي لـ sparse
. راجع الوثائق الخاصة بـ SparseArrays.sparse!
للحصول على التفاصيل وأطوال المخازن المطلوبة.
تتطلب هذه الطريقة إصدار Julia 1.10 أو أحدث.
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 أو أحدث.
SparseArrays.spdiagm
— Functionspdiagm(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 ⋅
spdiagm(v::AbstractVector)
spdiagm(m::Integer, n::Integer, v::AbstractVector)
قم بإنشاء مصفوفة متفرقة مع عناصر المتجه كعناصر قطرية. بشكل افتراضي (بدون إعطاء m
و n
)، تكون المصفوفة مربعة وحجمها محدد بواسطة length(v)
، ولكن يمكن تحديد حجم غير مربع m
×n
عن طريق تمرير m
و n
كأول وسيطين.
تتطلب هذه الدوال على الأقل 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
SparseArrays.sparse_hcat
— Functionsparse_hcat(A...)
قم بالدمج على طول البعد 2. أعد كائن SparseMatrixCSC.
تم إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك الدمج السابق، حيث كان الدمج مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl ينتج تلقائيًا مخرجات نادرة حتى في غياب أي وسيط SparseArray.
SparseArrays.sparse_vcat
— Functionsparse_vcat(A...)
قم بالدمج على طول البعد 1. أعد كائن SparseMatrixCSC.
تم إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك الدمج السابق، حيث كان الدمج مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl يؤدي تلقائيًا إلى مخرجات نادرة حتى في غياب أي وسيط SparseArray.
SparseArrays.sparse_hvcat
— Functionsparse_hvcat(rows::Tuple{Vararg{Int}}, values...)
التجميع الأفقي والعمودي النادر في استدعاء واحد. يتم استدعاء هذه الدالة لكتلة بناء الجملة للمصفوفة. يحدد الوسيط الأول عدد الوسائط التي سيتم تجميعها في كل صف كتلة.
تمت إضافة هذه الطريقة في جوليا 1.8. إنها تحاكي سلوك التجميع السابق، حيث كان التجميع مع أنواع المصفوفات "النادرة" المتخصصة من LinearAlgebra.jl ينتج تلقائيًا مخرجات نادرة حتى في غياب أي وسيط SparseArray.
SparseArrays.blockdiag
— Functionblockdiag(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
SparseArrays.sprand
— Functionsprand([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
SparseArrays.sprandn
— Functionsprandn([rng][,Type],m[,n],p::AbstractFloat)
قم بإنشاء متجه متفرق عشوائي بطول m
أو مصفوفة متفرقة بحجم m
في n
مع الاحتمال المحدد (المستقل) p
لأي إدخال يكون غير صفري، حيث يتم أخذ القيم غير الصفرية من التوزيع الطبيعي. تحدد الوسيطة الاختيارية rng
مولد الأرقام العشوائية، انظر Random Numbers.
يتطلب تحديد نوع عنصر الإخراج 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
SparseArrays.nonzeros
— Functionnonzeros(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
SparseArrays.rowvals
— Functionrowvals(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
SparseArrays.nzrange
— Functionnzrange(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
، يجب عدم تعديل المصفوفة أثناء التكرار.
nzrange(x::SparseVectorUnion, col)
يعطي نطاق الفهارس للقيم غير الصفرية الهيكلية لمتجه متفرق. يتم تجاهل فهرس العمود col
(يُفترض أن يكون 1
).
SparseArrays.droptol!
— Functiondroptol!(A::AbstractSparseMatrixCSC, tol)
يُزيل القيم المخزنة من A
التي تكون قيمتها المطلقة أقل من أو تساوي tol
.
droptol!(x::AbstractCompressedVector, tol)
يُزيل القيم المخزنة من x
التي تكون قيمتها المطلقة أقل من أو تساوي tol
.
SparseArrays.dropzeros!
— Functiondropzeros!(x::AbstractCompressedVector)
يُزيل الأصفار العددية المخزنة من x
.
لنسخة خارج المكان، انظر dropzeros
. لمعلومات خوارزمية، انظر fkeep!
.
SparseArrays.dropzeros
— Functiondropzeros(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
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
SparseArrays.permute
— Functionpermute(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 ⋅ ⋅ ⋅
Base.permute!
— Methodpermute!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti},
p::AbstractVector{<:Integer}, q::AbstractVector{<:Integer},
[C::AbstractSparseMatrixCSC{Tv,Ti}]) where {Tv,Ti}
قم بإعادة ترتيب A
بشكل ثنائي، مع تخزين النتيجة 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
.
SparseArrays.halfperm!
— Functionhalfperm!(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)
).
تعتبر هذه الطريقة الأصل للعديد من الطرق التي تقوم بعمليات النسخ وإعادة الترتيب على SparseMatrixCSC
s. نظرًا لأن هذه الطريقة لا تقوم بأي فحص للمعاملات، يُفضل استخدام الطرق الفرعية الأكثر أمانًا ([c]transpose[!]
, permute[!]
) بدلاً من الاستخدام المباشر.
تقوم هذه الطريقة بتنفيذ خوارزمية HALFPERM
الموضحة في F. Gustavson، "خوارزميات سريعة لمصفوفات متفرقة: الضرب والنسخ المعاد ترتيبها"، ACM TOMS 4(3)، 250-269 (1978). تعمل الخوارزمية في زمن O(size(A, 1), size(A, 2), nnz(A))
ولا تتطلب أي مساحة إضافية بخلاف ما تم تمريره.
SparseArrays.ftranspose!
— Functionftranspose!(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!
Sparse Linear Algebra API
LinearAlgebra.cholesky
— Functioncholesky(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
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
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`.
LinearAlgebra.cholesky!
— Functioncholesky!(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:
[...]
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
نفس الشيء كما هو موضح في cholesky
، ولكن يوفر المساحة عن طريق الكتابة فوق المدخل A
، بدلاً من إنشاء نسخة. يتم رمي استثناء InexactError
إذا كانت التحليل ينتج عنه رقم لا يمكن تمثيله بواسطة نوع عنصر A
، على سبيل المثال، لأنواع الأعداد الصحيحة.
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، التي تدعم فقط الأنواع الحقيقية أو المعقدة بدقة مفردة أو مزدوجة. سيتم تحويل المصفوفات المدخلة التي ليست من تلك الأنواع العنصرية إلى هذه الأنواع حسب الاقتضاء.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(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)
عمليات.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
احصل على تحليل LDLt
لـ A + C*C'
معطى تحليل LDLt
أو LLt
لـ F
من A
.
العامل المعاد هو دائمًا تحليل LDLt
.
انظر أيضًا lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(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
أثناء الحساب.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
تحديث LDLt
أو LLt
تحليل F
لـ A
إلى تحليل لـ A + C*C'
.
يتم تحويل تحليلات LLt
إلى LDLt
.
انظر أيضًا lowrankupdate
، lowrankdowndate
، lowrankdowndate!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(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)
عمليات.
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
احصل على تحليل LDLt
لـ A + C*C'
معطى تحليل LDLt
أو LLt
لـ F
من A
.
العامل المعاد هو دائمًا تحليل LDLt
.
انظر أيضًا lowrankdowndate!
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(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
أثناء الحساب.
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
قم بتحديث عامل LDLt
أو LLt
F
لـ A
إلى عامل لـ A - C*C'
.
يتم تحويل عوامل LLt
إلى LDLt
.
انظر أيضًا lowrankdowndate
، lowrankupdate
، lowrankupdate!
.
SparseArrays.CHOLMOD.lowrankupdowndate!
— Functionlowrankupdowndate!(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'
LinearAlgebra.ldlt
— Functionldlt(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
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`.
LinearAlgebra.lu
— Functionlu(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 |
Rs | Vector من عوامل التوسيع |
: | مكونات (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}
حسب الاقتضاء.
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.L | L (جزء مثلث سفلي) من LU |
F.U | U (جزء مثلث علوي) من LU |
F.p | (يمين) تبديل Vector |
F.P | (يمين) تبديل Matrix |
يؤدي تكرار التحليل إلى إنتاج المكونات F.L
و F.U
و F.p
.
العلاقة بين F
و A
هي
F.L*F.U == A[F.p, :]
يدعم F
أيضًا الوظائف التالية:
الوظيفة المدعومة | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
تم إضافة وسيط الكلمة الرئيسية 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
LinearAlgebra.qr
— Functionqr(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
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
بشكل مضغوط بدلاً من مصفوفتين كثيفتين منفصلتين.
Noteworthy External Sparse Packages
توجد العديد من حزم جوليا الأخرى التي توفر تنفيذات لمصفوفات متفرقة والتي يجب ذكرها:
- SuiteSparseGraphBLAS.jl هو غلاف فوق مكتبة SuiteSparse:GraphBLAS C السريعة والمتعددة الخيوط. على وحدة المعالجة المركزية، يعد هذا عادةً الخيار الأسرع، وغالبًا ما يتفوق بشكل كبير على MKLSparse.
- CUDA.jl يكشف عن مكتبة CUSPARSE لعمليات مصفوفات متفرقة على وحدة المعالجة الرسومية.
- SparseMatricesCSR.jl يوفر تنفيذًا محليًا بلغة جوليا لصيغة الصفوف المتفرقة المضغوطة (CSR).
- MKLSparse.jl يسرع عمليات المصفوفات النادرة والكثيفة باستخدام مكتبة MKL من إنتل.
- SparseArrayKit.jl متاحة للمصفوفات المتناثرة متعددة الأبعاد.
- LuxurySparse.jl يوفر تنسيقات مصفوفات متفرقة ثابتة، بالإضافة إلى تنسيق الإحداثيات.
- ExtendableSparse.jl يتيح إدخالًا سريعًا في المصفوفات المتناثرة باستخدام نهج كسول للمؤشرات المخزنة الجديدة.
- Finch.jl يدعم تنسيقات وممارسات مصفوفات متفرقة متعددة الأبعاد من خلال لغة مصغرة للتنسور ومترجم، كل ذلك بلغة جوليا الأصلية. دعم لـ COO و CSF و CSR و CSC والمزيد، بالإضافة إلى عمليات مثل البث، والتقليل، وما إلى ذلك، وعمليات مخصصة.
الحزم الخارجية التي توفر حلول مباشرة نادرة:
الحزم الخارجية التي توفر حلولًا لحل أنظمة القيم الذاتية وتحليل القيمsingular:
حزم خارجية للعمل مع الرسوم البيانية:
- 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