关于在C++程序中调用MATLAB编译产生的动态链接库。具体的问题是在 调用DLL中函数时传递参数。我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。问题是关于调用 C++接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。所以问题归 结为如何在C++程序中使用mwArray。
1. mxArray和mwArray的比较:
1)mxArray是Matlab C 函数库的结构体,而mwArray是Matlab C++ 函数库中对mxArray的包装类。
其 次,二者的内存管理方式不同。mxArray的内存管理方式比较松散,由于是C函数库,没有数据封装,必须对临时阵列和约束阵列的概念极为明确,并且须小 心地防止内存泄漏(要多写好多代码)。尽管有自动内存管理机制 (mlfEnterNewContext,mlfReleasePreviousContext),仍然要处处调用mlfAssign,麻烦得很。然而 mwArray就好的多,一切交给C++对象去搞定,你只要放心地用就可以了。不过Matlab C++函数库为了防止频繁内存分配和释放重写了内存分配和释放等函数。你会发现对于mwArray a,b; a=b;实际上并没有生成两个相同数据块,只是指针,只有发成数据改变时才copy完整数据。 2) 这两个东西各自有一套与之相对应的函数。函数的返回值类型不同,需要多加注意。 最后,用的时候mxArray要使用指针,而mwArray直接当类对象使。声明:
mxArray:
mxArray *a;
mwArray
mwArray a;
销毁
mxArray
mxDestroyArray a;
mwArray
mwArray类的析构函数自动销毁对象
变量传递
mxArray
memcpy(dest_ptr,source_ptr,MAX_SIZE);
mwArray
mwArray in1(3, 3, mxDOUBLE_CLASS, mxREAL);
mwArray in2(3, 3, mxDOUBLE_CLASS, mxREAL);in1.SetData(data, 9);in2.SetData(data, 9);
比较而言,
1、mwArray的声明更简洁,不用考虑指针
2、mwArray不用手动释放内存
2. 例子
关于VC与MATLAB混编的设置,见前几个转帖。下面是这个例子用到的m代码。它定义了一个名为test的函数,保存在test.m文件中:
function y=test(x)
y=sin(x);plot(x,y,'*');end首先把这个函数编译成C++接口的DLL:
mcc -W cpplib:dlltest -T link:lib test.m
结果,我们将会得到包含dlltest .dll,dlltest .h,dlltest .lib等在内的一些文件。接下来我们只需要这3个文件。 (dlltest .ctf( 这个文件在7.1之后的版本就没有了, 如果是需要, 加上-C 参数。这里我们不要))
此时,打开dlltest.h看看,在文件的最下面我们可以发现C++接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出参数、以及输入参数。
然后在VC6中创建一个VC++工程(我创建了个基于对话框做测试),取名为VCMATLAB.把以上四个文件拷贝到VC++工程的源代码所在目录。
工程中加入头文件:dlltest .h
设置工程的引用库:project—》links里添加mclmcrrt.lib dlltest.lib(注:debug和release是相互独立的)
vc工程加入代码如下:
#include "mclmcr.h" // mwArray声明
#include "dlltest.h"
void CVCMATLABDlg::OnButton1()
{ // TODO: Add your control notification handler code heremclInitializeApplication(NULL,0); dlltestInitialize();mwArray x(10,10,mxDOUBLE_CLASS);double *xData;xData = new double[100];int i;for( i=0; i<100; ++i){ xData[i] = -5+(0.1*i);}x.SetData(xData, 100);mwArray y(10,10,mxDOUBLE_CLASS);huatu_test(1,y,x); dlltestTerminate(); mclTerminateApplication(); }编译运行结果: