2016-04-03 23 views
6

我有一個二維數組,我想修改它以便將一個給定的元素與其之前的所有元素相加,例如,如果我有一個數組:在Julia中求和整數數組的有效方法

[1 2; 3 6; 4 7; 4 8] 

我希望能夠把它轉化到

[1 2; 4 8; 8 15; 12 23] 

我可以這樣做,用朱莉婭下面的代碼片段:

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

但我認爲必須有一個更有效的方法來做到這一點?

+3

如果您認爲「效率」是指「性能」,只要您將該循環放入函數中,它將基本上與庫函數一樣高效 - 庫函數僅在一般性方面不同,允許您選擇任何維度。使用Julia的樂趣之一就是你不必依賴圖書館的所有功能。 – tholy

回答

16

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

按@勒託利的評論,朱莉婭的真棒的是,內置的功能並不特別,不神奇地快於用戶定義那些。他們都很快。我修改你的功能,我把它作爲內置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) 

它們基本相同。

相關問題