For more information including compatibility, examples and test cases, see https://github.com/petercrlane/r7rs-libs

0.1. Array Interpolation: (import (slib array-interpolate))

This library provides two functions to obtain interpolated values or arrays formed from interpolated values of a source array.

0.1.1. interpolate-array-ref

interpolate-array-ref takes an array and a sequence of index positions as real numbers. This is very similar to array-ref, however the index positions need not be integers and so define a point within the array. The function returns an interpolated value based on the coordinates nearest to that point.

For example:

> (define arr (list->array 2 #() '((1 2 3) (4 5 6))))
> (interpolate-array-ref arr 1 0.1)
4.1

The call to interpolate-array-ref selects the row of index 1, which is (4 5 6), and position 0.1 within that row. The value returned is (+ (* 0.9 4) (* 0.1 5)) = 4.1, the intermediate value between 4 and 5 lying a tenth of the way from 4.

Similarly:

> (define arr (list->array 2 #() '((1 2 3) (4 5 6))))
> (interpolate-array-ref arr 0.5 0.25)
2.75

The first index is mid-way between rows index 0 and index 1, and the second index is between the columns index 0 and index 1.

The interpolated value is calculated as:

  1. (+ (* 0.75 4) (* 0.25 5)) = 4.25, a quarter of the way between the 4 and 5 (columns 0 and 1 in row 1)

  2. (+ (* 0.75 1) (* 0.25 2)) = 1.25, a quarter of the way between the 1 and 2 (columns 0 and 1 in row 2)

  3. (+ (* 0.5 4.25) (* 0.5 1.25)) = 2.75, midway between these two values (rows 1 and 2)

0.1.2. resample-array!

resample-array! takes two arrays of equal rank but unequal dimension. The first array is filled with values formed by interpolating its values from the second array.

> (define arr1 (list->array 2 #() '((1 2 3 4) (5 6 7 8))))
> (define arr2 (make-array #() 2 3))
> (array->list arr2)
((0 0 0) (0 0 0))
> (resample-array! arr2 arr1)
> (array->list arr2)
((1 5/2 4) (5 13/2 8))

The interpolation process retains the outer corners. So arr2 preserves the 1, 4, 5 and 8 in its corners. The value of 5/2 in the first row is obtained from the middle value of the first row, computed as: (interpolate-array-ref arr1 0 1.5)