代码之家  ›  专栏  ›  技术社区  ›  rakesh a

求交错数组的元素最大值和最小值

  •  0
  • rakesh a  · 技术社区  · 5 年前

    我有一个锯齿状的数组。像下面这样,我想找到元素的最大值和最小值,如下所示。

    julia> srand(0);
    julia> triarr = [[rand(0:99, 2) for i in 1:j] for j in 1:3]
    3-element Array{Array{Array{Int64,1},1},1}:
    Array{Int64,1}[[40, 6]]                    
    Array{Int64,1}[[29, 77], [44, 74]]         
    Array{Int64,1}[[64, 23], [55, 8], [35, 37]]
    julia> min.(vcat(triarr...)...)
    2-element Array{Int64,1}:
    29
    6
    julia> max.(vcat(triarr...)...)
    2-element Array{Int64,1}:  
    64
    77
    

    这种方法很有效,看起来也很聪明,但对于较大的阵列来说需要大量时间。有没有一个惯用的方法?

    1 回复  |  直到 5 年前
        1
  •  3
  •   carstenbauer    5 年前

    Julia 1.0的快捷方式是

    julia> h(t) = minimum(Iterators.flatten(t))
    h (generic function with 1 method)
    
    julia> @btime h($triarr);
      806.500 ns (4 allocations: 80 bytes)
    

    这几乎应该是最佳的:

    julia> function g(t)
               itr = Iterators.flatten(t)
               xmin, ymin = first(itr)
               @inbounds for i in itr
                   i[1] < xmin && (xmin = i[1])
                   i[2] < ymin && (ymin = i[2])
               end
               return xmin, ymin
           end
    g (generic function with 1 method)
    
    julia> @btime g($triarr);
      23.466 ns (0 allocations: 0 bytes)