Evaluate spline function

provides the value `v`

= fnval(`f`

,`x`

)*f*(*x*) at the points in
`x`

of the spline function *f* whose
description is contained in `f`

.

If `f`

is scalar-valued and univariate, the output
`v`

is obtained by replacing each entry of
`x`

by the value of *f* at that entry.
This is the intent in all other cases, except that, for a
`d`

-valued `m`

-variate function,
`d`

-vectors replaces `m`

-vectors.

For a univariate *f* :

If

*f*is scalar-valued, then*v*is of the same size as`x`

.If

*f*is`[d1,...,dr]`

-valued, and`x`

has size`[n1,...,ns]`

, then`v`

has size`[d1,...,dr, n1,...,ns]`

, with`v(:,...,:, j1,...,js)`

the value of*f*at`x(j1,...,js)`

, – except that:`n1`

is ignored if it is`1`

and`s`

is`2`

, i.e., if`x`

is a row vector;MATLAB

^{®}ignores any trailing singleton dimensions of`x`

.

For an `m`

-variate *f* with
`m>1`

, with *f*
`[d1,...,dr]`

-valued, `x`

might be either an
array, or else a cell array `{x1,...,xm}`

.

If

`x`

is an array, of size`[n1,...,ns]`

, then`n1`

must equal`m`

, and`v`

has size`[d1,...,dr, n2,...,ns]`

, with`v(:,...,:, j2,...,js)`

the value of*f*at`x(:,j2,...,js)`

, – except that:`d1`

, ...,`dr`

is ignored in case*f*is scalar-valued, i.e., both`r`

and`n1`

are`1`

;MATLAB ignores any trailing singleton dimensions of

`x`

.

If

`x`

is a cell array, then it must be of the form`{x1,...,xm}`

, with`xj`

a vector, of length`nj`

, and, in that case,`v`

has size`[d1,...,dr, n1,...,nm]`

, with`v(:,...,:, j1,...,jm)`

the value of*f*at (`x1`

(`j1`

), ...,`xm`

(`jm`

)), – except that`d1`

, ...,`dr`

is ignored in case*f*is scalar-valued, i.e., both`r`

and`n1`

are`1`

.

If *f* has a jump discontinuity at `x`

, then
the value *f*(*x* +), i.e., the limit from the
right, is returned, except when `x`

equals the right end of the
basic interval of the form; for such `x`

, the value
*f*(*x*–), i.e., the limit from the left,
is returned.

`fnval(...,'l')`

treats
*f* as continuous from the left. This means that if
*f* has a jump discontinuity at `x`

, then
the value *f*(*x*–), i.e., the limit from the
left, is returned, except when `x`

equals the left end of the
basic interval; for such `x`

, the value
*f*(*x* +) is returned.

If the function is *multivariate*, then the above statements concerning
continuity from the left and right apply coordinate wise.

For each entry of `x`

, the function determines the relevant
break-interval or knot-interval and assembles the relevant information. Depending on
whether `f`

is in ppform or in B-form, nested multiplication or the
B-spline recurrence (see, e.g., [*PGS*; X.(3)]) are then
used vector-fashion for the simultaneous evaluation at all entries of
`x`

. Evaluation of a multivariate polynomial spline function
takes full advantage of the tensor product structure.

Evaluation of a rational spline follows up evaluation of the corresponding vector-valued spline by division of all but its last component by its last component.

Evaluation of a function in stform makes essential use of `stcol`

, and tries to keep the
matrices involved to reasonable size.