#arrays #pointers #julia
#массивы #указатели #юлия
Вопрос:
У меня есть коллекция массивов следующим образом:
arr = Array{Array{Int64,1},1}( [ [1,2,3] , [4,5,6] , [7,8,9] ] )
Я хочу определить новый aray sum
таким образом, чтобы, sums[i] = sum(arr[i])
но динамическим образом, чтобы, если я изменяю элемент arr[i]
, sums[i]
он автоматически менялся. Например:
julia> sums
3-element Array{Int64,1}:
6
15
24
julia> arr[1][1] = 3
3
julia> sums
3-element Array{Int64,1}:
8
15
24
Возможно ли это сделать? Если да, то как я могу это сделать?
Ответ №1:
Вы можете использовать MappedArrays
. MappedArrays
предоставьте «представление» M
массива A
, чтобы M[i] = f(A[i])
. Все, что вам нужно сделать, добавить MappedArrays
пакет by ]add MappedArrays
и начать использовать его с sum
помощью функции. Обратите внимание, что преобразование является ленивым, что означает, что оно будет вычислять значения M
при попытке получить к ним доступ. Поэтому после обновления A
вы увидите изменения в M
при доступе к записям M
.
julia> using MappedArrays
julia> arr = [ [1,2,3] , [4,5,6] , [7,8,9] ]
3-element Array{Array{Int64,1},1}:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
julia> M = mappedarray(sum, arr)
3-element mappedarray(sum, ::Array{Array{Int64,1},1}) with eltype Int64:
6
15
24
julia> arr[1][2] = 10
10
julia> M
3-element mappedarray(sum, ::Array{Array{Int64,1},1}) with eltype Int64:
14
15
24
Комментарии:
1. Кажется, это работает, но пакет кажется немного старым и в настоящее время не укомплектован. Я подумал, что в новых (после 1.0) версиях Julia может быть более простое решение.
2. @AldoSayeg Это очень легкий пакет, около 200 строк, реализованный на чистом Julia, и он должен просто работать. Это не требует частых обновлений, возможно, всего лишь нескольких настроек. Последнему коммиту, который на самом деле ничего не меняет с точки зрения конечного пользователя, всего два месяца, что, по-видимому, довольно недавно для такого пакета. Вы можете написать свой собственный отображенный массив, используя интерфейс массива Julia. Однако я не думаю, что это будет так же просто, как использовать пакет, который уже это делает. Вот код: github.com/JuliaArrays/MappedArrays.jl/blob/master/src /…
3. Я думаю, что после его просмотра pacage достаточно хорош. Большое спасибо