2.3.6 Numbering a dimension from its last element
Array index values are subtly asymmetric: An index of 1 represents the
first element, 2 represents the second element, 3 the third, and so on.
In order to refer to the last, or next to last, or any element relative
to the final element, you apparently need to find out the length of the
dimension.
In order to remedy this asymmetry, Yorick interprets numbers less than 1
relative to the final element of an array. Hence, x(1) and
x(2) are the first and second elements of x, while
x(0) and x(-1) are the last and next to last elements, and
so on.
With this convention for negative indices, many Yorick programs can
be written without the need to determine the length of a dimension:
| deriv = (f(3:0)-f(1:-2)) / (x(3:0)-x(1:-2));
|
computes a point-centered estimate of the derivative of a function
f with values known at points x. (A better way to compute
this derivative is to use the pcen and dif range functions
described below. See section Rank preserving (finite difference) range functions.)
In this example, the extra effort required to compute the array length
would be slight:
| n = numberof(f);
deriv = (f(3:n)-f(1:n-2)) / (x(3:n)-x(1:n-2));
|
However, using the negative index convention produces faster code, and
generalizes to multi-dimensional cases in an obvious way.
The negative index convention works for scalar index values and for the
start or stop field of an index range (as in the example). Dealing with
negative indices in an index list would slow the code down too much, so
the values in an index list may not be zero or negative.
|