Julia 当您有一个数组时,如何获得结构项的最大值?

Julia 当您有一个数组时,如何获得结构项的最大值?,julia,Julia,Julia中有以下结构,我用它创建了一个数组 julia> struct myStruct a::Int b::Int c::String end julia> myArray = myStruct.(1:10,11:20,"ABC") 10-element Array{myStruct,1}: myStruct(1, 11, "ABC") myStruc

Julia中有以下结构,我用它创建了一个数组

julia>     struct myStruct
              a::Int
              b::Int
              c::String
           end

julia>     myArray = myStruct.(1:10,11:20,"ABC")
10-element Array{myStruct,1}:
 myStruct(1, 11, "ABC") 
 myStruct(2, 12, "ABC") 
 myStruct(3, 13, "ABC") 
 myStruct(4, 14, "ABC") 
 myStruct(5, 15, "ABC") 
 myStruct(6, 16, "ABC") 
 myStruct(7, 17, "ABC") 
 myStruct(8, 18, "ABC") 
 myStruct(9, 19, "ABC") 
 myStruct(10, 20, "ABC")
在Julia中我应该怎么做才能得到a的最大值

是否建议首先获取包含结构的前两个值的2列数组,然后使用FindMaxMy2Colaray[:,1]查找最大值

我有三个问题需要理解,我应该如何做到这一点:

如果需要先获取数组,如何高效地获取该2列数组? 如果不需要,如何直接从结构数组中获取a的最大值? 该字符串最多包含50个字符,且为ASCII no UTF-8。我是否应该以某种方式固定绳子的长度以提高性能? 您可以使用最大值函数。maximum还接受一个函数,在本例中,您可以使用该函数按字段排序:

稍微修改示例,使最大值和索引不同。

您可以使用最大值函数。maximum还接受一个函数,在本例中,您可以使用该函数按字段排序:


稍微修改您的示例,使最大值和索引不同。

获取a最大值的最简单方法是,如@fredrikekre所述:

maxval = maximum(x->x.a, arr)
不幸的是,这并没有为您提供该值的索引,您也在评论中要求该索引

理想情况下,您可以使用argmax或findmax:

上面的代码有一点效率低下,x的第一个值和索引被读取两次。如果您想要更快的性能,您可以找到一种避免这种情况的方法

至于性能,这个循环大约与maximumx->x.a,arr一样快,与构建问题1中要求的2列矩阵一样快60倍以上


主要的教训是:你不需要寻找一些聪明的内置解决方案,你可以插入你的问题。如果你不能很快找到一个,只需自己做一个,它很可能会更快。

获得a最大值的最简单方法是,如@fredrikekre所述:

maxval = maximum(x->x.a, arr)
不幸的是,这并没有为您提供该值的索引,您也在评论中要求该索引

理想情况下,您可以使用argmax或findmax:

上面的代码有一点效率低下,x的第一个值和索引被读取两次。如果您想要更快的性能,您可以找到一种避免这种情况的方法

至于性能,这个循环大约与maximumx->x.a,arr一样快,与构建问题1中要求的2列矩阵一样快60倍以上


主要的教训是:你不需要寻找一些聪明的内置解决方案,你可以插入你的问题。如果你不能很快找到一个,只需自己做一个,它很可能会更快。

maximum返回的是最大值,而不是它的索引。不幸的是,idea和argmax的实际版本都不支持将第一个参数作为fina.1传递,而将第一个参数作为fina.2传递。因此,您可以从结构中检索其他值。这是一个简化的示例,使问题/答案易于理解。另外,我想知道我是否应该定义字符串的长度/大小。@M.E.您能否更新您的问题以澄清您正在寻找索引?现在,你的问题只问最大值。啊,当然对了。值和索引相同时的棘手示例。编辑了帖子。是的,在这种情况下有点棘手,因为它是相同的数字,valuemaximum返回的是最大值,而不是它的索引。不幸的是,argmax和findmax目前版本1.2不支持将函数作为第一个参数传递。其目的是获取索引,而不是实际值。因此,您可以从结构中检索其他值。这是一个简化的示例,使问题/答案易于理解。另外,我想知道我是否应该定义字符串的长度/大小。@M.E.您能否更新您的问题以澄清您正在寻找索引?现在,你的问题只问最大值。啊,当然对了。值和索引相同时的棘手示例。编辑了这篇文章。是的,在这种情况下有点棘手,因为它是相同的数字和值。你的问题有点让人困惑。如果您只对数组感兴趣,为什么要使用2列数组?你能确切地说明你需要什么吗?你关心b中的值吗?你想要索引和值吗?一旦我确定了a的最大值,我想要得到整个结构。但是有几行可以共享该值,然后我需要b列。我本来会进一步简化这个问题的,正如你所说的,这个问题令人困惑。你的问题有点困惑。如果您只对数组感兴趣,为什么要使用2列数组?你能确切地说明你需要什么吗?你关心b中的值吗?你想要索引和值吗?一旦我确定了a的最大值,我想要得到整个结构。但是几排
s可以共享该值,然后我需要b列。我将进一步简化这个问题,因为您提到的问题令人困惑。感谢您的解释,我显然倾向于寻找内置操作,而不是构建循环。如果您想使用第二列作为平局断路器,那就更有理由编写您自己的自定义循环:感谢您的解释,显然,我倾向于寻找内置操作,而不是构建循环。如果您想使用第二列作为断开连接的工具,那么就更需要编写自己的自定义循环:
(maxval, maxind) = findmax(x->x.a, arr)  # <= This does not work!!
function find_amax(arr::AbstractArray{MyStruct})
    isempty(arr) && ArgumentError("reducing over an empty collection is not allowed")
    maxind, maxval = firstindex(arr), first(arr).a
    for (i, x) in enumerate(arr)
        if x.a > maxval
            maxind, maxval = i, x.a
        end
    end
    return maxval, maxind
end