Arrays Julia:数组中除所选索引对应的元素外的元素的总和

Arrays Julia:数组中除所选索引对应的元素外的元素的总和,arrays,sum,julia,Arrays,Sum,Julia,我对数组的元素求和并将其存储到字典中。Key对应于数组中元素的总和,不包括索引为Key的元素。我试着把它作为一个班轮。这只是我的代码的简化示例,用于理解我想做什么 代码: 我尝试使用deleteat sum(deleteat!(b, k)) 有时它会给出边界错误,所以我想提出更好的想法,但到目前为止没有结果 谢谢。以上解决方案,即: f(a) = [sum([i==j ? zero(eltype(a)) : a[j] for j=1:length(a)]) for i=1:length(a)]

我对数组的元素求和并将其存储到字典中。Key对应于数组中元素的总和,不包括索引为Key的元素。我试着把它作为一个班轮。这只是我的代码的简化示例,用于理解我想做什么

代码:

我尝试使用deleteat

sum(deleteat!(b, k))
有时它会给出边界错误,所以我想提出更好的想法,但到目前为止没有结果


谢谢。

以上解决方案,即:

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))

这是另一个解决方案(也是O(n)),使用数组操作符

h(v) = fill(sum(v), length(v)) - v
下面是我的基准测试结果,在创建了一个向量z之后:
z=rand(1:1000010000)
,正如您所看到的,最快的是我的第一个解决方案,具有明确的数组理解(它比之前在注释中给出的解决方案快约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

上述解决方案,即:

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))

这是另一个解决方案(也是O(n)),使用数组操作符

h(v) = fill(sum(v), length(v)) - v
下面是我的基准测试结果,在创建了一个向量z之后:
z=rand(1:1000010000)
,正如您所看到的,最快的是我的第一个解决方案,具有明确的数组理解(它比之前在注释中给出的解决方案快约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

将所有元素相加,然后减去不需要的元素怎么样?(请注意,所有元素的总和与您使用的元素相同,因此,如果您多次这样做,则只需进行一次求和即可节省计算。)您的解决方案很好,但不适用于我的实际问题。上面的代码只是为了理解我想要实现的目标。我只是不想在这里发布真正的代码。除了数字问题之外,(除索引k处的元素外的所有元素之和)=(所有元素之和)-(索引k处的元素),这是普遍正确的(例如,如果索引k处的元素很大,并且您使用的是有限精度浮点)。顺便说一句,你真的不想尝试用
deleteat!
来做这件事,因为这会修改你应用它的数组。在我的真实代码中,数组b是用不同的元素为数组a的每次迭代构造的。我将尝试按照你的建议减去它,看看结果如何。添加所有元素,然后添加子数组如何去掉你不想要的那个?(注意,所有元素的总和都是相同的,无论你使用哪个元素,所以如果你多次这样做,你可以通过只做一次总和来节省计算。)您的解决方案很好,但不适用于我的实际问题。上面的代码只是为了理解我想要实现的目标。我只是不想在这里发布真正的代码。除了数字问题之外,(除索引k处的元素外的所有元素之和)=(所有元素之和)-(索引k处的元素),这是普遍正确的(例如,如果索引k处的元素很大,并且您使用的是有限精度浮点)。顺便说一句,您确实不想尝试使用
deleteat!
来执行此操作,因为这会修改您将其应用到的数组。在我的实际代码中,数组b在数组a上的每次迭代中都使用不同的元素来构造。我将尝试按照您的建议减去它,并查看结果。