Spec-Zone.ru › Julia 1.4

Разреженные массивы

В Julia есть поддержка разреженных векторов и разреженных матриц в модуле SparseArrays stdlib. Разреженные массивы — это массивы, содержащие достаточно нулей, что хранение их в специальной структуре данных приводит к экономии памяти и времени выполнения по сравнению с плотным массивом.

Хранение разреженной матрицы в формате Compressed Sparse Column (CSC)

В Julia разреженные матрицы хранятся в формате Compressed Sparse Column (CSC). Разреженные матрицы Julia имеют тип SparseMatrixCSC{Tv,Ti}, где Tv — тип хранимых значений, а Ti — целочисленный тип для хранения указателей на столбцы и индексов строк. Внутреннее представление SparseMatrixCSC таково:

struct SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrix{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:
  [1, 1]  =  0
  [2, 2]  =  2
  [1, 3]  =  1
  [3, 3]  =  0

julia> dropzeros(A)
3×3 SparseMatrixCSC{Int64,Int64} with 2 stored entries:
  [2, 2]  =  2
  [1, 3]  =  1

Хранение разреженных векторов

Разреженные векторы хранятся в аналоге сжатого разреженного столбцового формата для разреженных матриц. В 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:
  [1,  4]  =  1
  [4,  7]  =  2
  [5,  9]  =  3
  [3, 18]  =  -5

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 Array{CartesianIndex{2},1}:
 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 Array{Int64,1}:
 1
 3
 4
 5

Ещё один способ создания разреженного массива — преобразовать плотный массив в разреженный массив, используя функцию sparse:

julia> sparse(Matrix(1.0I, 5, 5))
5×5 SparseMatrixCSC{Float64,Int64} with 5 stored entries:
  [1, 1]  =  1.0
  [2, 2]  =  1.0
  [3, 3]  =  1.0
  [4, 4]  =  1.0
  [5, 5]  =  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.
Array(S) sparse(A) Преобразует между плотным и разреженным форматами.
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 генератора случайных чисел

Разреженные массивы

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}

Тип вектора для хранения разреженных векторов.

исходный код

SparseArrays.SparseMatrixCSCТип

SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrixCSC{Tv,Ti}

Тип матрицы для хранения разреженных матриц в формате Compressed Sparse Column. Стандартный способ построения SparseMatrixCSC — через функцию sparse. Также см. spzeros, spdiagm и sprand.

исходный код
END_OF_DOCUMENT_MARKER

SparseArrays.sparseФункция

sparse(A)

Преобразовать Абстрактную матрицу A в разреженную матрицу.

Примеры

julia> A = Matrix(1.0I, 3, 3)
3×3 Array{Float64,2}:
 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, 1]  =  1.0
  [2, 2]  =  1.0
  [3, 3]  =  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, 1]  =  1
  [2, 2]  =  2
  [3, 3]  =  3
исходный код

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
исходный код

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:
  [1, 1]  =  2
  [2, 2]  =  2
  [3, 3]  =  2

julia> nnz(A)
3
исходный код

SparseArrays.findnzФункция

findnz(A)

Возвращает кортеж (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, 1]  =  1
  [1, 2]  =  2
  [3, 2]  =  4
  [2, 3]  =  3

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
исходный код

SparseArrays.spdiagmФункция

spdiagm(kv::Pair{<:Integer,<:AbstractVector}...)
spdiagm(m::Integer, n::Ingeger, kv::Pair{<:Integer,<:AbstractVector}...)

Построить разреженную диагональную матрицу из Pair векторов и диагоналей. Каждый вектор kv.second будет размещён на kv.first диагонали. По умолчанию (если size=nothing), матрица является квадратной, и её размер определяется из 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:
  [2, 1]  =  1
  [1, 2]  =  4
  [3, 2]  =  2
  [2, 3]  =  3
  [4, 3]  =  3
  [3, 4]  =  2
  [5, 4]  =  4
  [4, 5]  =  1
исходный код

SparseArrays.blockdiagФункция

blockdiag(A...)

Соединить матрицы по блочной диагонали. В настоящее время реализовано только для разреженных матриц.

Примеры

julia> blockdiag(sparse(2I, 3, 3), sparse(4I, 2, 2))
5×5 SparseMatrixCSC{Int64,Int64} with 5 stored entries:
  [1, 1]  =  2
  [2, 2]  =  2
  [3, 3]  =  2
  [4, 4]  =  4
  [5, 5]  =  4
исходный код

SparseArrays.sprandФункция

sprand([rng],[type],m,[n],p::AbstractFloat,[rfn])

Создайте вектор разреженных значений случайной длины m или m разреженную матрицу размером n, в которой вероятность любого элемента, отличного от нуля, независимо задаётся p (и, следовательно, средняя плотность ненулевых элементов также точно равна p). Значения, отличные от нуля, выбираются из распределения, заданного rfn и имеют тип type. В случае, если rfn не указано, используется равномерное распределение. Необязательный аргумент rng задаёт генератор случайных чисел, см. Случайные числа.

