提问人:Pedro Germani 提问时间:3/31/2020 最后编辑:Pedro Germani 更新时间:3/31/2020 访问量:403
在由可变结构元素组成的数组中的数据中使用 findmin() - Julia
Using findmin() in data from array composed of mutable struct elements - Julia
问:
假设我有以下结构:
mutable struct Car
load
locale
availability
odometer
end
我创建了一个数组:
fleet = Vector{Car}(undef, num_cars)
for i in 1:num_cars
a, b, c, d = rand(4)
fleet[i] = Car(a, b, c, d)
end
例如,如何从数组中所有汽车的里程表中找到最小(带有 findmin
或类似)或最大(带有?)值?
基本上,我希望能够将条件语句与结构数组一起使用,例如:对于我的结构数组中的每个元素,获取数据满足条件的元素,并从中获取另一个数据的最小值。
谢谢!
答:
3赞
DNF
3/31/2020
#1
使用带有映射参数的函数查找最小值非常简单:minimum
julia> minimum(x->x.odometer, fleet)
0.08468003971220694
如果还想要最小值的索引,则可以使用该函数。不幸的是,由于某种原因,这不支持函数参数,因此您必须创建一个临时数组,并应用于该数组:findmin
findmin
julia> findmin(getfield.(fleet, :odometer))
(0.08468003971220694, 1)
你也可以用代替,它们对你的结构做同样的事情,我不确定哪个更可取。可能,最惯用的解决方案是定义访问器函数,而不是直接使用字段值。例如:getproperty
getfield
odometer(car::Car) = car.odometer
minimum(odometer, fleet)
findmin(odometer.(fleet))
对于最大值,请使用 和 。maximum
findmax
评论
0赞
Pedro Germani
3/31/2020
完美,前两个工作并解决了我的问题,谢谢!
1赞
Przemyslaw Szufel
3/31/2020
#2
茱莉亚是关于表演的。
应避免使用非类型化 s,因此类型定义应为:struct
mutable struct Car
load::Float64
locale::Float64
availability::Float64
odometer::Float64
end
创建代码可以更短:Vector
cars = [Car(rand(4)...) for _ in 1:5]
查找最小元素索引的最有效方法是:
julia> Base.isless(c1::Car,c2::Car) = c1.odometer < c2.odometer
julia> findmin(cs)
(Car(0.7623514815463603, 0.7523019237133661, 0.37422766075278413, 0.49830949323733464), 3)
评论