matlab中的mxArray和mwArray

原文地址:matlab中的mxArray和mwArray 作者:WARRIOR
转来学习下
首先, mxArray是Matlab C 函数库的结构体,而mwArray是Matlab C++ 函数库中对mxArray的包装类。
其次,二者的内存管理方式不同。mxArray的内存管理方式比较松散,由于是C函数库,没有数据封装,必须对临时阵列和约束阵列的概念极为明确,并且须小心地防止内存泄漏(要多写好多代码)。尽管有自动内存管理机制(mlfEnterNewContext,mlfReleasePreviousContex t),仍然要处处调用mlfAssign,麻烦得很。然而mwArray就好的多,一切交给C++对象去搞定,你只要放心地用就可以了。不过Matlab C++函数库为了防止频繁内存分配和释放重写了内存分配和释放等函数。你会发现对于mwArray a,b; a=b;实际上并没有生成两个相同数据块,只是指针,只有发成数据改变时才copy完整数据。
再次,这两个东西各自有一套与之相对应的函数。函数的返回值类型不同,需要多加注意。
最后,用的时候mxArray要使用指针,而mwArray直接当类对象使。如果你不是Hardcore级的牛人或具有Hardcore倾向的潜牛人 ,我强烈建议你使用后者!

举一个简单的例子:如果你需要计算c=a+b那么两者的区别是这样的:

mxArray:
void fun(){
……
double d_a=1,d_b=2;
mxArray *a,*b,*c;
mlfEnterNewContext(0,0);
mlfAssign(&a,mlfScalar(d_a));
mlfAssign(&b,mlfScalar(d_b));
mlfAssign(&c,mlfPlus(a,b));
……
mlfReleasePreviousContex t(0,0);
mxDestroyArray(a);
mxDestroyArray(b);
mxDestroyArray(c);
}

mwArray:
void fun(){
……
mwArray a,b,c;
a=1;
b=2;
c=a+b;
……
}
------------------------------------------------------------------
另外一个说法:

声明:

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不用手动释放内存

mwArray不用手动释放内存 关于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 .ctf,dlltest .h,dlltest .lib等在内的一些文件。接下来我们只需要这四个文件。  此时,打开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 here   mclInitializeApplication(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();   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值