如何解决如何用任意类型的备忘录编写reduce函数
我正在尝试编写一个简单的直方图程序,该程序采用未知(非常大)长度的流,仅整数,并将它们合并。我的问题与 binning 无关,因此我们可以假设整数可以在 (0,1000] 范围内,并且直方图 bin 的大小为 1(每个可能的数字都有自己的 bin)。
通常我会在任何编程语言中使用 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},1})
ERROR: MethodError: no method matching reduce(::typeof(ct_a),1})
ERROR: MethodError: no method matching setindex!(::Int64,::Int64,::Int64)
这似乎应该有效,因为 AFAIK 没有正式的理由说明 reduce
操作的输出需要类似于被迭代的单个元素的类型。但是,我可以在网上找到的关于在 julia 中使用 reduce
的每个示例都假设备忘录(输出)的类型类似(即,传入的 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")
有没有一种有意的方式来表达这种性质的reduce函数?
解决方法
您需要您的归约函数来返回修改后的数组,而不是修改后的元素值。试试这个:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。