diff --git a/ms-sbvar/mex/mex_write_to_matlab.c b/ms-sbvar/mex/mex_write_to_matlab.c new file mode 100644 index 000000000..7f188786d --- /dev/null +++ b/ms-sbvar/mex/mex_write_to_matlab.c @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2011 Dynare Team + * + * This file is part of Dynare. + * + * Dynare 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 3 of the License, or + * (at your option) any later version. + * + * Dynare 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 Dynare. If not, see . + */ + +#include +#include + +#include "modify_for_mex.h" + +void +mex_write_to_matlab_matfile(double *data, int rows, int cols, const char *varname, const char *filename) +{ + mxArray *toWrite; + toWrite = getMxArray(data, rows, cols); + MATFile *matfile = matOpen(filename, "w"); + if (matfile == NULL) + mexErrMsgTxt("Error encountered in mex when opening a .mat file"); + + if (matPutVariable(matfile, varname, toWrite) != 0 || + ferror(matGetFp(matfile)) > 0 || + feof(matGetFp(matfile)) > 0) + mexErrMsgTxt("Error encountered in mex when writing a .mat file"); + + if (matClose(matfile) != 0) + mexErrMsgTxt("Error encountered in mex when closing a .mat file"); +} + +void +mex_write_to_matlab_global_struct(double *data, int rows, int cols, const char *varname) +{ + mxArray *toWrite; + toWrite = getMxArray(data, rows, cols); + + int fieldnumber = mxAddField(globalMatlabStruct, varname); + if (fieldnumber < 0) + mexErrMsgTxt("Error encountered in mex when assigining to global structure"); + mxSetFieldByNumber(globalMatlabStruct, 0, fieldnumber, toWrite); +} + +mxArray * +getMxArray(double *data, int rows, int cols) +{ + mxArray *mat; + double *pind; + int i; + + if (rows == 1 && cols == 1) + mat = mxCreateDoubleScalar(data[0]); + else + { + mat = mxCreateDoubleMatrix(rows, cols, mxREAL); + if (mat != NULL) + { + pind = mxGetPr(mat); + for (i = 0; i < rows*cols; i++) + pind[i] = data[i]; + } + } + if (mat == NULL) + mexErrMsgTxt("Error encountered in mex: not enough heap space to allocate memory for mxArray"); + return mat; +} diff --git a/ms-sbvar/mex/modify_for_mex.h b/ms-sbvar/mex/modify_for_mex.h index f0fe5edf6..3c66102c8 100644 --- a/ms-sbvar/mex/modify_for_mex.h +++ b/ms-sbvar/mex/modify_for_mex.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Dynare Team + * Copyright (C) 2010-2011 Dynare Team * * This file is part of Dynare. * @@ -19,34 +19,43 @@ #ifndef _MEXMOD #define _MEXMOD + void swz_exit(int status); void swz_fprintf_err(const char * str, ...); extern int constant_seed; -#endif +#endif #if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE) - #include #include #include +#include #define swzMalloc mxMalloc #define swzCalloc mxCalloc #define swzRealloc mxRealloc #define swzFree mxFree +mxArray *globalMatlabStruct; + +#ifndef _MEXWRITE +#define _MEXWRITE + +void mex_write_to_matlab_matfile(double *, int, int, const char *, const char *); +void mex_write_to_matlab_global_struct(double *, int, int, const char *); +mxArray *getMxArray(double *, int, int); + +#endif #else - #define swz_fprintf_stdout printf #define swzMalloc malloc #define swzCalloc calloc #define swzRealloc realloc #define swzFree free - #endif