在由可变结构元素组成的数组中的数据中使用 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 或类似值)或最大值(例如?)?

基本上,我希望能够对结构数组使用条件语句,例如:对于我的结构数组中的每个元素,获取数据满足条件的元素,并从中获取另一个元素的最小值数据。

谢谢!

找到最小值非常简单,使用 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))

对于最大值,使用 maximumfindmax

Julia 注重表现。

你应该避免使用无类型的 structs 因此你的类型定义应该是:

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)