/* Copyright (C) 2002 Kai Habel
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <octave/oct.h>
#include <octave/f77-fcn.h>
// SLATEC/PCHIP function not in libcruft
extern "C" {
extern int F77_FUNC (dpchim, DPCHIM)
(const int &n, double *x, double *f,
double *d, const int &incfd, int *ierr);
}
DEFUN_DLD(pchip_deriv, args, ,"\
pchip_deriv(x,y):\n\
wrapper for SLATEC/PCHIP function DPCHIM to calculate derivates for\n\
piecewise polynomials. You shouldn't use pchip_deriv, use pchip instead.\n\
")
{
octave_value_list retval;
const int nargin = args.length();
if (nargin == 2)
{
ColumnVector xvec(args(0).vector_value());
Matrix ymat(args(1).matrix_value());
int nx = xvec.length();
int nyr = ymat.rows();
int nyc = ymat.columns();
if (nx != nyr)
{
error("number of rows for x and y must match");
return retval;
}
ColumnVector dvec(nx),yvec(nx);
Matrix dmat(nyr,nyc);
int ierr;
const int incfd = 1;
for (int c=0; c<nyc; c++)
{
for (int r=0; r<nx; r++)
{
yvec(r) = ymat(r,c);
}
F77_FUNC (dpchim, DPCHIM) (nx, xvec.fortran_vec(), yvec.fortran_vec(), dvec.fortran_vec(), incfd, &ierr);
if (ierr < 0)
{
error ("DPCHIM error: %i\n",ierr);
return retval;
}
for (int r=0; r<nx; r++)
{
dmat(r,c) = dvec(r);
}
}
retval(0) = dmat;
}
return retval;
}
syntax highlighted by Code2HTML, v. 0.9.1