mwArray和mxArray有什么区别?
首先,
mxArray:Matlab C 函数库的结构体
mwArray:Matlab C++ 函数库中对mxArray的包装类
其次,二者的内存管理方式不同。
mxArray的内存管理方式比较松散,由于是C函数库,没有数据封装,必须对临时阵列和约束阵列的概念极为明确,并且须小心地防止内存泄漏(要多写好多代码)。尽管有自动内存管理机制(mlfEnterNewContext,mlfReleasePreviousContext),仍然要处处调用mlfAssign,麻烦得很。
mwArray就好的多,一切交给C++对象去搞定,你只要放心地用就可以了。不过Matlab C++函数库为了防止频繁内存分配和释放重写了内存分配和释放等函数。你会发现对于mwArray a,b; a=b;实际上并没有生成两个相同数据块,只是指针,只有发成数据改变时才copy完整数据。
再次,这两个东西各自有一套与之相对应的函数。函数的返回值类型不同,需要多加注意。
最后,用的时候mxArray要使用指针,而mwArray直接当类对象使。如果你不是Hardcore级的牛人或具有Hardcore倾向的潜牛人,我强烈建议你使用后者!
举一个简单的例子:如果你需要计算c=a+b那么两者的区别是这样的:
[cpp] view plaincopy
01.//----------对于mxArray:------------
02.void fun()
03.{
04.……
05.double d_a=1,d_b=2;
06.mxArray *a,*b,*c;
07.mlfEnterNewContext(0,0);
08.mlfAssign(&a,mlfScalar(d_a));
09.mlfAssign(&b,mlfScalar(d_b));
10.mlfAssign(&c,mlfPlus(a,b));
11.……
12.mlfReleasePreviousContext(0,0);
13.mxDestroyArray(a);
14.mxDestroyArray(b);
15.mxDestroyArray(c);
16.}
17.
18.//----------对于mwArray:--------------
19.void fun()
20.{
21.……
22.mwArray a,b,c;
23.a=1;
24.b=2;
25.c=a+b;
26.……
27.}
另外一个说法:
声明:
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不用手动释放内存
下面是这个例子用到的m代码。它定义了一个名为test的函数,保存在test.m文件中:
[cpp] view plaincopy
01.function y=test(x)
02. y=sin(x);
03. plot(x,y,'*');
04. end
首先把这个函数编译成C++接口的DLL:
mcc -W cpplib:dlltest -T link:lib test.m
得到包含dlltest.dll,dlltest.ctf,dlltest.h,dlltest.lib等在内的一些文件。
接下来我们只需要这四个文件。
此时,打开dlltest.h看看,在文件的最下面我们可以发现C++接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出参数、以及输入参数。
然后在VC6中创建一个VC++工程,工程中加入头文件:dlltest .h vc工程加入代码如下
[cpp] view plaincopy
01.#include "mclmcr.h" // mwArray声明
02.#include "dlltest.h"
03.void CVCMATLABDlg::OnButton1()
04.{
05. mclInitializeApplication(NULL,0);
06. dlltestInitialize();
07. mwArray x(10,10,mxDOUBLE_CLASS);
08. double *xData;xData = new double[100];
09. for(int i=0; i<100; ++i) xData[i] = -5+(0.1*i);
10. x.SetData(xData, 100);
11. mwArray y(10,10,mxDOUBLE_CLASS);
12. huatu_test(1,y,x);
13. dlltestTerminate();
14. mclTerminateApplication();
15.}