在由可变结构元素组成的数组中的数据中使用 findmin() - Julia

Using findmin() in data from array composed of mutable struct elements - Julia

提问人:Pedro Germani 提问时间:3/31/2020 最后编辑:Pedro Germani 更新时间:3/31/2020 访问量:403

问:

假设我有以下结构:

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

如果还想要最小值的索引,则可以使用该函数。不幸的是,由于某种原因,这不支持函数参数,因此您必须创建一个临时数组,并应用于该数组:findminfindmin

julia> findmin(getfield.(fleet, :odometer))
(0.08468003971220694, 1)

你也可以用代替,它们对你的结构做同样的事情,我不确定哪个更可取。可能,最惯用的解决方案是定义访问器函数,而不是直接使用字段值。例如:getpropertygetfield

odometer(car::Car) = car.odometer
minimum(odometer, fleet)
findmin(odometer.(fleet))

对于最大值,请使用 和 。maximumfindmax

评论

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)