Next: , Previous: Mapping, Up: Reducing and Mapping

9.8.3 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 C-x * : and C-x * _ are equivalent to typing C-x * 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. See Grabbing From Buffers.