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

M.E*_*.E. 2 julia

我想了解我应该放置什么,而不是xxxxx使用a从from 2000到的结构初始化一个1000个项的数组3000(即,数组均值的索引1为,数组均值a2000索引2 a2001,依此类推),b并且始终是零。

struct MyStruct
    a
    b
end

myArray = Vector{MyStruct}( xxxxx , 1000)
Run Code Online (Sandbox Code Playgroud)

我知道我可以进行循环并单独分配值,我只是想知道Julia中是否有更快的方法。

Jak*_*sen 5

仅在单个帖子中收集其他用户的答案和评论:

不,没有比在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
Run Code Online (Sandbox Code Playgroud)

广播既方便又方便

广播几乎或有时与循环一样快,并且通常更简洁和方便。在这种情况下,initialize_vector上面的函数可以写成:

initialize_vector(range::AbstractRange) = MyStruct.(range, 0)

基准测试表明,这两个功能的速度几乎相同。

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

Julia依靠类型的准确推断来创建快速,专业的代码。如果类型的MyStruct.aMyStruct.b可以是任何东西,它通常是无法推断到底是什么样的操作应在执行MyStruct。即使在这种情况下,编译器也可以推断类型为Int,每个类型都MyStruct必须包含对堆分配Int的的引用,而不是堆栈分配的。因此,只需更改即可获得10倍的加速比

struct MyStruct
    a
    b
end
Run Code Online (Sandbox Code Playgroud)

struct MyStruct
    a::Int
    b::Int
end
Run Code Online (Sandbox Code Playgroud)

如果您想要类型Mystruct.aMyStruct.b能够变化,则可以创建一个参量MyStruct,如下所示:

struct MyStruct{T}
    a::T
    b::T
end
Run Code Online (Sandbox Code Playgroud)