VS2010与MATLAB集成(2)-使用DLL方式

一、环境准备

        安装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;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值