gpt4 book ai didi

struct - 在 Julia 中为结构数组创建和赋值

转载 作者:行者123 更新时间:2023-12-03 15:49:27 28 4
gpt4 key购买 nike

我想定义一个结构来保存 3 个元素的向量

mutable struct Coords
r::Array{Float64,3} # essentially holds x,y,z coords
end

我现在想制作这些结构的数组,并为每个结构内的向量提供随机值。

这是我淡出的地方。我已经尝试了一些我将描述的事情,但没有一个奏效。

试验1:
x = 10                            # I want the array to be of length 10
arrayOfStructs::Array{Coords,x}
for i=1:x
arrayOfStructs[i].r = rand(3)
end

错误信息是
ERROR: LoadError: MethodError: Cannot `convert` an object of type Int64 to an object of type Array{C
oords,10}
Closest candidates are:
convert(::Type{T<:Array}, ::AbstractArray) where T<:Array at array.jl:489
convert(::Type{T<:AbstractArray}, ::T<:AbstractArray) where T<:AbstractArray at abstractarray.jl:1
4
convert(::Type{T<:AbstractArray}, ::LinearAlgebra.Factorization) where T<:AbstractArray at C:\User
s\julia\AppData\Local\Julia-1.0.2\share\julia\stdlib\v1.0\LinearAlgebra\src\factorization.jl:46
...
Stacktrace:
[1] setindex!(::Array{Array{Coords,10},1}, ::Int64, ::Int64) at .\array.jl:769
[2] getindex(::Type{Array{Coords,10}}, ::Int64) at .\array.jl:366
[3] top-level scope at C:\Users\Zarathustra\Documents\JuliaScripts\energyTest.jl:68 [inlined]
[4] top-level scope at .\none:0
in expression starting at C:\Users\Zarathustra\Documents\JuliaScripts\energyTest.jl:67

我不明白为什么它认为涉及整数。

我尝试将 for 循环的内部更改为
arrayOfStructs[i] = Coords(rand(3))

无济于事。

我也试过初始化 arrayOfStructs = []

最佳答案

NArray{T,N}定义数组的维数,即 N类型为 T 的维数组.

您没有定义大小为 3 的数组来保存 x , y , z您的 struct 中的坐标定义,而不是您正在定义一个 3D 数组,它不适合您的目的。

再一次,您只需声明 arrayOfStructs 的类型成为一个 10 维数组而不构造它。在使用数组之前,您需要正确定义和构造数组。
Array Julia 中的类型没有静态大小信息。 Array是一个动态结构,不适合您的情况。对于具有静态大小信息的数组类型,您可能需要查看 StaticArrays.jl .

这是我将如何解决您的问题。

mutable struct Coords
x::Float64
y::Float64
z::Float64
end

x = 10 # I want the array to be of length 10
# create an uninitialized 1D array of size `x`
arrayOfStructs = Array{Coords, 1}(undef, x) # or `Vector{Coords}(undef, x)`

# initialize the array elements using default constructor
# `Coords(x, y, z)`
for i = 1:x
arrayOfStructs[i] = Coords(rand(), rand(), rand())
# or you can use splatting if you already have values
# arrayOfStructs[i] = Coords(rand(3)...)
end

您可以改为为您的类型创建一个空的外部构造函数来随机初始化字段。
# outer constructor that randomly initializes fields
Coords() = Coords(rand(), rand(), rand())

# initialize the array elements using new constructor
for i = 1:x
arrayOfStructs[i] = Coords()
end

您还可以使用推导式轻松构建数组。
arrayOfStructs = [Coords() for i in 1:x]

如果您仍想使用 Array对于您的领域,您可以定义 r作为一维数组并处理 r 的构造在你的构造函数中。

您可能需要查看 Array 文档中的相关部分。 s 和 Composite Types :

https://docs.julialang.org/en/v1/manual/arrays/

https://docs.julialang.org/en/v1/manual/types/#Composite-Types-1

关于struct - 在 Julia 中为结构数组创建和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54232285/

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