在由可变结构元素组成的数组中的数据中使用 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))
对于最大值,使用 maximum
和 findmax
。
Julia 注重表现。
你应该避免使用无类型的 struct
s 因此你的类型定义应该是:
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)
假设我有以下结构:
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))
对于最大值,使用 maximum
和 findmax
。
Julia 注重表现。
你应该避免使用无类型的 struct
s 因此你的类型定义应该是:
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)