//
// Matlab MEX interface for KD-tree C++ functions
//
// Written by Alex Ihler and Mike Mandel
// Copyright (C) 2003 Alexander Ihler; distributable under GPL -- see README.txt
//
#define MEX
#include <math.h>
#include "mex.h"
#include "cpp/BallTreeDensity.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
// verify arguments
if (nrhs != 2)
mexErrMsgTxt("Takes 2 input arguments");
if (nlhs != 0)
mexErrMsgTxt("Outputs no results; modifies passed kde by reference.");
BallTreeDensity densTree = BallTreeDensity(prhs[0]);
int N = mxGetN(prhs[1]);
int M = mxGetM(prhs[1]);
if (N != densTree.Npts() && N != 1)
mexErrMsgTxt("Wrong number of bandwidths");
if (M != densTree.Ndim())
mexErrMsgTxt("Wrong dimension for bandwidths");
double* newBWs = mxGetPr(prhs[1]);
if(densTree.getType() == BallTreeDensity::Gaussian) {
double *newBWtmp = newBWs;
newBWs = new double[M*N];
for(BallTree::index i=0; i<M*N; i++)
newBWs[i] = newBWtmp[i]*newBWtmp[i];
}
bool result;
result = densTree.updateBW(newBWs, N);
if(densTree.getType() == BallTreeDensity::Gaussian)
delete[] newBWs;
if (!result)
mexErrMsgTxt("Can't change between uniform and non-uniform bandwidths");
}