Julia 朱莉娅:调用Map函数中的前一个值

Julia 朱莉娅:调用Map函数中的前一个值,julia,higher-order-functions,Julia,Higher Order Functions,我已经习惯了高阶函数,比如map、filter和reduce。老实说,我觉得我在作弊,因为代码太干净了!无论如何 假设我在数组上执行map函数,匿名函数的输出取决于前面的值。如何调用上一个值 例如: 用于检查每个值是否具有因子3的语句 julia> A 4-element Array{Int64,1}: 3 6 9 36 julia> reduce(&, map(x-> x%3 == 0, A)) true 如何调用前一个值来检查它是否是当前值的一个因

我已经习惯了高阶函数,比如map、filter和reduce。老实说,我觉得我在作弊,因为代码太干净了!无论如何

假设我在数组上执行map函数,匿名函数的输出取决于前面的值。如何调用上一个值

例如:

用于检查每个值是否具有因子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))

有什么想法吗?或者,我是在限制吗?

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

或者,因为它可能会在错误时简化计算:

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

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
该软件包提供了
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
在移位数组的开头引入了一个
缺失的
值。如果要确保函数为数组的第一个元素返回
true
,可以这样修改它:

julia> map((x, y) -> ismissing(y) ? true : x % y == 0, A, lag(A))
4-element Array{Bool,1}:
  true
  true
 false
  true

有趣。我不认为我可以用一个靶场。谢谢你的洞察力
reduce(&,map(x->x%3==0,A))
非常慢而且冗长。您更应该使用
mapreduce(x->x%3==0,&,A)
,或者更好的是使用
all(x->x%3==0,A)
。mapreduce函数是否与多变量函数一起工作?似乎无法让它与以下参数一起工作:
juliamapreduce((x,y)->x-y>0?true:false,+,A[2:end],A[1:end-1])
它不需要那么多参数,所以将它们压缩成一个:
mapreduce(x->x[1]-x[2]>0,+,zip(A[2:end],A[1:end-1])
。顺便说一句,你的匿名功能是不必要的复杂。或者,只需编写
count(x->x[1]-x[2]>0,zip(A[2:end],A[1:end-1])
。顺便说一句,在1.2版
mapreduce
中,将接受多个输入参数,就像
map
一样。谢谢你的信息。
julia> map((x, y) -> ismissing(y) ? true : x % y == 0, A, lag(A))
4-element Array{Bool,1}:
  true
  true
 false
  true