2016-04-03 50 views
6

私は配列の前にあるすべての要素を持つ行の特定の要素を合計するように修正したい2D配列を持っています。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を使用することの喜びの1つは、すべてのライブラリ関数に頼る必要がないことです。 – tholy

答えて

16

はい、あります:CUMSUM @ tholyさんのコメントを1として

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) 

は基本的に同等です。

関連する問題