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.