gpt4 book ai didi

struct - Julia:跨不同结构实例的字段应用函数

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

假设我有一个数组 my_array其元素是 myType 的实例,所以数组类型由 Array{myType,1} 给出.
现在让我们说 myType 的每个实例内my_array有一些字段x存储数据向量(例如 typeof(instance_of_myType.x) == Array{Float32,1} )。
如果我知道不同的字段 x myType 的每个实例Array 中的结构具有相同的大小,有没有一种方法可以在不同的字段中广播函数(例如求平均值或求和)x myType 的所有实例在数组中,这会给我一个 Array{Float32,1}向量,这是将函数应用于所有 x 的结果my_array 中结构的字段?有没有办法在没有 for 循环的情况下做到这一点,基本上是我要问的?

最佳答案

这应该可以工作(除非您为您的类型覆盖了 getproperty):

sum.(getproperty.(my_array, :x))
这是一个比较广播和使用理解的完整示例:
julia> struct A{T}
x::T
end

julia> my_array = [A(collect(i:i+3)) for i in 1:3]
3-element Array{A{Array{Int64,1}},1}:
A{Array{Int64,1}}([1, 2, 3, 4])
A{Array{Int64,1}}([2, 3, 4, 5])
A{Array{Int64,1}}([3, 4, 5, 6])

julia> sum.(getproperty.(my_array, :x))
3-element Array{Int64,1}:
10
14
18

julia> [sum(v.x) for v in my_array]
3-element Array{Int64,1}:
10
14
18
现在一个有趣的例子是,如果你想应用一个函数,例如 sum跨字段的各个元素 x在结构中。你可以得到这样的结果:
julia> sum(getproperty.(my_array, :x))
4-element Array{Int64,1}:
6
9
12
15
(请注意,这种情况下唯一的区别是 . 之后没有 sum )
或者像这样
julia> sum(v -> v.x, my_array)
4-element Array{Int64,1}:
6
9
12
15

编辑
所以一般的方法是:
julia> tmp = getproperty.(my_array, :x)
3-element Array{Array{Int64,1},1}:
[1, 2, 3, 4]
[2, 3, 4, 5]
[3, 4, 5, 6]
现在你可以写:
 [fun(getindex.(tmp, i)) for i in eachindex(tmp...)]
假设 fun将向量作为参数。
如果你想使用一个优秀的 SplitApplyCombine.jl 包,你可以这样写:
fun.(invert(getproperty.(my_array, :x)))
invert函数完全满足您的需求,例如:
  julia> invert([[1,2,3], [4,5,6]])
3-element Array{Array{Int64,1},1}:
[1, 4]
[2, 5]
[3, 6]

关于struct - Julia:跨不同结构实例的字段应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62799180/

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