Примеры

julia> sprand(Bool, 2, 2, 0.5)
2×2 SparseMatrixCSC{Bool,Int64} with 1 stored entry:
  [2, 2]  =  1

julia> sprand(Float64, 3, 0.75)
3-element SparseVector{Float64,Int64} with 1 stored entry:
  [3]  =  0.298614
исходный код

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 2 stored entries:
  [1, 2]  =  0.586617
  [2, 2]  =  0.297336
исходный код

SparseArrays.nonzerosФункция

nonzeros(A)

Возвращает вектор структурных ненулевых значений в разреженной матрице A. Это включает в себя нули, которые явно хранятся в разреженной матрице. Возвращаемый вектор ссылается непосредственно на внутреннее хранилище ненулевых элементов A, и любые изменения в возвращаемом векторе изменят также A. См. rowvals и nzrange.

Примеры

julia> A = sparse(2I, 3, 3)
3×3 SparseMatrixCSC{Int64,Int64} with 3 stored entries:
  [1, 1]  =  2
  [2, 2]  =  2
  [3, 3]  =  2

julia> nonzeros(A)
3-element Array{Int64,1}:
 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:
  [1, 1]  =  2
  [2, 2]  =  2
  [3, 3]  =  2

julia> rowvals(A)
3-element Array{Int64,1}:
 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
исходный код

SparseArrays.droptol!Функция

droptol!(A::AbstractSparseMatrixCSC, tol; trim::Bool = true)

Удаляет сохранённые значения из A, абсолютное значение которых меньше или равно tol, необязательно обрезая избыточное пространство из rowvals(A) и nonzeros(A), когда trim равно true.

исходный код
droptol!(x::SparseVector, tol; trim::Bool = true)

Удаляет сохранённые значения из x , абсолютное значение которых меньше или равно tol, необязательно обрезая избыточное пространство из nonzeroinds(x) и nonzeros(x) когда trim равно true.

исходный код

SparseArrays.dropzeros!Функция

dropzeros!(A::AbstractSparseMatrixCSC; trim::Bool = true)

Удаляет сохраненные числовые нули из A, необязательно обрезая избыточное пространство из rowvals(A) и nonzeros(A) при trim равном true.

Для внеместовой версии см. dropzeros. Для алгоритмической информации см. fkeep!.

исходный код
dropzeros!(x::SparseVector; trim::Bool = true)

Удаляет сохраненные числовые нули из x, необязательно обрезая избыточное пространство из nonzeroinds(x) и nonzeros(x) при trim равном true.

Для внеместовой версии см. dropzeros. Для алгоритмической информации см. fkeep!.

исходный код

SparseArrays.dropzerosФункция

dropzeros(A::AbstractSparseMatrixCSC; trim::Bool = true)

Создает копию A и удаляет сохраненные числовые нули из этой копии, необязательно обрезая избыточное пространство из массивов rowval и nzval результата при trim равном true.

Для внеместовой версии и алгоритмической информации см. 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, 1]  =  1.0
  [2, 2]  =  0.0
  [3, 3]  =  1.0

julia> dropzeros(A)
3×3 SparseMatrixCSC{Float64,Int64} with 2 stored entries:
  [1, 1]  =  1.0
  [3, 3]  =  1.0
исходный код
dropzeros(x::SparseVector; trim::Bool = true)

Создает копию x и удаляет числовые нули из этой копии, необязательно обрезая избыточное пространство из массивов nzind и nzval результата при trim равном true.

Для внеместовой версии и алгоритмической информации см. 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, возвращая 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, 1]  =  1
  [1, 2]  =  5
  [2, 2]  =  2
  [2, 3]  =  6
  [3, 3]  =  3
  [3, 4]  =  7
  [4, 4]  =  4

julia> permute(A, [4, 3, 2, 1], [1, 2, 3, 4])
4×4 SparseMatrixCSC{Int64,Int64} with 7 stored entries:
  [4, 1]  =  1
  [3, 2]  =  2
  [4, 2]  =  5
  [2, 3]  =  3
  [3, 3]  =  6
  [1, 4]  =  4
  [2, 4]  =  7

julia> permute(A, [1, 2, 3, 4], [4, 3, 2, 1])
4×4 SparseMatrixCSC{Int64,Int64} with 7 stored entries:
  [3, 1]  =  7
  [4, 1]  =  4
  [2, 2]  =  6
  [3, 2]  =  3
  [1, 3]  =  5
  [2, 3]  =  2
  [1, 4]  =  1
исходный код

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.

исходный код

© 2009–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.4.2/stdlib/SparseArrays/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API