转载:https://blog.csdn.net/qq_26376985/article/details/50203021
<1>mwArray 定义矩阵变量
mwArray A(rows, cols, type)
参数说明:
A : 变量名
rows:行数
col :列数
type :数t据类型
mwArray
mwArray :C++用它向MATLAB传递输 i/o 参数。MATLAB中的参数都是矩阵表示,哪怕是1*1的矩阵。
1)构造函数
mwArray(mwSize num_dims, const mwSize* dims, mxClassID mxID,mxComplexity cmplx = mxREAL)
num_rows :行数; num_cols :列数;mxID:The data type type of the matrix.: cmplx:The complexity of the matrix (numeric types only).
mwArray a(2, 2, mxDOUBLE_CLASS);
mwArray b(3, 3, mxSINGLE_CLASS, mxCOMPLEX);
mwArray c(2, 3, mxCELL_CLASS);
mwArray(mwSize num_rows, mwSize num_cols, mxClassID mxID,mxComplexity cmplx = mxREAL)
mwArray(mwSize num_strings, const char** str)
mwArray(mwSize num_rows, mwSize num_cols, int num_fields,const char** fieldnames)
mwArray(mwSize num_dims, const mwSize* dims, int num_fields,const char** fieldnames)
2) 方法
mwSize NumberOfElements() const
mwSize NumberOfNonZeros() const
mwSize MaximumNonZeros() const
mwSize NumberOfDimensions() const
mwString GetFieldName(int index)
bool Equals(const mwArray& arr) const
int CompareTo(const mwArray& arr) const
mwArray Get(mwSize num_indices, ...)
mwArray Get(const char* name, mwSize num_indices, ...)
mwArray Get(mwSize num_indices, const mwIndex* index)
mwArray Get(const char* name, mwSize num_indices, const mwIndex*index)
#include "mclcppclass.h"
double data[4] = {1.0, 2.0, 3.0, 4.0};
double x;
mwArray a(2, 2, mxDOUBLE_CLASS);
a.SetData(data, 4);
x = a.Get(1,1); // x = 1.0
x = a.Get(2, 1, 2); // x = 3.0
x = a.Get(2, 2, 2); // x = 4.0
void GetData(* buffer, mwSize len) const
void GetLogicalData(mxLogical* buffer, mwSize len) const
void GetCharData(mxChar* buffer, mwSize len) const
void SetData(* buffer, mwSize len)
#include "mclcppclass.h"
double rdata[4] = {1.0, 2.0, 3.0, 4.0};
double data_copy[4] ;
mwArray a(2, 2, mxDOUBLE_CLASS);
a.SetData(rdata, 4);
a.GetData(data_copy, 4); // 取出a中的数据。
void SetLogicalData(mxLogical* buffer, mwSize len)
void SetCharData(mxChar* buffer, mwSize len)
4. mwArray 与 mxArray的用法区别:
Seventy
http://www.simwe.com/forum/post/view?bid=19&id=361497&sty=1&tpg=7&age=100
首先,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那么两者的区别是这样的:
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));
……
mlfReleasePreviousContext(0,0);
mxDestroyArray(a);
mxDestroyArray(b);
mxDestroyArray(c);
}
mwArray:
void fun(){
……
mwArray a,b,c;
a=1;
b=2;
c=a+b;
……
}
本文主要介绍:matlab与C++结合的数据类型mwArray的一些基本知识,以及在C++中,如何对mwArray赋值,主要包括矩阵赋值和字符串赋值。
首先,说明mwArray数据类型不同于mxArray,所以许多关于mxArray的用法,对mwArray不一定适用,具体区别见博文:
http://www.cnblogs.com/kmliang/archive/2012/08/29/2662943.html
一.矩阵赋值
<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 //对象类型
- }
- 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
- int a[6] = {1,2,3,4,5,6}
- mwArray A(2,3,mxINT32_CLASS);
- A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
注: 该过程相当于把1*6的矩阵,转化为2*3的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:
1 3 5
2 4 6
如果要使A为:
1 2 3
4 5 6
需这样赋值:
- <pre name="code" class="cpp">int a[6] = {1,2,3,4,5,6}
- mwArray A(3,2,mxINT32_CLASS); //修改此处:行列数互换
- A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
- <pre name="code" class="cpp">int a[6] = {1,2,3,4,5,6}
- mwArray A(3,2,mxINT32_CLASS); //修改此处:行列数互换
- A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
此时生成的A为:
1 4
2 5
3 6
该矩阵转置之后,既可以达到所需形式,转置过程可以在matlab的.m文件中添加,先修改.m,然后在生成dll、lib、h文件。
尤其是,在图像处理时,如果传递的矩阵为图像数据矩阵,要采用后一种方法赋值,否则,图像会严重变形失真。二、字符串赋值
- char str[5] = "abcd";
- //或 CString str = "abcd"
- mwArray mwA(str);