微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用任意类型的备忘录编写reduce函数

如何解决如何用任意类型的备忘录编写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 举报,一经查实,本站将立刻删除。