Юлия: Вызов предыдущего значения в функции карты - PullRequest
1 голос
/ 30 мая 2019

Я акклиматизировался с функциями более высокого порядка, такими как карта, фильтр и уменьшение.Честно говоря, я чувствую, что я обманываю, потому что код очень чистый!В любом случае ...

Скажем, я предварительно формирую функцию карты в массиве, и вывод анонимной функции зависит от предыдущего значения.Как бы я назвал предыдущее значение?

Например:

Инструкция для проверки, имеет ли каждое значение коэффициент 3

julia> A
4-element Array{Int64,1}:
  3
  6
  9
 36

julia> reduce(&, map(x-> x%3 == 0, A))
true

Как бы я назвал предыдущеезначение, чтобы проверить, является ли оно фактором текущего значения?

julia> reduce(&, map( x -> x==A[1] ? true : x % 3 == 0, A))
true

#I want to change the 3 to the previous value like..
psuedo code> reduce(&, map( x -> x==A[1] ? true : x % x[i-1] == 0, A))

Есть идеи?Или я раздвигаю ограничения на это?

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Функция map может принимать многомерную функцию и применять ее к нескольким массивам.Таким образом, вы можете применить свою функцию к правильно смещенным версиям вашего массива:

julia> A = [3, 6, 9, 36];

julia> map((x, y) -> x % y == 0, A[2:end], A[1:end-1])
3-element Array{Bool,1}:
  true
 false
  true

Пакет ShiftedArrays.jl предоставляет функции lead и lag, чтобы сделать смещение массивов более удобным:

julia> using ShiftedArrays

julia> lag(A)
4-element ShiftedArray{Int64,Missing,1,Array{Int64,1}}:
  missing
 3       
 6       
 9

julia> map((x, x_lag) -> x % x_lag == 0, A, lag(A))
4-element Array{Union{Missing, Bool},1}:
      missing
  true       
 false       
  true

Обратите внимание, что lag вводит значение missing в начале смещенного массива.Если вы хотите убедиться, что ваша функция возвращает true для первого элемента массива, вы можете изменить его следующим образом:

julia> map((x, y) -> ismissing(y) ? true : x % y == 0, A, lag(A))
4-element Array{Bool,1}:
  true
  true
 false
  true
1 голос
/ 30 мая 2019

Так же, как в цикле for, вы можете принимать элементы как x в A или получать элементы через индекс, как i в 1: length (A):

reduce(&, map(i -> A[i]==A[1] ? true : A[i] % A[i-1] == 0, 1:length(A)))

или, потому что это может быть ярлыкоценка при ложном:

all(i -> A[i]==A[1] ? true : A[i] % A[i-1] == 0, 1:length(A))
...