gpt4 book ai didi

julia - 矢量化飞溅

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

我希望能够以矢量化的方式将一组元组放入一个函数中。比如我有如下函数,

function foo(x, y)
x + y
end

以及下面的元组数组,

args_array = [(1, 2), (3, 4), (5, 6)]

然后我可以使用列表推导来获得所需的结果:

julia> [foo(args...) for args in args_array]
3-element Array{Int64,1}:
3
7
11

但是,我希望能够为此操作使用点矢量化符号:

julia> foo.(args_array...)
ERROR: MethodError: no method matching foo(::Int64, ::Int64, ::Int64)

但正如您所见,该特定语法不起作用。有没有一种矢量化的方式来做到这一点?

最佳答案

foo.(args_array...) 不起作用,因为它正在做:

foo.((1, 2), (3, 4), (5, 6))
# which is roughly equivalent to
[foo(1,3,5), foo(2,4,6)]

换句话说,它将 args_array 的每个元素作为一个单独的参数,然后在这些参数上广播 foo。您想直接在元素上广播 foo。问题在于运行:

foo.(args_array)
# is roughly equivalent to:
[foo((1,2)), foo((3,4)), foo((5,6))]

换句话说,广播语法只是将每个元组作为单个参数传递给foo。我们可以通过一个简单的中间函数来解决这个问题:

julia> bar(args) = foo(args...);

julia> bar.(args_array)
3-element Array{Int64,1}:
3
7
11

现在这就是你想要的!如果你不想,你甚至不需要构造第二个参数。这是完全等价的:

julia> (args->foo(args...)).(args_array)
3-element Array{Int64,1}:
3
7
11

事实上,你可以很容易地概括这一点:

julia> splat(f) = args -> f(args...);

julia> (splat(foo)).(args_array)
3-element Array{Int64,1}:
3
7
11

关于julia - 矢量化飞溅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55286349/

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