我有一个我要修改的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
但我认为必须有更有效的方法来做到这一点?
答案 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)
基本相同。