Изменение суммы массива int с изменениями в элементах массива

#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 достаточно хорош. Большое спасибо