# Posted By

benjamin on 10/29/09

# Statistics

Viewed 526 times
Favorited by 0 user(s)

# Fast Scientific Computation in Mex Functions Using Armadillo

/ Published in: C++
Save to your folder(s)

This code is a demonstration of how to do fast scientific computation in mex functions using the armadillo library. See my blog post for details and leave comments there.

Copy this code and paste it in your HTML
`#include "mex.h"#include "math.h"#include<armadillo> using namespace arma; void matlab2arma(mat& A, const mxArray *mxdata){// delete [] A.mem; // don't do this!access::rw(A.mem)=mxGetPr(mxdata);access::rw(A.n_rows)=mxGetM(mxdata); // transposed!access::rw(A.n_cols)=mxGetN(mxdata);access::rw(A.n_elem)=A.n_rows*A.n_cols;}; void freeVar(mat& A, const double *ptr){access::rw(A.mem)=ptr;access::rw(A.n_rows)=1; // transposed!access::rw(A.n_cols)=1;access::rw(A.n_elem)=1;}; void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){if (nrhs != 2)mexErrMsgTxt("Incorrect number of input arguments");if (nlhs != 1)mexErrMsgTxt("Incorrect number of output arguments"); mat D1(1,1);const double* D1mem=access::rw(D1.mem);matlab2arma(D1,prhs[0]); // First create the matrix, then change it to point to the matlab data. mat D2(1,1);const double* D2mem=access::rw(D2.mem);matlab2arma(D2,prhs[1]); // check if the input corresponds to what you are expectingif( D1.n_rows != D2.n_rows )mexErrMsgTxt("Columns of D1 and D2 must be of equal length!"); if( D1.n_cols != D2.n_cols )mexErrMsgTxt("Rows of D1 and D2 must be of equal length!"); plhs[0] = mxCreateDoubleMatrix(D1.n_rows, D1.n_cols, mxREAL);mat output(1,1);const double* outputmem=access::rw(output.mem);matlab2arma(output,plhs[0]); output=D1+D2;// output.print(); freeVar(D1,D1mem); // Change back the pointers!!freeVar(D2,D2mem);freeVar(output,outputmem);return;}`