【问题标题】:Julia, for loop iterator increase to zeroJulia,for循环迭代器增加到零
【发布时间】:2021-02-01 17:13:45
【问题描述】:

我有一个很好的函数,可以对使用该函数生成的一组随机数求和。

sum(round(Int8, floor(
        rand(TruncatedNormal(var1, var2, var3, var4))))
                     for _ in 1:var5)

大多数情况下它工作正常,var5,for 循环的迭代器是在函数中较早计算的,并且可以合法地为零。因此,通过从 1 增加到 0 进行迭代不起作用并引发错误。 Julia 中是否有一个干净的“检查”,它只会为整个函数生成 0 的结果,或者我是否需要返回并将此函数包含在 if 语句中以在运行之前检查 var5 的值,如果var5<=0,产生替代结果(0)?谢谢。 J

【问题讨论】:

  • 您尝试过this answer中建议的选项吗?
  • 谢谢。 PaSTE,我可以看到三元运算符优雅而简单,我就是无法让它与这段代码一起工作,你能给出代码的建议语法吗?

标签: for-loop iterator julia


【解决方案1】:

当您执行sum(rand(Int8) for _ in 1:0) 时,您会收到错误:

julia> sum(rand(Int8) for x in 1:0)
ERROR: ArgumentError: reducing over an empty collection is not allowed
Stacktrace:
 [1] _empty_reduce_error() at ./reduce.jl:299
 [2] mapreduce_empty(::Function, ::Base.BottomRF{typeof(Base.add_sum)}, ::Type{T} where T) at ./reduce.jl:342
 [3] reduce_empty(::Base.MappingRF{var"#9#10",Base.BottomRF{typeof(Base.add_sum)}}, ::Type{Int64}) at ./reduce.jl:329
 [4] reduce_empty_iter at ./reduce.jl:355 [inlined]
 [5] reduce_empty_iter at ./reduce.jl:354 [inlined]
 [6] foldl_impl at ./reduce.jl:49 [inlined]
 [7] mapfoldl_impl at ./reduce.jl:44 [inlined]
 [8] #mapfoldl#204 at ./reduce.jl:160 [inlined]
 [9] mapfoldl at ./reduce.jl:160 [inlined]
 [10] #mapreduce#208 at ./reduce.jl:287 [inlined]
 [11] mapreduce at ./reduce.jl:287 [inlined]
 [12] sum at ./reduce.jl:494 [inlined]
 [13] sum(::Base.Generator{UnitRange{Int64},var"#9#10"}) at ./reduce.jl:511
 [14] top-level scope at REPL[6]:1

一个非常简单的解决方法是先将随机数收集到一个数组中——或者简单地使用推导式而不是生成器:

julia> sum([rand(Int8) for x in 1:0])
0

您也可以使用上面链接的三元表达式来完全避免该问题:

julia> var5 = 0
0

julia> var5 < 1 ? 0 : sum(rand(Int8) for x in 1:var5)
0

julia> var5 = 2
2

julia> var5 < 1 ? 0 : sum(rand(Int8) for x in 1:var5)
49

【讨论】:

  • 就这么简单!谢谢。 J
【解决方案2】:

对于需要对空集合求和的情况,我更喜欢明确的 reduceinit 值:

julia> reduce(+, (rand(Int8) for x in 1:0), init=Int8(0))
0

【讨论】:

  • 非常优雅的解决方案。谢谢。 J
  • 它应该是init=Int8(0) 所以如果结果也应该是Int8
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2015-11-03
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多