gpt4 book ai didi

arrays - Julia 中随机输出的数组理解

转载 作者:行者123 更新时间:2023-12-04 23:57:01 25 4
gpt4 key购买 nike

This question is an extension if one I asked earlier today .基本上,我试图在 Julia 中编写一个调用函数的数组推导式 f(x)它的输出是一个随机数。当达到小于 0.5 的随机数时,我希望它终止该函数。我能够编写以下代码:

X=[f(i) for i in 1:1:100 if (j=f(i) ;j < 0.5 ? false: j>0.5)]



问题在于这会调用 f(x) 的两个单独实例。 ,并且因为 f(x)每次都是随机的,以上不会在正确的实例中杀死 for 循环。我试过

X=[J=f(i) for i in 1:1:100 if (J < 0.5 ? false: J>0.5)]



试图保存那个特定的随机数,但它告诉我 J 没有定义。有没有办法保存这个特定的随机数来执行我的数组理解?

最佳答案

坚持单行解决方案并受到@TasosPapastylianou 的启发,一个快速的解决方案是:

X = ( r=Vector{Float64}() ; 
any(i->(v=f(i) ; v>0.5 ? ( push!(r,v) ; false) : true), 1:100)
; r )

[一行被分成三行,因为它有点长;)]

从, f缺少,要测试此复制粘贴此版本 rand :
(r=ones(0); any(i->(v=rand(); v>0.5 ? (push!(r,v); false) : true), 1:10); r)

它的基准测试比凤阳的功能慢 10% 左右。聪明的一点是利用 any的短路实现。

附录 : 在这里概括一下是凤阳的一个版本 takewhile抽象这个问题的答案:
collectwhilecond(f,cond,itr) = begin
r=Vector{typeof(f(first(itr)))}()
all(x->(y=f(x); cond(y) ? (push!(r,y);true):false),itr)
return r
end

现在,我们可以将上面的答案实现为(使用 joker 作为 f ):
julia> joker(i) = 1.0 + 4*rand() - log(i)

julia> collectwhilecond(joker, x->x>=0.5, 1:100)
3-element Array{Float64,1}:
4.14222
3.42955
2.76387
collectwhilecond如果 Julia 推断 f 也是类型稳定的的返回类型。

编辑:使用@tim 建议的方法来推断 f 的返回类型不拉动 itr 的元素并且没有不稳定的风险 f产生错误,新 collectwhilecond是:
collectwhilecond(f,cond,itr) = begin
t = Base.promote_op(f,eltype(itr)) # unofficial and subject to change
r = Vector{t}()
all( x -> ( y=f(x) ; cond(y) ? (push!(r,y) ; true) : false), itr )
return r
end

关于arrays - Julia 中随机输出的数组理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com