#include #include #include #include #include #include #include #define dllexport __declspec(dllexport) extern "C"{ dllexport VARIANT _stdcall CheckAndRetVariant(VARIANT X) { VARIANT dvout; switch(X.vt) { case VT_DISPATCH: { EXCEPINFO excep; DISPPARAMS dispparams; unsigned int uiArgErr; DISPID dispidValue; LPOLESTR XName = L"Value"; X.pdispVal->GetIDsOfNames(IID_NULL, &XName, 1, LOCALE_SYSTEM_DEFAULT, &dispidValue); // PropertyGet has no arguments dispparams.cArgs = 0; dispparams.cNamedArgs = 0; // Invoke PropertyGet and store values in vSource X.pdispVal->Invoke(dispidValue, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &dvout, &excep, &uiArgErr); X.pdispVal->Release(); return dvout; } break; default: return X; break; } VariantClear(&dvout); VariantClear(&X); } dllexport double _stdcall NormDist(double x, double Std) { double pi = 3.14159265358979; double result = 1/(sqrt(2*pi)*Std)*exp(-(x*x)/(2*Std*Std)); return result; } dllexport VARIANT _stdcall KernelReg(VARIANT Y, VARIANT X, double h) { X = CheckAndRetVariant(X); Y = CheckAndRetVariant(Y); VARIANT varvar; long ncols; long nrows; long ncolsY; long i, j, jx; ncols=(X.parray)->rgsabound[0].cElements; nrows=(X.parray)->rgsabound[1].cElements; ncolsY=(Y.parray)->rgsabound[0].cElements; double *ArrayX = new double [nrows*ncols]; double *ArrayY = new double [nrows*ncolsY]; for (i=0; irgsabound[0].cElements; Ndat=(X.parray)->rgsabound[1].cElements; n=(Yat.parray)->rgsabound[1].cElements; double *ArrayX = new double [Ndat*v]; double *dXat = new double [n*v]; double *dYat = new double [n]; for(i=0; irgsabound[0].cElements; nrows=(X.parray)->rgsabound[1].cElements; ncolsY=(Y.parray)->rgsabound[0].cElements; double *ArrayX = new double [nrows*ncols]; double *ArrayY = new double [nrows*ncolsY]; for (i=0; i