snipplrCallback({"id":22114,"title":"fast-scientific-computation-in-mex-functions-using-armadillo","source":"
#include "mex.h"<\/span><\/div><\/li> #include "math.h"<\/span><\/div><\/li> #include<armadillo><\/span><\/div><\/li> <\/div><\/li> using<\/span> namespace<\/span> arma;<\/span><\/div><\/li> <\/div><\/li> void<\/span> matlab2arma(<\/span>mat&<\/span> A, const<\/span> mxArray *<\/span>mxdata)<\/span>{<\/span><\/div><\/li> \/\/ delete [] A.mem; \/\/ don't do this!<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.mem<\/span>)<\/span>=<\/span>mxGetPr(<\/span>mxdata)<\/span>;<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_rows<\/span>)<\/span>=<\/span>mxGetM(<\/span>mxdata)<\/span>;<\/span> \/\/ transposed!<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_cols<\/span>)<\/span>=<\/span>mxGetN(<\/span>mxdata)<\/span>;<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_elem<\/span>)<\/span>=<\/span>A.n_rows<\/span>*<\/span>A.n_cols<\/span>;<\/span><\/div><\/li> }<\/span>;<\/span><\/div><\/li> <\/div><\/li> void<\/span> freeVar(<\/span>mat&<\/span> A, const<\/span> double<\/span> *<\/span>ptr)<\/span>{<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.mem<\/span>)<\/span>=<\/span>ptr;<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_rows<\/span>)<\/span>=<\/span>1<\/span>;<\/span> \/\/ transposed!<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_cols<\/span>)<\/span>=<\/span>1<\/span>;<\/span><\/div><\/li> access::<\/span>rw<\/span>(<\/span>A.n_elem<\/span>)<\/span>=<\/span>1<\/span>;<\/span><\/div><\/li> }<\/span>;<\/span><\/div><\/li> <\/div><\/li> void<\/span> mexFunction(<\/span>int<\/span> nlhs, mxArray *<\/span>plhs[<\/span>]<\/span>, int<\/span> nrhs, const<\/span> mxArray *<\/span>prhs[<\/span>]<\/span>)<\/span><\/div><\/li> {<\/span><\/div><\/li> if<\/span> (<\/span>nrhs !<\/span>=<\/span> 2<\/span>)<\/span><\/div><\/li> mexErrMsgTxt(<\/span>"Incorrect number of input arguments"<\/span>)<\/span>;<\/span><\/div><\/li> if<\/span> (<\/span>nlhs !<\/span>=<\/span> 1<\/span>)<\/span><\/div><\/li> mexErrMsgTxt(<\/span>"Incorrect number of output arguments"<\/span>)<\/span>;<\/span><\/div><\/li> <\/div><\/li> mat D1(<\/span>1<\/span>,1<\/span>)<\/span>;<\/span><\/div><\/li> const<\/span> double<\/span>*<\/span> D1mem=<\/span>access::<\/span>rw<\/span>(<\/span>D1.mem<\/span>)<\/span>;<\/span><\/div><\/li> matlab2arma(<\/span>D1,prhs[<\/span>0<\/span>]<\/span>)<\/span>;<\/span> \/\/ First create the matrix, then change it to point to the matlab data.<\/span><\/div><\/li> <\/div><\/li> mat D2(<\/span>1<\/span>,1<\/span>)<\/span>;<\/span><\/div><\/li> const<\/span> double<\/span>*<\/span> D2mem=<\/span>access::<\/span>rw<\/span>(<\/span>D2.mem<\/span>)<\/span>;<\/span><\/div><\/li> matlab2arma(<\/span>D2,prhs[<\/span>1<\/span>]<\/span>)<\/span>;<\/span><\/div><\/li> <\/div><\/li> \/\/ check if the input corresponds to what you are expecting<\/span><\/div><\/li> if<\/span>(<\/span> D1.n_rows<\/span> !<\/span>