mwArray 定义矩阵变量

 

转载: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(const char* str)

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)

mwArray(const mwArray& arr)

mwArray( re)

mwArray( re, im)

2) 方法

 

mwArray SharedCopy() const

mwArray Serialize() const

mxClassID ClassID() const

int ElementSize() const

size_t ElementSize() const

mwSize NumberOfElements() const

mwSize NumberOfNonZeros() const

mwSize MaximumNonZeros() const

mwSize NumberOfDimensions() const

int NumberOfFields() const

mwString GetFieldName(int index)

mwArray GetDimensions() const

bool IsEmpty() const

bool IsSparse() const

bool IsNumeric() const

bool IsComplex() const

bool Equals(const mwArray& arr) const

int CompareTo(const mwArray& arr) const

int HashCode() const

mwString ToString() const

mwArray RowIndex() const

mwArray ColumnIndex() const

void MakeComplex()

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,忽略第一个数,二三位代表第二行第二列?

mwArray Get(mwSize num_indices,....)根据索引返回阵列元素,其中num_indices表示索引数目。Get函数中输入的索引均从1起始。例如

double data[4]={1.0,2.0,3.0,4.0};

mwArray a(2,2,mxDOUBLE_CLASS);

double x;

a.SetData(data,4);

x=a.Get(2,2,2);//返回4 

x=a.Get(1,3);//返回3

mwArray Get(const char *name, mwSize num_indices,...) 返回结构体域名为name,指定索引的结构体域,其中num_indices表示索引的数目。Get函数中输入的索引均从1起始。例如

const char* fields[]={"a","b","c"};

mwArray a(1,1,3,fields); //b=a(1).a; 

mwArray b=a.Get("a",1,1);//b=a(1,1).b;

mwArray b=a.Get("b",2,1,1);

 

mwArray Real()

mwArray Imag()

void Set(const mwArray& arr)

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类型有:

 

[cpp] view plain copy

  1. typedef enum  
  2. {  
  3.     mxUNKNOWN_CLASS = 0, //未知类型  
  4.     mxCELL_CLASS, //细胞类型  
  5.     mxSTRUCT_CLASS, //结构类型  
  6.     mxLOGICAL_CLASS, //布尔类型  
  7.     mxCHAR_CLASS,  //字符串类型  
  8.     mxVOID_CLASS,  //void类型  
  9.     mxDOUBLE_CLASS,   
  10.     mxSINGLE_CLASS, //单精度浮点数  
  11.     mxINT8_CLASS, //  
  12.     mxUINT8_CLASS,  
  13.     mxINT16_CLASS,  
  14.     mxUINT16_CLASS,  
  15.     mxINT32_CLASS,  
  16.     mxUINT32_CLASS,  
  17.     mxINT64_CLASS,  
  18.     mxUINT64_CLASS,  
  19.     mxFUNCTION_CLASS, //函数类型  
  20.     mxOPAQUE_CLASS, //  
  21.     mxOBJECT_CLASS  //对象类型  
  22. }  

[cpp] view plain copy

  1. typedef enum  
  2. {  
  3.     mxUNKNOWN_CLASS = 0, //未知类型  
  4.     mxCELL_CLASS, //细胞类型  
  5.     mxSTRUCT_CLASS, //结构类型  
  6.     mxLOGICAL_CLASS, //布尔类型  
  7.     mxCHAR_CLASS,  //字符串类型  
  8.     mxVOID_CLASS,  //void类型  
  9.     mxDOUBLE_CLASS,   
  10.     mxSINGLE_CLASS, //单精度浮点数  
  11.     mxINT8_CLASS, //  
  12.     mxUINT8_CLASS,  
  13.     mxINT16_CLASS,  
  14.     mxUINT16_CLASS,  
  15.     mxINT32_CLASS,  
  16.     mxUINT32_CLASS,  
  17.     mxINT64_CLASS,  
  18.     mxUINT64_CLASS,  
  19.     mxFUNCTION_CLASS, //函数类型  
  20.     mxOPAQUE_CLASS, //  
  21.     mxOBJECT_CLASS  //对象类型  
  22. }  


整体含义是:定义矩阵A,行数为:rows,列数为:cols,类型为:type

 

注: 如果参数不是矩阵,只是一个数,令 rows=1,cols=1即可。

<2>矩阵赋初值:

 

[cpp] view plain copy

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

[cpp] view plain copy

  1. int a[6] = {1,2,3,4,5,6}  
  2. mwArray A(2,3,mxINT32_CLASS);    
  3. 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

需这样赋值:

 

[cpp] view plain copy

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

[cpp] view plain copy

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

 

 

 

 

 

 

此时生成的A为:

 

1      4

2      5

3      6

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

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

 

[cpp] view plain copy

  1. char str[5] = "abcd";  
  2. //或 CString str = "abcd"  
  3. mwArray mwA(str); 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值