gpt4 book ai didi

loops - Julia,使用 map 多次运行一个函数,

转载 作者:行者123 更新时间:2023-12-05 00:44:46 26 4
gpt4 key购买 nike

我有一些运行良好的代码,可以做我想做的事,虽然可能有一个更简单更优雅的解决方案,但这是可行的:

round(Int16, floor(rand(TruncatedNormal(150,20,50,250))))

但是,当我尝试使用 map 多次执行它时,它会抛出一个错误,说它不喜欢 Int16 规范,所以:

map(round(Int16, floor(rand(TruncatedNormal(150,20,50,250)))), 1:2)

抛出此错误

ERROR: MethodError: objects of type Int16 are not callable

我只想运行两次(在这种情况下)并对结果求和。为什么不开心?谢谢。 J

最佳答案

map 的第一个参数是一个函数。因此,使用您的代码,Julia 正在尝试进行函数调用:

round(Int16, floor(rand(TruncatedNormal(150,20,50,250))))()

但是 round(Int16, ...) 的输出不是一个函数,它是一个数字,所以你不能调用它。这就是错误显示“Int16 类型的对象不可调用”的原因。您可以使用匿名函数来解决此问题:

map(() -> round(Int16, floor(rand(TruncatedNormal(150,20,50,250)))), 1:2)

但是“朱利安”的做法是使用推导式:

[round(Int16, floor(rand(TruncatedNormal(150,20,50,250)))) for _ in 1:2]

编辑:

如果您要对结果进行 sum,那么您可以使用看起来像推导式但称为生成器表达式的东西。这基本上是上面的所有内容,表达式周围有 [ ]。生成器表达式可以直接用在 summean 等函数中。

sum(round(Int16, floor(rand(TruncatedNormal(150,20,50,250)))) for _ in 1:2)

生成器表达式的优点是它们不会为整个数组分配内存。因此,如果您这样做 100 次并使用上述 sum 方法,则无需为 100 个数字分配空间。


这超出了最初的问题,但 OP 想要使用 sum 表达式,其中 1:2 中的 2 是 1-元素向量。当然,如果输入总是一个 1 元素向量,那么我推荐 first(x) 就像注释一样。但这是一个很好的机会来展示在 Julia 中经常将事物分解为函数的重要性。例如,您可以获取整个 sum 表达式并定义一个函数

generatenumbers(n::Integer) = sum(... for _ in 1:n)

其中 n 是一个标量。然后,如果您有一些奇怪的 n 数组表达式(1 元素向量,多维数组中的许多这样的 n 等),您可以这样做:

generatenumbers.(ns)
# will apply to each element and return same shape as ns

如果脱糖逻辑比按元素应用更复杂,您甚至可以定义:

generatenumbers(ns::AbstractArray) = # ... something more complex

关键是定义一个“原子”函数,清楚地表达你想要的语句或任务,然后使用 dispatch 将其应用于实际代码中出现的更复杂的数据结构。这是 Julia 中的一种常见设计模式(不是唯一的选择,而是一种有效的选择)。

关于loops - Julia,使用 map 多次运行一个函数,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957934/

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