欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vc调用matlab生成的dll实例

程序员文章站 2022-06-25 20:46:23
...

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:

vc调用matlab生成的dll实例mcc-W cpplib:add-T link:lib add.m

结果,我们将会得到包含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; }

vc调用matlab生成的dll实例vc调用matlab生成的dll实例
附上我在项目写的一个例子。
#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;

}