Julia:数组中元素的总和,除了与所选索引相对应的元素

时间:2016-04-15 17:30:16

标签: arrays sum julia

我正在对数组的元素求和并将其存储到字典中。键对应于数组中元素的总和,不包括带 index == key 的元素。我试图将其作为一个班轮。这只是我的代码的简化示例,用于理解我想要做的事情。

代码:

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

我尝试使用 deleteat!

sum(deleteat!(b, k))

有时会出现 Bounds错误,所以我想提出更好的想法,但到目前为止没有结果。

感谢。

1 个答案:

答案 0 :(得分:2)

上述解决方案,即:

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

我认为这将是O(n ^ 2),因为它构造了一个长度为a的向量,以便在没有j的元素的情况下求和,并且用这个长度(a)来构造结果向量。

这是我的第一个解决方案(应该是O(n),n =长度(a))

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

这是另一种解决方案(也是O(n)),使用数组运算符。

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

以下是我的基准测试结果,在创建了一个矢量z后:z = rand(1:100000,1000)正如您所看到的,最快的是我的第一个解决方案,具有明确的数组理解(它比解决方案快约1000倍)先前在评论中给出,因为它是O(n)而不是O(n ^ 2),并且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