snipplrCallback({"id":22114,"title":"fast-scientific-computation-in-mex-functions-using-armadillo","source":"
  1. #include "mex.h"<\/span><\/div><\/li>
  2. #include "math.h"<\/span><\/div><\/li>
  3. #include<armadillo><\/span><\/div><\/li>
  4.  <\/div><\/li>
  5. using<\/span> namespace<\/span> arma;<\/span><\/div><\/li>
  6.  <\/div><\/li>
  7. void<\/span> matlab2arma(<\/span>mat&<\/span> A, const<\/span> mxArray *<\/span>mxdata)<\/span>{<\/span><\/div><\/li>
  8. \/\/ delete [] A.mem; \/\/ don't do this!<\/span><\/div><\/li>
  9. access::<\/span>rw<\/span>(<\/span>A.mem<\/span>)<\/span>=<\/span>mxGetPr(<\/span>mxdata)<\/span>;<\/span><\/div><\/li>
  10. access::<\/span>rw<\/span>(<\/span>A.n_rows<\/span>)<\/span>=<\/span>mxGetM(<\/span>mxdata)<\/span>;<\/span> \/\/ transposed!<\/span><\/div><\/li>
  11. access::<\/span>rw<\/span>(<\/span>A.n_cols<\/span>)<\/span>=<\/span>mxGetN(<\/span>mxdata)<\/span>;<\/span><\/div><\/li>
  12. access::<\/span>rw<\/span>(<\/span>A.n_elem<\/span>)<\/span>=<\/span>A.n_rows<\/span>*<\/span>A.n_cols<\/span>;<\/span><\/div><\/li>
  13. }<\/span>;<\/span><\/div><\/li>
  14.  <\/div><\/li>
  15. void<\/span> freeVar(<\/span>mat&<\/span> A, const<\/span> double<\/span> *<\/span>ptr)<\/span>{<\/span><\/div><\/li>
  16. access::<\/span>rw<\/span>(<\/span>A.mem<\/span>)<\/span>=<\/span>ptr;<\/span><\/div><\/li>
  17. access::<\/span>rw<\/span>(<\/span>A.n_rows<\/span>)<\/span>=<\/span>1<\/span>;<\/span> \/\/ transposed!<\/span><\/div><\/li>
  18. access::<\/span>rw<\/span>(<\/span>A.n_cols<\/span>)<\/span>=<\/span>1<\/span>;<\/span><\/div><\/li>
  19. access::<\/span>rw<\/span>(<\/span>A.n_elem<\/span>)<\/span>=<\/span>1<\/span>;<\/span><\/div><\/li>
  20. }<\/span>;<\/span><\/div><\/li>
  21.  <\/div><\/li>
  22. 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>
  23. {<\/span><\/div><\/li>
  24. if<\/span> (<\/span>nrhs !<\/span>=<\/span> 2<\/span>)<\/span><\/div><\/li>
  25. mexErrMsgTxt(<\/span>"Incorrect number of input arguments"<\/span>)<\/span>;<\/span><\/div><\/li>
  26. if<\/span> (<\/span>nlhs !<\/span>=<\/span> 1<\/span>)<\/span><\/div><\/li>
  27. mexErrMsgTxt(<\/span>"Incorrect number of output arguments"<\/span>)<\/span>;<\/span><\/div><\/li>
  28.  <\/div><\/li>
  29. mat D1(<\/span>1<\/span>,1<\/span>)<\/span>;<\/span><\/div><\/li>
  30. const<\/span> double<\/span>*<\/span> D1mem=<\/span>access::<\/span>rw<\/span>(<\/span>D1.mem<\/span>)<\/span>;<\/span><\/div><\/li>
  31. 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>
  32.  <\/div><\/li>
  33. mat D2(<\/span>1<\/span>,1<\/span>)<\/span>;<\/span><\/div><\/li>
  34. const<\/span> double<\/span>*<\/span> D2mem=<\/span>access::<\/span>rw<\/span>(<\/span>D2.mem<\/span>)<\/span>;<\/span><\/div><\/li>
  35. matlab2arma(<\/span>D2,prhs[<\/span>1<\/span>]<\/span>)<\/span>;<\/span><\/div><\/li>
  36.  <\/div><\/li>
  37. \/\/ check if the input corresponds to what you are expecting<\/span><\/div><\/li>
  38. if<\/span>(<\/span> D1.n_rows<\/span> !<\/span>=<\/span> D2.n_rows<\/span> )<\/span><\/div><\/li>
  39. mexErrMsgTxt(<\/span>"Columns of D1 and D2 must be of equal length!"<\/span>)<\/span>;<\/span><\/div><\/li>
  40.  <\/div><\/li>
  41. if<\/span>(<\/span> D1.n_cols<\/span> !<\/span>=<\/span> D2.n_cols<\/span> )<\/span><\/div><\/li>
  42. mexErrMsgTxt(<\/span>"Rows of D1 and D2 must be of equal length!"<\/span>)<\/span>;<\/span><\/div><\/li>
  43.  <\/div><\/li>
  44. plhs[<\/span>0<\/span>]<\/span> =<\/span> mxCreateDoubleMatrix(<\/span>D1.n_rows<\/span>, D1.n_cols<\/span>, mxREAL)<\/span>;<\/span><\/div><\/li>
  45. mat output(<\/span>1<\/span>,1<\/span>)<\/span>;<\/span><\/div><\/li>
  46. const<\/span> double<\/span>*<\/span> outputmem=<\/span>access::<\/span>rw<\/span>(<\/span>output.mem<\/span>)<\/span>;<\/span><\/div><\/li>
  47. matlab2arma(<\/span>output,plhs[<\/span>0<\/span>]<\/span>)<\/span>;<\/span><\/div><\/li>
  48.  <\/div><\/li>
  49. output=<\/span>D1+<\/span>D2;<\/span><\/div><\/li>
  50. \/\/ output.print();<\/span><\/div><\/li>
  51.  <\/div><\/li>
  52. freeVar(<\/span>D1,D1mem)<\/span>;<\/span> \/\/ Change back the pointers!!<\/span><\/div><\/li>
  53. freeVar(<\/span>D2,D2mem)<\/span>;<\/span><\/div><\/li>
  54. freeVar(<\/span>output,outputmem)<\/span>;<\/span><\/div><\/li>
  55. return<\/span>;<\/span><\/div><\/li>
  56. }<\/span><\/div><\/li><\/ol><\/pre>","link":"https:\/\/snipplr.com\/view\/22114\/fast-scientific-computation-in-mex-functions-using-armadillo"});