Разреженные массивы
В 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.
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/