在 Julia 中对两个数组中元素的所有组合(强力)进行简单计算,以获得更好的性能

Simple calculation for all combination (brute force) of elements in two arrays, for better performance, in Julia

我是 Julia 的新手(对 Python 有一些经验)。我开始使用 Julia 的主要原因是大规模数据处理的性能更好。

我想得到两个数组中所有可能组合的值 (int) 的差异。

假设我有两个数组。

a = [5,4]
b = [2,1,3]

然后我想要所有组合的差异,比如 a[1] - b[1], a[1] - b[2] ..... a[3] - b[1], a[3] - b[2]

结果将是 3 x2 数组 [3 2; 4 3; 2 1]

然后我想到的是

a = [5,4]  
b = [2,1,3]
diff_matrix = zeros(Int8, size(b)[1], size(a)[1])
for ia in eachindex(a)
    for ib in eachindex(b)
        diff_matrix[ib,ia]= a[ia] - b[ib]
    end
end
println(diff_matrix)

它有效,但它在迭代中使用迭代,我认为性能不会很好。在实际应用中,数组的长度会很长(比如几百),这个过程需要对数百万的数组组合进行。

这个任务有更好的(更好的性能,更简单的代码)方法吗?

如果您将代码包装在一个函数中,您的代码已经相当快了。

这正是 Julia 循环速度快的强大之处。您唯一需要避免的是在计算中使用全局变量(因为它们导致代码不是 type stable)。

我写的代码会“相当快”,因为它可以通过一些低级技巧变得更快。但是,在这种情况下,您可以只写:

julia> a = [5,4]                
2-element Vector{Int64}:        
 5                              
 4                              
                                
julia> b = [2,1,3]              
3-element Vector{Int64}:        
 2                              
 1                              
 3                              
                                
julia> permutedims(a) .- b      
3×2 Matrix{Int64}:              
 3  2                           
 4  3                           
 2  1                           

而且这段代码会很快(而且更简单)。