Разреженные массивы
Julia поддерживает разреженные векторы и разреженные матрицы в модуле SparseArrays stdlib. Разреженные массивы — это массивы, содержащие достаточно нулей, что хранение их в специальной структуре данных приводит к экономии памяти и времени выполнения по сравнению с плоскими массивами.
Внешние пакеты, реализующие различные типы хранения разреженных данных, многомерные разреженные массивы и многое другое, можно найти в Примечательных внешних пакетах для разреженных массивов
Хранение разреженной матрицы в формате Compressed Sparse Column (CSC)
В Julia разреженные матрицы хранятся в формате Compressed Sparse Column (CSC). Разреженные матрицы Julia имеют тип 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
Хранение в формате Compressed Sparse Column (CSC) обеспечивает быстрый доступ к элементам столбца разреженной матрицы, в то время как доступ к разреженной матрице по строкам значительно медленнее. Такие операции, как вставка ранее не хранимых элементов по одному в структуру CSC, как правило, медленные. Это связано с тем, что все элементы разреженной матрицы, находящиеся за точкой вставки, должны быть сдвинуты на одну позицию.
Все операции с разреженными матрицами тщательно реализованы для использования структуры данных CSC для повышения производительности и избежания дорогостоящих операций.
Если у вас есть данные в формате CSC из другого приложения или библиотеки, и вы хотите импортировать их в Julia, убедитесь, что вы используете индексацию с началом с 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 ⋅
⋅ ⋅ ⋅
Хранение разреженных векторов
Разреженные векторы хранятся в аналоге сжатого столбца для разреженных матриц. В Julia разреженные векторы имеют тип 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 также может содержать явно хранимые нули. (См. Хранение разреженной матрицы.)
Конструкторы разреженных векторов и матриц
Самый простой способ создать разреженный массив — использовать функцию, эквивалентную функции zeros, которую предоставляет Julia для работы с плоскими массивами. Чтобы вместо этого создать разреженный массив, вы можете использовать то же имя с префиксом sp:
julia> spzeros(3)
3-element SparseVector{Float64, Int64} with 0 stored entries
Функция sparse часто является удобным способом создания разреженных массивов. Например, чтобы создать разреженную матрицу, мы можем ввести вектор I индексов строк, вектор J индексов столбцов и вектор V хранимых значений (это также известно как формат COO (координаты)). 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
Операции с разреженными матрицами
Арифметические операции с разреженными матрицами также работают так же, как и с плоскими матрицами. Индексирование, присваивание и конкатенация разреженных матриц работают так же, как и с плоскими матрицами. Операции индексирования, особенно присваивание, являются дорогостоящими, если выполняются по одному элементу за раз. Во многих случаях может быть лучше преобразовать разреженную матрицу в формат (I,J,V) с помощью findnz, обработать значения или структуру в плоских векторах (I,J,V), а затем восстановить разреженную матрицу.
Соответствие плоских и разреженных методов
Следующая таблица показывает соответствие встроенных методов для разреженных матриц и соответствующим методам для плоских матриц. В общем случае методы, генерирующие разреженные матрицы, отличаются от их плоских аналогов тем, что полученная матрица имеет тот же образец разреженности, что и заданная разреженная матрица S, или что полученная разреженная матрица имеет плотность d, т. е. каждый элемент матрицы имеет вероятность d быть ненулевым.
Подробности можно найти в разделе «Разреженные векторы и матрицы» справочника стандартной библиотеки.
| Разреженный | Плоский | Описание |
|---|---|---|
spzeros(m,n) |
zeros(m,n) |
Создает m-на-n матрицу нулей. (spzeros(m,n) пустая.) |
sparse(I,n,n) |
Matrix(I,n,n) |
Создает n-на-n единичную матрицу. |
sparse(A) |
Array(S) |
Преобразует между плоскими и разреженными форматами. |
sprand(m,n,d) |
rand(m,n) |
Создает m-на-n случайную матрицу (плотности d) с независимыми и одинаково распределёнными ненулевыми элементами, равномерно распределёнными на полуоткрытом интервале $[0, 1)$. |
sprandn(m,n,d) |
randn(m,n) |
Создает m-на-n случайную матрицу (плотности d) с независимыми и одинаково распределёнными ненулевыми элементами, распределёнными по стандартному нормальному (гауссовому) распределению. |
sprandn(rng,m,n,d) |
randn(rng,m,n) |
Создает m-на-n случайную матрицу (плотности d) с независимыми и одинаково распределёнными ненулевыми элементами, сгенерированными с помощью rng генератора случайных чисел |
API разреженных массивов
SparseArrays.AbstractSparseArrayТип
AbstractSparseArray{Tv,Ti,N}
Супертип для N-мерных разреженных массивов (или массивоподобных типов) с элементами типа Tv и типом индексов Ti. SparseMatrixCSC, SparseVector и SuiteSparse.CHOLMOD.Sparse являются подтипами этого.
SparseArrays.AbstractSparseVectorТип
AbstractSparseVector{Tv,Ti}
Супертип для одномерных разреженных массивов (или массивоподобных типов) с элементами типа Tv и типом индексов Ti. Псевдоним для AbstractSparseArray{Tv,Ti,1}.
SparseArrays.AbstractSparseMatrixТип
AbstractSparseMatrix{Tv,Ti}
Надтип для двумерных разреженных массивов (или массивоподобных типов) с элементами типа Tv и индексным типом Ti. Псевдоним для AbstractSparseArray{Tv,Ti,2}.
SparseArrays.SparseVectorТип
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])
что даёт тот же разреженный вектор.
исходный код
SparseArrays.SparseMatrixCSCТип
SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}
Тип матрицы для хранения разреженных матриц в формате Compressed Sparse Column. Стандартный способ построения SparseMatrixCSC — через функцию sparse. См. также spzeros, spdiagm и sprand.
SparseArrays.sparseФункция
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
исходный код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 являются булевыми, в этом случае 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!Функция
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, «Два быстрых алгоритма для разреженных матриц: умножение и пермутированное транспонирование», 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Функция
sparsevec(I, V, [m, combine])
Создать разреженный вектор S длины m, такой что S[I[k]] = V[k]. Дубликаты объединяются с помощью функции combine, которая по умолчанию + если аргумент combine не указан, за исключением случая, когда элементы V являются булевыми, в этом случае 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Метод
similar(A::AbstractSparseMatrixCSC{Tv,Ti}, [::Type{TvNew}, ::Type{TiNew}, m::Integer, n::Integer]) where {Tv,Ti}
Создать неинициализированный изменяемый массив с заданным типом элемента, индексным типом и размером, на основе заданного источника SparseMatrixCSC. Новая разреженная матрица сохраняет структуру исходной разреженной матрицы, за исключением случаев, когда размеры выходной матрицы отличаются от выходных.
Выходная матрица имеет нули в тех же местах, что и входная, но неинициализированные значения для ненулевых позиций.
исходный код
SparseArrays.issparseФункция
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
исходный код
SparseArrays.nnzФункция
nnz(A)
Возвращает количество хранимых (заполненных) элементов в разреженной матрице.
Примеры
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> nnz(A)
3
исходный код
SparseArrays.findnzФункция
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])
исходный код
SparseArrays.spzerosФункция
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
исходный код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 или выше.
SparseArrays.spzeros!Функция
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 или выше.
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Функция
spdiagm(kv::Pair{<:Integer,<:AbstractVector}...)
spdiagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
Построение разреженной диагональной матрицы из векторов и диагоналей. Каждый вектор kv.second будет помещён на kv.first диагональ. По умолчанию, матрица квадратная, её размер выводится из kv, но можно указать неквадратный размер m×n (дополнен нулями при необходимости), передав m,n в качестве первых аргументов.
Примеры
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Функция
sparse_hcat(A...)
Конкатенация по размерности 2. Возвращает объект SparseMatrixCSC.
Этот метод был добавлен в Julia 1.8. Он имитирует предыдущее поведение конкатенации, где конкатенация со специализированными типами «разреженных» матриц из LinearAlgebra.jl автоматически давала разреженный результат, даже в отсутствие аргументов SparseArray.
SparseArrays.sparse_vcatФункция
sparse_vcat(A...)
Конкатенация по размерности 1. Возвращает объект SparseMatrixCSC.
Этот метод был добавлен в Julia 1.8. Он имитирует предыдущее поведение конкатенации, где конкатенация со специализированными типами «разреженных» матриц из LinearAlgebra.jl автоматически давала разреженный результат, даже в отсутствие аргументов SparseArray.
SparseArrays.sparse_hvcatФункция
sparse_hvcat(rows::Tuple{Vararg{Int}}, values...)
Разреженная горизонтальная и вертикальная конкатенация в одном вызове. Эта функция вызывается для синтаксиса блочных матриц. Первый аргумент указывает количество аргументов для конкатенации в каждой блочной строке.
Этот метод был добавлен в Julia 1.8. Он имитирует предыдущее поведение конкатенации, где конкатенация со специализированными типами «разреженных» матриц из LinearAlgebra.jl автоматически давала разреженный результат, даже в отсутствие аргументов SparseArray.
SparseArrays.blockdiagФункция
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
исходный код
SparseArrays.sprandФункция
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
исходный код
SparseArrays.sprandnФункция
sprandn([rng][,Type],m[,n],p::AbstractFloat)
Создайте разреженный вектор случайной длины m или разреженную матрицу размера m на n со заданной (независимой) вероятностью p любого элемента быть ненулевым, где ненулевые значения выбираются из нормального распределения. Необязательный аргумент rng указывает генератор случайных чисел, см. Случайные числа.
Указание типа выходного элемента 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Функция
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
исходный код
SparseArrays.rowvalsФункция
rowvals(A::AbstractSparseMatrixCSC)
Возвращает вектор индексов строк для A. Любые изменения в возвращаемом векторе также изменят A. Доступ к внутреннему хранению индексов строк может быть полезен при итерировании по структурно ненулевым значениям. См. также nonzeros и nzrange.
Примеры
julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64, Int64} with 3 stored entries:
2 ⋅ ⋅
⋅ 2 ⋅
⋅ ⋅ 2
julia> rowvals(A)
3-element Vector{Int64}:
1
2
3
исходный код
SparseArrays.nzrangeФункция
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]
# perform sparse wizardry...
end
end
Добавление или удаление ненулевых элементов в матрицу может сделать nzrange недействительным, поэтому не следует изменять матрицу во время итерирования.
nzrange(x::SparseVectorUnion, col)
Указывает диапазон индексов структурно ненулевых значений разреженного вектора. Индекс столбца col игнорируется (предполагается, что он равен 1).
SparseArrays.droptol!Функция
droptol!(A::AbstractSparseMatrixCSC, tol)
Удаляет сохранённые значения из A, абсолютное значение которых меньше или равно tol.
droptol!(x::AbstractCompressedVector, tol)
Удаляет сохранённые значения из x, абсолютное значение которых меньше или равно tol.
SparseArrays.dropzeros!Функция
dropzeros!(x::AbstractCompressedVector)
Удаляет сохранённые числовые нули из x.
Для функции без изменения исходного объекта, см. dropzeros. Для алгоритмической информации см. fkeep!.
SparseArrays.dropzerosФункция
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} with 3 stored entries:
1.0 ⋅ ⋅
⋅ 0.0 ⋅
⋅ ⋅ 1.0
julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
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Функция
permute(A::AbstractSparseMatrixCSC{Tv,Ti}, p::AbstractVector{<:Integer},
q::AbstractVector{<:Integer}) where {Tv,Ti}
Билатерально переставляет A, возвращая A (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!Метод
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.
SparseArrays.halfperm!Функция
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)).
Этот метод является родителем нескольких методов, выполняющих операции транспонирования и пермутации для SparseMatrixCSC. Поскольку этот метод не выполняет проверку аргументов, предпочтительнее использовать безопасные дочерние методы ([c]transpose[!], permute[!]) вместо прямого использования.
Этот метод реализует алгоритм HALFPERM, описанный в F. Gustavson, "Two fast algorithms for sparse matrices: multiplication and permuted transposition," ACM TOMS 4(3), 250-269 (1978). Алгоритм работает за время O(size(A, 1), size(A, 2), nnz(A)) и не требует дополнительной памяти, помимо переданной.
SparseArrays.ftranspose!Функция
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!
Заслуживающие внимания внешние пакеты для разреженных матриц
Несколько других пакетов Julia предоставляют реализации разреженных матриц, которые следует упомянуть:
SuiteSparseGraphBLAS.jl — обёртка над быстрой, многопоточной библиотекой SuiteSparse:GraphBLAS C. На процессоре это, как правило, самый быстрый вариант, часто значительно превосходящий MKLSparse.
CUDA.jl предоставляет доступ к библиотеке CUSPARSE для операций с разреженными матрицами на GPU.
SparseMatricesCSR.jl предоставляет собственную реализацию формата Compressed Sparse Rows (CSR) в Julia.
MKLSparse.jl ускоряет операции с разреженными матрицами SparseArrays с использованием библиотеки Intel MKL.
SparseArrayKit.jl доступен для многомерных разреженных массивов.
LuxurySparse.jl предоставляет статические форматы разреженных массивов, а также формат координат.
ExtendableSparse.jl позволяет быстро вставлять элементы в разреженные матрицы, используя ленивый подход к новым индексам хранения.
© 2009–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.10/stdlib/SparseArrays/