gpt4 book ai didi

julia - 如何在 Julia 中初始化结构数组

转载 作者:行者123 更新时间:2023-12-01 09:40:08 24 4
gpt4 key购买 nike

我想知道我应该用什么代替 xxxxx使用结构体初始化 1000 个项目数组,其中 a来自 20003000 (即,数组的索引 1 表示 a2000 ,数组的索引 2 表示 a2001 ,依此类推)和 b始终为零。

struct MyStruct
a
b
end

myArray = Vector{MyStruct}( xxxxx , 1000)

我知道我可以做一个循环并单独分配值,我只是想知道 Julia 中是否有更快的东西。

最佳答案

只需在一个帖子中收集其他用户的答案和评论:

不,没有比 Julia 中的循环更快的了

与 Python 和 R 等其他脚本语言不同,Julia 中的循环速度很快。事实上,其他“矢量化”操作,如广播,是根据 Julia 循环本身实现的。因此,一个快速的解决方案可能是:

function initialize_vector(range::AbstractRange)
v = Vector{MyStruct}(undef, length(range))
@inbounds for i in eachindex(range)
v[i] = MyStruct(range[i], 0)
end
return v
end

广播既快捷又方便

广播几乎或有时与循环一样快,并且通常可以更简洁和方便。在这种情况下,函数 initialize_vector上面可以写成:
initialize_vector(range::AbstractRange) = MyStruct.(range, 0)
基准测试表明,这两个函数在速度上几乎相同。

请记住在结构中键入字段以获得更快的代码

Julia 依靠准确的类型推断来创建快速、专用的代码。如 MyStruct.a的类型和 MyStruct.b可以是任何东西,通常不可能确切地推断出应该在 MyStruct 上执行什么样的操作。 .即使在这种情况下,编译器能够推断出类型是 Int , 每个 MyStruct必须包含对堆分配的引用 Int s 而不是堆栈分配。因此,一个 10 倍加速 是从简单的改变中获得的
struct MyStruct
a
b
end


struct MyStruct
a::Int
b::Int
end

如果你想要 Mystruct.a的类型和 MyStruct.b为了能够变化,您可以创建一个参数 MyStruct ,像这样:
struct MyStruct{T}
a::T
b::T
end

关于julia - 如何在 Julia 中初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57953777/

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