提问人:zdm 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53
Julia 在满足另一个列表条件的列表中查找最大元素的索引
Julia find the index of the maximum element in a list that satisfies another list condition
问:
我想在列表中找到满足特定条件的最大元素的索引。
我有两个列表和.我想找到最大元素的索引,以便.这里的答案是.从数学上讲,我正在寻找在哪里.a = [13, 17, 11, 24, 30]
b = [10, 12, 13, 20, 28]
i
b
a[i]-b[i]>0
i=5
argmax_{i in S} b
S = {i : a_i - b_i > 0}
我的解决方案对列表进行排序并对其进行筛选。有没有更好的方法?
filter(in(findall(>(0), a .- b)), sortperm(b, rev=true))
答:
3赞
Dan Getz
11/15/2023
#1
下面显示了一个没有循环的方法。使用循环应该是最简单的解决方案。
此外,还演示了基准测试。此外,该模块还显示了如何避免在闭包中捕获变量的分配。let
julia> a = [13, 17, 11, 24, 30] ; b = [10, 12, 13, 20, 28];
julia> @btime let a = $a, b = $b
findmax(i->a[i]>b[i] ? b[i] : typemin(Int), eachindex(a))
end
5.714 ns (0 allocations: 0 bytes)
(28, 5)
为了完整起见,版本的基准测试:loop
julia> @btime begin
mi = 0 ; m = typemin(Int); for i in eachindex($a)
if $a[i] > $b[i] && $b[i] > m
m = $b[i]
mi = i
end
end; (m, mi)
end
5.495 ns (0 allocations: 0 bytes)
(28, 5)
评论
0赞
DNF
11/17/2023
将代码编写为函数不是更好吗?提倡使用函数是建议 Julia 性能时必须执行的标准任务之一,而上面的代码似乎提倡一种通常会导致问题的风格。它还以一种令人困惑的方式将基准测试代码与核心功能混合在一起。
0赞
Dan Getz
11/17/2023
@DNF 是的,最好在使用代码的函数中将其放在函数中。出于演示目的,我把它放在外面。希望读者可以从示例中提取该方法。如果你认为它对未来的读者来说太隐蔽了,我会编辑答案。
评论