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

时间:2016-04-03 22:09:28

标签: 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

但我认为必须有更有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:15)

是的,有: 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

答案 1 :(得分:7)

根据@ 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)

基本相同。