我想定义一个结构来容纳3个元素的向量
mutable struct Coords
r::Array{Float64,3} # essentially holds x,y,z coords
end
Run Code Online (Sandbox Code Playgroud)
现在,我想对这些结构进行排列,并为每个结构内的向量提供随机值。
这是我淡出的地方。我尝试了一些我将要描述的东西,但是没有一个起作用。
试用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
Run Code Online (Sandbox Code Playgroud)
错误消息是
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
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它认为涉及整数。
我试图将for循环的内部更改为
arrayOfStructs[i] = Coords(rand(3))
Run Code Online (Sandbox Code Playgroud)
无济于事。
我也尝试过初始化 arrayOfStructs = []
N
in Array{T,N}
定义数组的维数,即N
type 的维数组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
Run Code Online (Sandbox Code Playgroud)
您可以改为为您的类型创建一个空的外部构造函数,以随机初始化字段。
# 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
Run Code Online (Sandbox Code Playgroud)
您还可以使用理解来轻松构建数组。
arrayOfStructs = [Coords() for i in 1:x]
Run Code Online (Sandbox Code Playgroud)
如果您仍想对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