Matlab中 的 mxArray 和 mwArray

原文链接:https://blog.csdn.net/hong__fang/article/details/43307701#

1 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文件中:

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++工程,工程中加入头文件: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.}  

2 Matlab代码转C++ – mwArray

本文主要介绍:matlab与C++结合的数据类型mwArray的一些基本知识,以及在C++中,如何对mwArray赋值,主要包括矩阵赋值和字符串赋值。

首先,说明mwArray数据类型不同于mxArray,所以许多关于mxArray的用法,对mwArray不一定适用,具体区别见博文:

http://www.cnblogs.com/kmliang/archive/2012/08/29/2662943.html

2.1 矩阵赋值

<1>mwArray 定义矩阵变量

mwArray A(rows, cols, type)
参数说明:

A : 变量名

rows:行数
col :列数
type :数t据类型

type类型有:

typedef enum
{
    mxUNKNOWN_CLASS = 0, //未知类型
    mxCELL_CLASS, //细胞类型
    mxSTRUCT_CLASS, //结构类型
    mxLOGICAL_CLASS, //布尔类型
    mxCHAR_CLASS,  //字符串类型
    mxVOID_CLASS,  //void类型
    mxDOUBLE_CLASS, 
    mxSINGLE_CLASS, //单精度浮点数
    mxINT8_CLASS, //
    mxUINT8_CLASS,
    mxINT16_CLASS,
    mxUINT16_CLASS,
    mxINT32_CLASS,
    mxUINT32_CLASS,
    mxINT64_CLASS,
    mxUINT64_CLASS,
    mxFUNCTION_CLASS, //函数类型
    mxOPAQUE_CLASS, //
    mxOBJECT_CLASS  //对象类型
}

整体含义是:定义矩阵A,行数为:rows,列数为:cols,类型为:type
注: 如果参数不是矩阵,只是一个数,令 rows=1,cols=1即可。

<2>矩阵赋初值:

int a[6] = {1,2,3,4,5,6}
mwArray A(2,3,mxINT32_CLASS);  
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols

注:该过程相当于把16的矩阵,转化为23的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:

1     3      5

2     4      6

如果要使A为:

1      2     3

4      5     6

需这样赋值:

int a[6] = {1,2,3,4,5,6}
mwArray A(3,2,mxINT32_CLASS);  //修改此处:行列数互换
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols

该矩阵转置之后,既可以达到所需形式,转置过程可以在matlab的.m文件中添加,先修改.m,然后在生成dll、lib、h文件。

尤其是,在图像处理时,如果传递的矩阵为图像数据矩阵,要采用后一种方法赋值,否则,图像会严重变形失真。

2.2 字符串赋值

char str[5] = "abcd";
//或 CString str = "abcd"
mwArray mwA(str);
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值