利用犰狳实现Mex函数的快速科学计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用犰狳实现Mex函数的快速科学计算相关的知识,希望对你有一定的参考价值。
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.
#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 expecting if( 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; }
以上是关于利用犰狳实现Mex函数的快速科学计算的主要内容,如果未能解决你的问题,请参考以下文章
在 Ubuntu 14.04 和 matlab 2014Ra 上使用犰狳在 mex 中出现分段错误
用于在 Windows 中的犰狳中构建 armaMex_demo.cpp 的 Matlab mex 命令
如何传递 matlab::data::TypedArray<double> 作为指针在 MATLAB mex 文件中构造犰狳矩阵?