一、环境准备
安装VS2010和MATLAB2012a。
二、编写MATLAB函数
在MATLAB中新建一个函数
function y = myadd( a,b )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
y=a+b
end
保存到e:\temp\myadd.m
三、转换为dll
在MATLAB中分别执行:
mex -setup
mbuild -setup
都选则VS2010的对应选项。
执行:
mcc -W lib:addtest -T link:lib e:\temp\myadd.m -d e:\temp
后可以看到,在e:\temp中生成了若干以addtest命名的文件,分别有.dll .lib .h等
四、在VS中调用
int test_matlab_myadd()
{
addtestInitialize();
static double x1[4] = {1.0, 2.0, 100.5, 200.1};
static double x2[4] = {2.5, 1.3, 200.1, 100.5};
double result[4];
mxArray * A = mxCreateDoubleMatrix(1, 4, mxREAL);
memcpy (mxGetPr(A), &x1, sizeof(double) * 4);
mxArray * B = mxCreateDoubleMatrix(1, 4, mxREAL);
memcpy (mxGetPr(B), &x2, sizeof(double) * 4);
mxArray * C = mxCreateDoubleMatrix(1, 4, mxREAL);
mlfMyadd (1, &C, A, B);
memcpy (&result, mxGetPr(C), sizeof(double) * 4);
std::cout << result[0] <<" " << result[1] <<" " << result[2] <<" " << result[3] <<" " << std::endl;
mxDestroyArray(A);
mxDestroyArray(B);
mxDestroyArray(C);
addtestTerminate();
return 0;
}
五、总结
五、总结
利用类似的方法也可以导出MATLAB中自带的函数。比如norminv函数:在MATLAB中执行: mcc -W lib:norminv -T link:lib norminv.m -d e:\temp在VC中编码
int test_matlab_norminv()
{
norminvInitialize();
static double P = 0.9;
mxArray * mxa_P = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy (mxGetPr(mxa_P), &P, sizeof(double));
static double mu = 0;
mxArray * mxa_mu = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy (mxGetPr(mxa_mu), &mu, sizeof(double));
static double sigma = 1.0;
mxArray * mxa_sigma = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy (mxGetPr(mxa_sigma), &sigma, sizeof(double));
mxArray * mxa_pcov = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy (mxGetPr(mxa_pcov), &sigma, sizeof(double));
mxArray * mxa_alpha = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy (mxGetPr(mxa_alpha), &sigma, sizeof(double));
mxArray * mxa_X = mxCreateDoubleMatrix(1, 1, mxREAL);
/*mxArray * mxa_XLO = mxCreateDoubleMatrix(1, 1, mxREAL);
mxArray * mxa_XUP = mxCreateDoubleMatrix(1, 1, mxREAL);*/
//bool bRes = mlfNorminv (1, &mxa_X, &mxa_XLO, &mxa_XUP, mxa_P, mxa_mu, mxa_sigma, mxa_sigma, mxa_sigma);
bool bRes = mlfNorminv (1, &mxa_X, NULL, NULL, mxa_P, mxa_mu, mxa_sigma, mxa_sigma, mxa_sigma);
double res;
memcpy (&res, mxGetPr(mxa_X), sizeof(double));
mxDestroyArray(mxa_P);
mxDestroyArray(mxa_mu);
mxDestroyArray(mxa_sigma);
norminvTerminate();
return 0;
}