Julia中整数数组求和的有效方法

Julia中整数数组求和的有效方法,julia,Julia,我有一个2D数组,我想修改它,以便将一行中的给定元素与它前面的所有元素相加,例如,如果我有一个数组: [1 2; 3 6; 4 7; 4 8] 我希望能够将其转换为 [1 2; 4 8; 8 15; 12 23] 我可以使用julia中的以下代码片段来实现这一点: for i in 1:10, for k in 2:size(d,1), d([k,i] += d[k-1,i)]; end end 但是我想一定有更有效的方法来做到这一点吗?是的,有:cumsu

我有一个2D数组,我想修改它,以便将一行中的给定元素与它前面的所有元素相加,例如,如果我有一个数组:

[1 2; 3 6; 4 7; 4 8]
我希望能够将其转换为

[1 2; 4 8; 8 15; 12 23]
我可以使用julia中的以下代码片段来实现这一点:

for i in 1:10,
   for k in 2:size(d,1),
          d([k,i] += d[k-1,i)];
   end
end

但是我想一定有更有效的方法来做到这一点吗?

是的,有:cumsum

julia> d = [1 2; 3 6; 4 7; 4 8]
4x2 Array{Int64,2}:
 1  2
 3  6
 4  7
 4  8

julia> cumsum(d)
4x2 Array{Int64,2}:
  1   2
  4   8
  8  15
 12  23

根据@tholy的评论,julia令人敬畏的地方在于内置函数并不特殊,也不比用户定义的函数神奇地快。他们都很快。我修改了您的函数,使其执行的功能与内置的
cumsum
大致相同:

function testA!(arr)
    @inbounds for i in 1:size(arr, 2)
        tmp = arr[1, i]
        for k in 2:size(arr,1)
            tmp += arr[k, i]
            arr[k,i] = tmp
        end
    end
    arr
end

function testB!(arr)
    cumsum!(arr, arr)
end
我构建了测试阵列:

arr = rand(1:100, 10^5, 10^2)
arr2 = copy(arr)
我得到了以下时间安排:

@time testA!(arr)
0.007645 seconds (4 allocations: 160 bytes)

@time testB!(arr2)
0.007704 seconds (4 allocations: 160 bytes)
它们基本上是等价的。

如果“高效”是指“性能”,只要将该循环放入函数中,它基本上与库函数一样高效——库函数只是在一般性上有所不同,允许您选择任何维度。使用Julia的乐趣之一是,您不必事事依赖于库函数。