Code covered by the BSD License  

Highlights from
slatec

from slatec by Ben Barrowes
The slatec library converted into matlab functions.

[t,jhigh,k,indexmlv,x,ileft,vnikx,work,iwork]=bspvn(t,jhigh,k,indexmlv,x,ileft,vnikx,work,iwork);
function [t,jhigh,k,indexmlv,x,ileft,vnikx,work,iwork]=bspvn(t,jhigh,k,indexmlv,x,ileft,vnikx,work,iwork);
%***BEGIN PROLOGUE  BSPVN
%***PURPOSE  Calculate the value of all (possibly) nonzero basis
%            functions at X.
%***LIBRARY   SLATEC
%***CATEGORY  E3, K6
%***TYPE      SINGLE PRECISION (BSPVN-S, DBSPVN-D)
%***KEYWORDS  EVALUATION OF B-SPLINE
%***AUTHOR  Amos, D. E., (SNLA)
%***DESCRIPTION
%
%     Written by Carl de Boor and modified by D. E. Amos
%
%     Abstract
%         BSPVN is the BSPLVN routine of the reference.
%
%         BSPVN calculates the value of all (possibly) nonzero basis
%         functions at X of order MAX(JHIGH,(J+1)*(INDEX-1)), where
%         T(K) .LE. X .LE. T(N+1) and J=IWORK is set inside the routine
%         on the first call when INDEX=1.  ILEFT is such that T(ILEFT)
%         .LE. X .LT. T(ILEFT+1).  A call to INTRV(T,N+1,X,ILO,ILEFT,
%         MFLAG) produces the proper ILEFT.  BSPVN calculates using the
%         basic algorithm needed in BSPVD.  If only basis functions are
%         desired, setting JHIGH=K and INDEX=1 can be faster than
%         calling BSPVD, but extra coding is required for derivatives
%         (INDEX=2) and BSPVD is set up for this purpose.
%
%         Left limiting values are set up as described in BSPVD.
%
%     Description of Arguments
%         Input
%          T       - knot vector of length N+K, where
%                    N = number of B-spline basis functions
%                    N = sum of knot multiplicities-K
%          JHIGH   - order of B-spline, 1 .LE. JHIGH .LE. K
%          K       - highest possible order
%          INDEX   - INDEX = 1 gives basis functions of order JHIGH
%                          = 2 denotes previous entry with WORK, IWORK
%                              values saved for subsequent calls to
%                              BSPVN.
%          X       - argument of basis functions,
%                    T(K) .LE. X .LE. T(N+1)
%          ILEFT   - largest integer such that
%                    T(ILEFT) .LE. X .LT. T(ILEFT+1)
%
%         Output
%          VNIKX   - vector of length K for spline values.
%          WORK    - a work vector of length 2*K
%          IWORK   - a work parameter.  Both WORK and IWORK contain
%                    information necessary to continue for INDEX = 2.
%                    When INDEX = 1 exclusively, these are scratch
%                    variables and can be used for other purposes.
%
%     Error Conditions
%         Improper input is a fatal error.
%
%***REFERENCES  Carl de Boor, Package for calculating with B-splines,
%                 SIAM Journal on Numerical Analysis 14, 3 (June 1977),
%                 pp. 441-472.
%***ROUTINES CALLED  XERMSG
%***REVISION HISTORY  (YYMMDD)
%   800901  DATE WRITTEN
%   890831  Modified array declarations.  (WRB)
%   890831  REVISION DATE from Version 3.2
%   891214  Prologue converted to Version 4.0 format.  (BAB)
%   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
%   900326  Removed duplicate information from DESCRIPTION section.
%           (WRB)
%   920501  Reformatted the REFERENCES section.  (WRB)
%***end PROLOGUE  BSPVN
%
persistent imjp1 ipj jp1 jp1ml l vm vmprev ; 

if isempty(imjp1), imjp1=0; end;
if isempty(ipj), ipj=0; end;
if isempty(jp1), jp1=0; end;
if isempty(jp1ml), jp1ml=0; end;
if isempty(l), l=0; end;
if isempty(vm), vm=0; end;
if isempty(vmprev), vmprev=0; end;
%     DIMENSION T(ILEFT+JHIGH)
t_shape=size(t);t=reshape(t,1,[]);
vnikx_shape=size(vnikx);vnikx=reshape(vnikx,1,[]);
work_shape=size(work);work=reshape(work,1,[]);
%     CONTENT OF J, DELTAM, DELTAP IS EXPECTED UNCHANGED BETWEEN CALLS.
%     WORK(I) = DELTAP(I), WORK(K+I) = DELTAM(I), I = 1,K
%***FIRST EXECUTABLE STATEMENT  BSPVN
if( k<1 )
%
%
xermsg('SLATEC','BSPVN','K DOES NOT SATISFY K.GE.1',2,1);
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
elseif( jhigh>k || jhigh<1 ) ;
xermsg('SLATEC','BSPVN','JHIGH DOES NOT SATISFY 1.LE.JHIGH.LE.K',2,1);
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
elseif( indexmlv<1 || indexmlv>2 ) ;
xermsg('SLATEC','BSPVN','INDEX IS NOT 1 OR 2',2,1);
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
else;
if( x<t(ileft) || x>t(ileft+1) )
xermsg('SLATEC','BSPVN','X DOES NOT SATISFY T(ILEFT).LE.X.LE.T(ILEFT+1)',2,1);
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
else;
if( indexmlv~=2 )
iwork = 1;
vnikx(1) = 1.0e0;
if( iwork>=jhigh )
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
end;
end;
%
while (1);
ipj = fix(ileft + iwork);
work(iwork) = t(ipj) - x;
imjp1 = fix(ileft - iwork + 1);
work(k+iwork) = x - t(imjp1);
vmprev = 0.0e0;
jp1 = fix(iwork + 1);
for l = 1 : iwork;
jp1ml = fix(jp1 - l);
vm = vnikx(l)./(work(l)+work(k+jp1ml));
vnikx(l) = vm.*work(l) + vmprev;
vmprev = vm.*work(k+jp1ml);
end; l = fix(iwork+1);
vnikx(jp1) = vmprev;
iwork = fix(jp1);
if( iwork>=jhigh )
break;
end;
%20
end;
end;
%
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
return;
end;
t_shape=zeros(t_shape);t_shape(:)=t(1:numel(t_shape));t=t_shape;
vnikx_shape=zeros(vnikx_shape);vnikx_shape(:)=vnikx(1:numel(vnikx_shape));vnikx=vnikx_shape;
work_shape=zeros(work_shape);work_shape(:)=work(1:numel(work_shape));work=work_shape;
end %subroutine bspvn
%DECK BSQAD

Contact us