【问题标题】:Accessing array inside composite type in Julia在 Julia 中访问复合类型内的数组
【发布时间】:2019-01-22 08:17:43
【问题描述】:

我有以下两个结构。当我使用构造函数初始化结构时,会创建一个数组,但这不是我所期望的。

using Distributions

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

mutable struct Coords
    r::Vector{XYZ}
end

""" Make a structure called test that contains a vector of type XYZ 
I want to have 10 XYZ structs in the "r" Vector """

Coords() = ( rand(Uniform(0,1.0),10,3) )
test = Coords()

我想通过test.r.x[i] 访问test,但是 Julia 抱怨类型 Tuple 没有字段 r。它创建的是一个大小为 10x3 的二维数组,我可以通过 test[i,j] 调用元素,但这远非我想要的。我想在复合材料中使用可调用名称的其他数组/变量...

我也试过这样初始化

XYZ() = (rand(),rand(),rand())
Coords() = ([ XYZ() for i in 1:10 ])
test = Coords()

我仍然收到同样的警告。似乎我创建了一个元组而不是复合类型。如何创建在其他结构中包含数组/向量的复合类型?

我使用的是 Julia 版本 1.0.2

【问题讨论】:

  • 哦,(expr) 不会创建 1 元组——这相当于 expr。要实际创建一个 1 元组(此处实际上不需要),请编写 (expr,),就像在 Python 中一样。

标签: arrays julia


【解决方案1】:

您实际上从未在Coords() 中调用inner constructor。实现你想要的:

XYZ() = XYZ(rand(), rand(), rand())
Coords() = Coords([XYZ() for _ in 1:10])

但我建议不要提供初始化特殊随机布局的构造函数。相反,您可以正确地将overload rand 用于XYZ,这会免费为您提供一个数组-rand

julia> import Random

julia> Random.rand(rng::Random.AbstractRNG, ::Random.SamplerType{XYZ}) = XYZ(rand(rng), rand(rng), rand(rng))

julia> rand(XYZ)
XYZ(0.7580070440261963, 0.15662533181464178, 0.7450476071687568)

julia> rand(XYZ, 10)
10-element Array{XYZ,1}:
 XYZ(0.5984858021544213, 0.16235318543392796, 0.729919026616209)  
 XYZ(0.45516751074248374, 0.9667694185826785, 0.39798147467761247)
 XYZ(0.7329129925610325, 0.7725520616259764, 0.42264014343531)    
 XYZ(0.10415869248789567, 0.4193162272272648, 0.3265074454289505) 
 XYZ(0.2286383169588948, 0.7119393337105202, 0.5166340562764509)  
 XYZ(0.23011692279595186, 0.35344093654843767, 0.9488399720160021)
 XYZ(0.20464532213275577, 0.05761320898130973, 0.7694525743407523)
 XYZ(0.3022492318001946, 0.9212313012991236, 0.819167833632835)   
 XYZ(0.6331585756351794, 0.9812979781832118, 0.3969247687412505)  
 XYZ(0.6049257667248391, 0.7155977104637223, 0.5294492917395452)  

julia> Coords(rand(XYZ, 10))
Coords(XYZ[XYZ(0.633945, 0.882152, 0.750866), XYZ(0.496134, 0.241877, 0.188791), XYZ(0.267383, 0.552298, 0.613393), XYZ(0.569428, 0.503757, 0.120985), XYZ(0.822557, 0.982106, 0.37321), XYZ(0.250684, 0.701853, 0.509496), XYZ(0.886511, 0.83301, 0.381657), XYZ(0.628089, 0.00574949, 0.730268), XYZ(0.382186, 0.411701, 0.86016), XYZ(0.904469, 0.854098, 0.270464)])

【讨论】:

  • 您好,是的,将我的第二个版本的构造函数更改为 XYZ() = XYZ(stuff) 而不是 XYZ() = (stuff) 并将第二个构造函数更改为 Coords()=Coords(stuff) 而不是 Coords() = (stuff) 似乎有解决了所有问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多