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

cer*_*ony 5 julia

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

[1 2; 3 6; 4 7; 4 8]
Run Code Online (Sandbox Code Playgroud)

我希望能够将其转换为

[1 2; 4 8; 8 15; 12 23]
Run Code Online (Sandbox Code Playgroud)

我可以使用julia中的以下代码片段来完成此操作:

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

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

rcp*_*nto 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
Run Code Online (Sandbox Code Playgroud)


tln*_*agy 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
Run Code Online (Sandbox Code Playgroud)

我构建了测试数组:

arr = rand(1:100, 10^5, 10^2)
arr2 = copy(arr)
Run Code Online (Sandbox Code Playgroud)

我得到了以下时间:

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

@time testB!(arr2)
0.007704 seconds (4 allocations: 160 bytes)
Run Code Online (Sandbox Code Playgroud)

这几乎是等价的.