snipplrCallback({"title":"Mex Function for Mahalanobis Function","source":"<pre class=\"cpp cpp\" style=\"font-family:monospace;\"><ol><li class=\"li1\"><div class=\"de1\"><span class=\"co2\">#include &quot;mex.h&quot;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"co2\">#include &quot;math.h&quot;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"co2\">#include&lt;armadillo&gt; <\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"kw2\">using<\/span> <span class=\"kw2\">namespace<\/span> arma;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"kw4\">void<\/span> importMatlab<span class=\"br0\">&#40;<\/span>mat<span class=\"sy3\">&amp;<\/span> A, <span class=\"kw4\">const<\/span> mxArray <span class=\"sy2\">*<\/span>mxdata<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">mem<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>mxGetPr<span class=\"br0\">&#40;<\/span>mxdata<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_rows<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>mxGetM<span class=\"br0\">&#40;<\/span>mxdata<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_cols<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>mxGetN<span class=\"br0\">&#40;<\/span>mxdata<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_elem<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>A.<span class=\"me1\">n_rows<\/span><span class=\"sy2\">*<\/span>A.<span class=\"me1\">n_cols<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"br0\">&#125;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"kw4\">void<\/span> freeVar<span class=\"br0\">&#40;<\/span>mat<span class=\"sy3\">&amp;<\/span> A, <span class=\"kw4\">const<\/span> <span class=\"kw4\">double<\/span> <span class=\"sy2\">*<\/span>ptr<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">mem<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>ptr;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_rows<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span><span class=\"nu0\">1<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_cols<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span><span class=\"nu0\">1<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>A.<span class=\"me1\">n_elem<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span><span class=\"nu0\">1<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"br0\">&#125;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"kw4\">void<\/span> mexFunction<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> nlhs, mxArray <span class=\"sy2\">*<\/span>plhs<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span>, <span class=\"kw4\">int<\/span> nrhs, <span class=\"kw4\">const<\/span> mxArray <span class=\"sy2\">*<\/span>prhs<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"br0\">&#123;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>nrhs <span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">        mexErrMsgTxt<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Incorrect number of input arguments&quot;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>nlhs <span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">        mexErrMsgTxt<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Incorrect number of D arguments&quot;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  mat X<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  <span class=\"kw4\">const<\/span> <span class=\"kw4\">double<\/span><span class=\"sy2\">*<\/span> Xmem<span class=\"sy1\">=<\/span>access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>X.<span class=\"me1\">mem<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  importMatlab<span class=\"br0\">&#40;<\/span>X,prhs<span class=\"br0\">&#91;<\/span><span class=\"nu19\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  mat Y<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  <span class=\"kw4\">const<\/span> <span class=\"kw4\">double<\/span><span class=\"sy2\">*<\/span> Ymem<span class=\"sy1\">=<\/span>access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>Y.<span class=\"me1\">mem<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  importMatlab<span class=\"br0\">&#40;<\/span>Y,prhs<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  mat W<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  <span class=\"kw4\">const<\/span> <span class=\"kw4\">double<\/span><span class=\"sy2\">*<\/span> Wmem<span class=\"sy1\">=<\/span>access<span class=\"sy4\">::<\/span><span class=\"me2\">rw<\/span><span class=\"br0\">&#40;<\/span>W.<span class=\"me1\">mem<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">  importMatlab<span class=\"br0\">&#40;<\/span>W,prhs<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"co1\">\/\/    check if the input corresponds to what you are expecting<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">  <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span> X.<span class=\"me1\">n_cols<\/span> <span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>  Y.<span class=\"me1\">n_cols<\/span> <span class=\"br0\">&#41;<\/span> || <span class=\"br0\">&#40;<\/span>Y.<span class=\"me1\">n_cols<\/span> <span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span> W.<span class=\"me1\">n_cols<\/span> <span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">    mexErrMsgTxt<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Columns of X, Y, and W must be of equal length!&quot;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">   <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> W.<span class=\"me1\">n_rows<\/span> <span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>  W.<span class=\"me1\">n_cols<\/span> <span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">    mexErrMsgTxt<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;W must be a square matrix!&quot;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    plhs<span class=\"br0\">&#91;<\/span><span class=\"nu19\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">=<\/span> mxCreateDoubleMatrix<span class=\"br0\">&#40;<\/span>X.<span class=\"me1\">n_rows<\/span>, Y.<span class=\"me1\">n_rows<\/span>, mxREAL<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw4\">double<\/span> <span class=\"sy2\">*<\/span>out <span class=\"sy1\">=<\/span> mxGetPr<span class=\"br0\">&#40;<\/span>plhs<span class=\"br0\">&#91;<\/span><span class=\"nu19\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    mat diff;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    mat M;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw4\">int<\/span> k<span class=\"sy1\">=<\/span><span class=\"nu19\">0<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> y<span class=\"sy1\">=<\/span><span class=\"nu19\">0<\/span>;y<span class=\"sy1\">&lt;<\/span>Y.<span class=\"me1\">n_rows<\/span>;y<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">      <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x<span class=\"sy1\">=<\/span><span class=\"nu19\">0<\/span>;x<span class=\"sy1\">&lt;<\/span>X.<span class=\"me1\">n_rows<\/span>;x<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"co1\">\/\/ (X(x,:)-Y(y,:))*W*((X(x,:)-Y(y,:))')<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">            diff<span class=\"sy1\">=<\/span>X.<span class=\"me1\">row<\/span><span class=\"br0\">&#40;<\/span>x<span class=\"br0\">&#41;<\/span><span class=\"sy2\">-<\/span>Y.<span class=\"me1\">row<\/span><span class=\"br0\">&#40;<\/span>y<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">            M<span class=\"sy1\">=<\/span>diff<span class=\"sy2\">*<\/span>W<span class=\"sy2\">*<\/span>trans<span class=\"br0\">&#40;<\/span>diff<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">            <span class=\"br0\">&#40;<\/span><span class=\"sy2\">*<\/span>out<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">=<\/span>M<span class=\"br0\">&#40;<\/span><span class=\"nu19\">0<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">        <span class=\"br0\">&#125;<\/span><\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">&nbsp;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    freeVar<span class=\"br0\">&#40;<\/span>X,Xmem<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    freeVar<span class=\"br0\">&#40;<\/span>Y,Ymem<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    freeVar<span class=\"br0\">&#40;<\/span>W,Wmem<span class=\"br0\">&#41;<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\">    <span class=\"kw1\">return<\/span>;<\/div><\/li><li class=\"li1\"><div class=\"de1\"><span class=\"br0\">&#125;<\/span><\/div><\/li><\/ol><\/pre>","link":"http:\/\/snipplr.com\/view\/22115\/mex-function-for-mahalanobis-function\/","id":"22115"});
