朱莉娅:在地图函数中调用上一个值

时间:2019-05-30 02:44:01

标签: julia higher-order-functions

我一直在适应高阶函数,例如map,filter和reduce。老实说,我觉得我在作弊,因为代码很干净!反正...

说我正在数组上执行一个映射函数,匿名函数的输出取决于前面的值。我怎么称呼以前的值?

例如:

用于检查每个值是否具有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 个答案:

答案 0 :(得分:1)

就像在for循环中一样,您可以将元素作为A中的x或通过索引获取元素,如1:length(A)中的i:

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

或者,因为在为false时可能会快捷评估:

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

答案 1 :(得分:1)

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软件包提供了leadlag函数,使移位数组更加方便:

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