Julia 在满足另一个列表条件的列表中查找最大元素的索引

Julia find the index of the maximum element in a list that satisfies another list condition

提问人:zdm 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53

问:

我想在列表中找到满足特定条件的最大元素的索引。

我有两个列表和.我想找到最大元素的索引,以便.这里的答案是.从数学上讲,我正在寻找在哪里.a = [13, 17, 11, 24, 30]b = [10, 12, 13, 20, 28]iba[i]-b[i]>0i=5argmax_{i in S} bS = {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 是的,最好在使用代码的函数中将其放在函数中。出于演示目的,我把它放在外面。希望读者可以从示例中提取该方法。如果你认为它对未来的读者来说太隐蔽了,我会编辑答案。