我有一个我想要修改的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)
这几乎是等价的.