# Analog of \`diff\` operator for adjacent sum

**URL:** <https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025>\
**Category:** General Usage\
**Created:** [July 10, 2022, 9:23pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025 "2022-07-10T21:23:38Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![v715](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/v715/32/37202_2.png) [@v715](https://discourse.julialang.org/u/v715)\
**Post date:** [July 10, 2022, 9:23pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/1 "2022-07-10T21:23:38Z")

</div>

I want to return the sum of adjacent elements in an array, ie, a function `sumadj` that produces

```julia
julia> a = [2, 3, 4]

julia> sumadj(a)
2-element Vector{Int64}:
 5
 7

```

`diff` computes the difference between adjacent pairs of elements in an array, but I want an analog that computes the sum.

Also looking for a solution that doesn’t use a `for` loop because I need it to work on a GPU with CUDA.jl, which doesn’t allow indexing.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [July 10, 2022, 9:31pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/2 "2022-07-10T21:31:12Z")

</div>

```julia
julia> function adjsum(ary)
           ary1 = @view ary[begin:end-1]
           ary2 = @view ary[begin+1:end]
           ary1 + ary2
       end
adjsum (generic function with 1 method)

julia> adjsum([2, 3, 4])
2-element Vector{Int64}:
 5
 7

```

---

<div class="post-metadata">

**Author:** ![v715](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/v715/32/37202_2.png) [@v715](https://discourse.julialang.org/u/v715)\
**Post date:** [July 10, 2022, 9:40pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/4 "2022-07-10T21:40:34Z")

</div>

Awesome, thank you! Didn’t know about `view`s, cool tip

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [July 11, 2022, 7:20am UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/5 "2022-07-11T07:20:09Z")

</div>

> [@jling](#):
>
> ```julia
> function adjsum(ary)
> ary1 = @view ary[begin:end-1]
> ary2 = @view ary[begin+1:end]
> ary1 + ary2
> end
> 
> ```

More compact to write:

```julia
@views adjsum(a) = a[begin:end-1] + a[begin+1:end]

```

Using the `@views` macro you can opt-in to views for slices for a whole function at once.

---

<div class="post-metadata">

**Author:** ![ericphanson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ericphanson/32/215186_2.png) [@ericphanson](https://discourse.julialang.org/u/ericphanson)\
**Post date:** [July 11, 2022, 11:43am UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/6 "2022-07-11T11:43:03Z")

</div>

> [@v715](#):
>
> `diff` computes the difference between adjacent pairs of elements in an array, but I want an analog that computes the sum.

I couldn’t resist:

```julia
julia> struct AddOnly{T}
           x::T
       end

julia> Base.:(-)(x::AddOnly, y::AddOnly) = x.x + y.x

julia> a = AddOnly.([2, 3, 4])
3-element Vector{AddOnly{Int64}}:
 AddOnly{Int64}(2)
 AddOnly{Int64}(3)
 AddOnly{Int64}(4)

julia> diff(a)
2-element Vector{Int64}:
 5
 7

```

😄

(note this is a bad idea: defining a method of `-` that has a different meaning from that of the overall function is bad practice and can lead to bugs).

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [July 11, 2022, 12:23pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/7 "2022-07-11T12:23:53Z")

</div>

You could also just write a loop.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [July 11, 2022, 12:44pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/8 "2022-07-11T12:44:26Z")

</div>

Did you read the OP? don’t want an explicit loop because they want to use it on CUDA areay

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [July 11, 2022, 12:50pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/9 "2022-07-11T12:50:55Z")

</div>

I read it, but that was yesterday, so I forgot.

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [July 11, 2022, 1:00pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/10 "2022-07-11T13:00:37Z")

</div>

Taking into account that the addition operation is associative, it might make sense to deal with the more general case of the sum of n adjacent elements.

```julia

using IterTools

a = [2, 3, 4]

sumadj(v,n) = sum.(partition(v,n,1))

sumadj(a,2)

```

---

<div class="post-metadata">

**Author:** ![abobroff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abobroff/32/3752_2.png) [@abobroff](https://discourse.julialang.org/u/abobroff)\
**Post date:** [July 11, 2022, 1:34pm UTC](https://discourse.julialang.org/t/analog-of-diff-operator-for-adjacent-sum/84025/11 "2022-07-11T13:34:51Z")

</div>

using DSP  
conv(a,[1,1])[2:end-1]
