Go forward to Nesting and Fixed Points. Go backward to Mapping. Go up to Reducing and Mapping.

Reducing
--------

The `V R' (`calc-reduce') [`reduce'] command applies a given binary
operator across all the elements of a vector.  A binary operator is a
function such as `+' or `max' which takes two arguments.  For example,
reducing `+' over a vector computes the sum of the elements of the
vector.  Reducing `-' computes the first element minus each of the
remaining elements.  Reducing `max' computes the maximum element and
so on.  In general, reducing `f' over the vector `[a, b, c, d]'
produces `f(f(f(a, b), c), d)'.

The `I V R' [`rreduce'] command is similar to `V R' except that works
from right to left through the vector.  For example, plain `V R -' on
the vector `[a, b, c, d]' produces `a - b - c - d' but `I V R -' on
the same vector produces `a - (b - (c - d))', or `a - b + c - d'.
This "alternating sum" occurs frequently in power series expansions.

The `V U' (`calc-accumulate') [`accum'] command does an accumulation
operation.  Here Calc does the corresponding reduction operation, but
instead of producing only the final result, it produces a vector of
all the intermediate results.  Accumulating `+' over the vector `[a,
b, c, d]' produces the vector `[a, a + b, a + b + c, a + b + c + d]'.

The `I V U' [`raccum'] command does a right-to-left accumulation.  For
example, `I V U -' on the vector `[a, b, c, d]' produces the vector
`[a - b + c - d, b - c + d, c - d, d]'.

As for `V M', `V R' normally reduces a matrix elementwise.  For
example, given the matrix `[[a, b, c], [d, e, f]]', `V R +' will
compute `a + b + c + d + e + f'.  You can type `V R _' or `V R :' to
modify this behavior.  The `V R _' [`reducea'] command reduces
"across" the matrix; it reduces each row of the matrix as a vector,
then collects the results.  Thus `V R _ +' of this matrix would
produce `[a + b + c, d + e + f]'.  Similarly, `V R :' [`reduced']
reduces down; `V R : +' would produce `[a + d, b + e, c + f]'.

There is a third "by rows" mode for reduction that is occasionally
useful; `V R =' [`reducer'] simply reduces the operator over the rows
of the matrix themselves.  Thus `V R = +' on the above matrix would
get the same result as `V R : +', since adding two row vectors is
equivalent to adding their elements.  But `V R = *' would multiply the
two rows (to get a single number, their dot product), while `V R : *'
would produce a vector of the products of the columns.

These three matrix reduction modes work with `V R' and `I V R', but
they are not currently supported with `V U' or `I V U'.

The obsolete reduce-by-columns function, `reducec', is still supported
but there is no way to get it through the `V R' command.

The commands `M-# :' and `M-# _' are equivalent to typing `M-# r' to
grab a rectangle of data into Calc, and then typing `V R : +' or `V R
_ +', respectively, to sum the columns or rows of the matrix.  *Note
Grabbing From Buffers::.