Julia中整数数组求和的有效方法
我有一个2D数组,我想修改它,以便将一行中的给定元素与它前面的所有元素相加,例如,如果我有一个数组: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
[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的乐趣之一是,您不必事事依赖于库函数。