Many years ago, I used a system called Yorick for doing array calculations. One feature that was really useful was a series of functions for taking differences and sums *within* a vector. Ref: Yorick User Manual

The simplest operation to explain is “difference”; when applied to a dimension, it produces a result that’s one element shorter and has successive differences.

```
[0, 1, 4, 9, 16, 25] (length 6)
has differences
[1, 3, 5, 7, 9] (length 5)
```

This can be really useful for calculus-y things like “given a list of x values and a list of corresponding y values, estimate the slope as a function of x”.

The almost-inverse of “difference” is “cumulative sum”; when applied to a dimension, it produces a result that’s one element longer and has a running total:

```
[1, 3, 5, 7, 9] (length 5)
has cumulative sums
[0, 1, 4, 9, 16, 25] (length 6)
```

It’s an “almost” inverse because the first element of the cumulative sum is always zero. If this reminds you of “plus C” in integrals, you’re not wrong

My root question: what’s the best way to write these kinds of calculations in Nx?

It’s certainly *possible* to produce tensors (via `Nx.make_diagonal`

etc) that can be multiplied by the input vector to produce these results, but it seems inefficient given the simple nature of the calculations.