如何使用任意类型的备忘录编写 reduce 函数
How to write reduce function with memo of arbitrary type
我正在尝试编写一个简单的直方图程序,该程序采用未知(非常大)长度的流,仅整数,并将它们分类。我的问题与分箱无关,因此我们可以假设整数可以在范围内 (0, 1000] 并且直方图分箱的大小为 1(每个可能的数字都有自己的分箱)。
通常我会用 reduce
及其变体在任何编程语言中执行此操作,并且我在 Julia 中编写了类似的东西(使用数组代替我用作输入的实际基于文件的迭代器):
function ct_a(arr, i)
arr[i] += 1
end
reduce(ct_a, [100, 140, 471, 900, 999], init=zeros(1000))
现在我尝试了各种变体,例如更改参数的顺序等,但遇到了各种看似类型或签名相关的问题:
ERROR: MethodError: no method matching reduce(::typeof(ct_b), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching reduce(::typeof(ct_a), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching setindex!(::Int64, ::Int64, ::Int64)
这似乎应该可行,因为据我所知,没有正式的理由说明为什么 reduce
操作的输出需要类似于被迭代的单个元素的类型。我可以在网上找到的每个例子但是关于在 julia 中使用 reduce
假设备忘录(输出)是 like 类型(即,传入的 op
运算符是 F: T,T -> T
类型.) 这似乎是一个任意限制,不太可能是这种情况,但我不知道如何以不同的方式做到这一点。
我已经能够通过使用像 F: T,T->null
这样的函数并全局存储备忘录来以某种方式绕过这个问题:
memo=zeros(1000)
function ct_x(_, i)
memo[i] += 1
end
reduce(ct_x, [1,2,3,100,200,900], init="whatever")
是否有预期的方式来表达这种性质的减少功能?
您需要将缩减函数 return 修改后的数组,而不是修改后的元素值。试试这个:
function ct_a(arr, i)
arr[i] += 1
arr
end
julia> reduce(ct_a, [2, 3, 4], init=zeros(Int, 5))
5-element Array{Int64,1}:
0
1
1
1
0
我正在尝试编写一个简单的直方图程序,该程序采用未知(非常大)长度的流,仅整数,并将它们分类。我的问题与分箱无关,因此我们可以假设整数可以在范围内 (0, 1000] 并且直方图分箱的大小为 1(每个可能的数字都有自己的分箱)。
通常我会用 reduce
及其变体在任何编程语言中执行此操作,并且我在 Julia 中编写了类似的东西(使用数组代替我用作输入的实际基于文件的迭代器):
function ct_a(arr, i)
arr[i] += 1
end
reduce(ct_a, [100, 140, 471, 900, 999], init=zeros(1000))
现在我尝试了各种变体,例如更改参数的顺序等,但遇到了各种看似类型或签名相关的问题:
ERROR: MethodError: no method matching reduce(::typeof(ct_b), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching reduce(::typeof(ct_a), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching setindex!(::Int64, ::Int64, ::Int64)
这似乎应该可行,因为据我所知,没有正式的理由说明为什么 reduce
操作的输出需要类似于被迭代的单个元素的类型。我可以在网上找到的每个例子但是关于在 julia 中使用 reduce
假设备忘录(输出)是 like 类型(即,传入的 op
运算符是 F: T,T -> T
类型.) 这似乎是一个任意限制,不太可能是这种情况,但我不知道如何以不同的方式做到这一点。
我已经能够通过使用像 F: T,T->null
这样的函数并全局存储备忘录来以某种方式绕过这个问题:
memo=zeros(1000)
function ct_x(_, i)
memo[i] += 1
end
reduce(ct_x, [1,2,3,100,200,900], init="whatever")
是否有预期的方式来表达这种性质的减少功能?
您需要将缩减函数 return 修改后的数组,而不是修改后的元素值。试试这个:
function ct_a(arr, i)
arr[i] += 1
arr
end
julia> reduce(ct_a, [2, 3, 4], init=zeros(Int, 5))
5-element Array{Int64,1}:
0
1
1
1
0