2016-04-15 13 views
0

配列の要素を合計して辞書に格納しています。キーは、インデックス==キーの要素を除いた配列の要素の合計に対応します。私は1ライナーとしてそれをやろうとしています。これは私がしたいことを理解するためのコードの単純化された例です。Julia:選択したインデックスに対応する要素を除いた配列の要素の合計

コード:

a = [1, 2, 3, 4] 
b = [1, 2, 3, 4] 
result = [k => sum(b) for k=a] 

私はdeleteatを使用してみました!

sum(deleteat!(b, k)) 

時にはそれが私は良いアイデアが、今のところありません結果を思い付くしたい境界エラーを与えます。

ありがとうございました。

+2

すべての要素を追加して不要なものを取り除くのはどうですか?すべての要素の合計が使用する要素と同じであるため、これを複数回実行する場合は、合計を1回だけ行うことで計算を節約できます) –

+0

あなたのようにlutionは良いですが、私の本当の問題には当てはまりません。上のコードは、私が達成したいことを理解するためのものです。私はちょうど実際のコードをここに掲載したくありません。 –

+1

数値の問題以外にも(インデックスkの要素を除いたすべての要素の合計)=(すべての要素の合計) - (インデックスkの要素)(例えば、インデックスkの要素が膨大で、限られた精度の浮動小数点で動作します)。 –

答えて

2

上記溶液、すなわち:

f(a) = [sum([i==j ? zero(eltype(a)) : a[j] for j=1:length(a)]) for i=1:length(a)] 

私はそれがjにおける要素なし合計するために、長さaのベクターを構築し、ないので、それは、O(N^2)になると思います結果ベクトルを構築するためにその長さ(a)回。ここ

g(a) = let s = sum(a) ; [ s-v for v in a ] end 

(O(n)は、N =長さ(A)であるべきである)、ここで、別の溶液(これもO(n))は、配列演算子を使用している私の最初の溶液です。

h(v) = fill(sum(v), length(v)) - v 

ここに私のベンチマーク結果は、あるとベクトルzを作成した後:あなたが見ることができるz = rand(1:100000,1000)として、最速のが私の最初のソリューションは、それが中に以前に与えられたソリューションに比べて約1000倍高速です(明示的な配列内包し、ありますコメントは、O(n^2)の代わりにO(n)であり、n == 1000です。

julia> @benchmark f(z) 

================ Benchmark Results ======================== 
    Time per evaluation: 2.59 ms [1.86 ms, 3.32 ms] 
Proportion of time in GC: 19.08% [3.56%, 34.59%] 
     Memory allocated: 7.79 mb 
    Number of allocations: 3003 allocations 
     Number of samples: 100 
    Number of evaluations: 100 
Time spent benchmarking: 0.34 s 


julia> @benchmark g(z) 
================ Benchmark Results ======================== 
    Time per evaluation: 1.77 μs [1.74 μs, 1.79 μs] 
Proportion of time in GC: 8.65% [7.34%, 9.95%] 
     Memory allocated: 7.97 kb 
    Number of allocations: 3 allocations 
     Number of samples: 8201 
    Number of evaluations: 4959001 
     R² of OLS model: 0.952 
Time spent benchmarking: 8.88 s 


julia> @benchmark h(z) 
================ Benchmark Results ======================== 
    Time per evaluation: 2.98 μs [2.94 μs, 3.03 μs] 
Proportion of time in GC: 10.54% [9.05%, 12.02%] 
     Memory allocated: 15.92 kb 
    Number of allocations: 5 allocations 
     Number of samples: 7601 
    Number of evaluations: 2799801 
     R² of OLS model: 0.951 
Time spent benchmarking: 8.41 s 
関連する問題