我想知道是否有人有从 C++ .lib 文件创建 mex 文件的经验。我得到了一个 .lib 及其相应的 .h 文件,并且需要使 .lib 可从 Matlab 调用。
旁注:因为 c++ 文件是 .lib,所以我看不到 .lib 文件的实现,但我能够进行其 .h 中定义的调用。
您的 .lib 很可能不支持 Matlab 格式,因此您必须制作包装函数。这是一个小例子(其中 addMat() 可以是 .lib 中的函数)
#include "mex.h"
//#include "Your_lib.h"
// Your local C++ function
void addMat( double *in1, double *in2, double *out, int R, int C)
{
for (int n=0; n<R*C; n++)
{
out[n] = in1[n]+in2[n];
}
}
// The Matlab wrapper
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *inMat1,*inMat2,*outMat;
mwSize R,C;
// Pointer to an mxArray of type double
inMat1 = mxGetPr(prhs[0]);
inMat2 = mxGetPr(prhs[1]);
// Get size (assume both are the same as 1st arg)
R = mxGetM(prhs[0]);
C = mxGetN(prhs[0]);
// Create an real output mxArray of size [R,C]
plhs[0] = mxCreateDoubleMatrix(R,C,mxREAL);
outMat = mxGetPr(plhs[0]);
// Call your own function or lib
addMat(inMat1,inMat2,outMat,R,C);
}
如果您的包装文件名为
addMat.cpp
那么您可以将其编译为
mex addMat.cpp
它会生成一个mex文件,在Matlab中运行它:
A=addMat([1 2 3;1 1 1],[10 11 12; 2 2 2])
A =
11 13 15
3 3 3
带有外部库的构建命令应该类似于
mex -I<include dir> -L<lib dir> -l<your lib>.lib addMat.cpp