1:在matlab中建立add.m文件,并编译成dll库.
function [a,b]=add(x,y)
a=2*x+y;
b=3*y; end
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行mex -setup 和“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:
结果,我们将会得到包含add.dll,add.ctf,add.h,add.lib等在内的一些文件。接下来我们只需要这四个文件。此时,打开add.h看看,在文件的最下面我们可以发现C++接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出参数、以及输入参数。
#include<iostream> #include"add.h" int main(int argc,char**argv) {
if(!addInitialize()) { initilize failed!!!"<<std::endl; return -1; } mwArray a(1,1,mxDOUBLE_CLASS); mwArray b(1,1,mxDOUBLE_CLASS); a(1,1)=20; b(1,1)=30; mwArray x(1,1,mxDOUBLE_CLASS); mwArray y(1,1,mxDOUBLE_CLASS); //输出参数个数。输出参数,输入参数。 add(2,x,y,a,b);
double *i=new double; double *j=new double ; x.GetData(i,1); y.GetData(j,1);
std::cout<<"x="<<*i<<" y="<<*j<<std::endl;
getchar(); return 0; }
#include"h_single.h"
/************************************************************************/
/* single函数。单回路 */
/* BY: ithzhang [email protected] */
/* date: 2012年4月11日 11:32 */
/* */
/* */
/* current:电流,p:3*2数组, 坐标 */
/* delta:步长,left:坐标系左起始点,right:坐标系右结束点, out:传出,其值为: */
/* left到right步长为delta时,每一个横坐标作对应的纵坐标。(right-left+1)/delta项 */
/************************************************************************/
bool single(double current,double coordinate[3][2],double delta,
double left,double right,double *(&out))
{
/************************************************************************/
/* 初始化h_single库,否则将会出现各种错误 */
/************************************************************************/
if(!h_singleInitialize())
{
return false;
}
/************************************************************************/
/* 定义mwArray类型的各个变量,传入matlab导出的h_single函数。 */
/************************************************************************/
mwArray ii (1,1,mxDOUBLE_CLASS);
mwArray p (3,2,mxDOUBLE_CLASS);
mwArray step (1,1,mxDOUBLE_CLASS);
mwArray s1 (1,1,mxDOUBLE_CLASS);
mwArray s2 (1,1,mxDOUBLE_CLASS);
int num =(right-left)/delta+1;
mwArray B_m(2,num,mxDOUBLE_CLASS);
ii(1,1) = current;
step(1,1) = delta;
s1(1,1) = left;
s2(1,1) = right;
for(int i = 0;i < 3; i++)
{
for(int j = 0;j < 2; j++)
{
p(i + 1,j + 1) = coordinate[i][j];
}
}
/************************************************************************/
/* 调用matlab导出的h_single函数。h_single( 传出参数个数,传出参数,各个传入参数) */
/************************************************************************/
h_single(1,B_m,ii,p,step,s1,s2);
/************************************************************************/
/* 为传入指针申请内存空间,存储从h_single返回的结果。注意out传入时是引用类型的指针。 */
/************************************************************************/
out = new double[num];
B_m.GetData(out,num);
/************************************************************************/
/* 执行成功返回true。 */
/************************************************************************/
return true;
}