MATLAB调用C++开发——函数大全

最近做开发时候涉及到MATLAB调用C++进行开发,在此做些用法记录,可能不是很完整,但会根据项目需求不断更新这个博客的。目前还在根据项目需求不断更新相关函数

网上怎么创建cpp文件,怎么用mex编译已经说得很清楚了,这个博客主要是介绍函数,用于对接C++与matlab的接口。

说白了,就是数据各种拷贝传输。

1 C语言数据类型

一些列出MATLAB中C语言相关的数据类型

1.1 mxArray

这个没找到源码,反正所有相关矩阵都是用这个存的,后续只是用它,目前不考虑其内容。

1.2 mxSize

mxSize在就是size_t,而size_t是C++中常用的变量,具体是什么可以直接查看定义,但大部分被定义为unsigned int。

1.3 mxIndex

mxIndex与size_t等价。

1.4 mwSignedIndex

mwSignedIndex 等价于ptrdiff_t,可以理解为signed int。

1.5 mxChar

MATLAB的字符,使用了16位无符号整数来存。

1.6 mxLogical

所有的logical矩阵都是用mxLogical 存的,不是bool型数据。

1.7 mxComplexity

这个变量是个枚举型变量,用于指示这个矩阵是否有虚数部分。

typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};

2 mxArray 相关的基本函数

这部分函数返回mxArray的一些属性。

2.1 矩阵内容分析

bool mxIsNumeric(const mxArray *pm); // 判断矩阵是否为数值
bool mxIsComplex(const mxArray *pm); // 判断矩阵是否为复数
bool mxIsEmpty(const mxArray *pm); // 判断矩阵是否为空
bool mxIsFromGlobalWS(const mxArray *pm); // 判断数组是否从全局工作区复制

2.2 矩阵查询相关函数

mwSize mxGetNumberOfDimensions(const mxArray *pm); // 矩阵维度查询,4维矩阵就返回4
size_t mxGetElementSize(const mxArray *pm); // 返回矩阵每个元素占用的字节大小
const mwSize *mxGetDimensions(const mxArray *pm); // 返回矩阵每个维度的尺寸,5*7矩阵就返回{5,7}
size_t mxGetNumberOfElements(const mxArray *pm); // 返回矩阵元素个数
size_t mxGetM(const mxArray *pm); // 返回矩阵的行数,就是返回第一维的尺寸
size_t mxGetN(const mxArray *pm); // 返回矩阵的列数,除第一维,其他所有维度的乘积
mwIndex mxCalcSingleSubscript(const mxArray *pm, mwSize nsubs, mwIndex *subs); // 查询矩阵元素角标,nsubs就是矩阵维度,subs存的是要查询的坐标

2.3 矩阵设置相关函数

int mxSetDimensions(mxArray *pm, const mwSize *dims, mwSize ndim); // 设置矩阵维度,内部会重新分配空间,除非太大,否则基本都是成功(即返回0)
void mxSetM(mxArray *pm, mwSize m); // 重新设置函数,注意,这个函数不会释放或分配任何空间,如果空间不够,使用mxRealloc进行重新分配
void mxSetN(mxArray *pm, mwSize n);

2.4 矩阵的删除和复制

void mxDestroyArray(mxArray *pm); // 删除矩阵
mxArray *mxDuplicateArray(const mxArray *in); // 复制一个矩阵

3 创建矩阵

3.1 创建数值类型矩阵

// 创建一个二维double矩阵,m行n列,ComplexFlag参考前面介绍的枚举类型mxComplexity 
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag); 
// 似乎是创建一个double的数,用value来初始化
mxArray *mxCreateDoubleScalar(double value);
// 创建一个二维矩阵,m行n列,数据类型为classid,ComplexFlag同上
mxArray *mxCreateNumericMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity ComplexFlag);
// 创建多维矩阵专用
mxArray *mxCreateNumericArray(mwSize ndim, const mwSize *dims, mxClassID classid, mxComplexity ComplexFlag);
// 以下两个似乎是创建一个未初始化的矩阵
mxArray *mxCreateUninitNumericMatrix(size_t m, size_t n, mxClassID classid, mxComplexity ComplexFlag);
mxArray *mxCreateUninitNumericArray(size_t ndim, size_t *dims, mxClassID classid, mxComplexity ComplexFlag);

下面给出mxClassID的相关定义

MATLAB类名mxClassID 值
int8mxINT8_CLASS
uint8mxUINT8_CLASS
int16mxINT16_CLASS
uint16mxUINT16_CLASS
int32mxINT32_CLASS
uint32mxUINT32_CLASS
int64mxINT64_CLASS
uint64mxUINT64_CLASS
singlemxSINGLE_CLASS
doublemxDOUBLE_CLASS

下面给出相关的一些附属函数

bool mxIsScalar(const mxArray *array_ptr); // 判断是否为一个数
mxDouble *mxGetDoubles(const mxArray *pa); // 返回一个double数组的double*指针

3.1 创建结构体矩阵

创建一个结构体使用函数mxCreateStructArray,函数声明如下。

mxArray *mxCreateStructArray(mwSize ndim, const mwSize *dims, int nfields, const char **fieldnames);
mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields, const char **fieldnames); // 创建一个二维的结构体矩阵
  • ndim就是个整数,表示这个矩阵是几维的,二维矩阵就写2,三维矩阵就写3。如果维度小于2,那么这个维度被设置为2。
  • dims输入一个整数数组,存的是每维的个数,比如一个矩阵维5*7,那么就输入一个数组{5,7}。
  • nfields输入每个结构体的字段数。
  • fieldnames输入每个字段的名称,注意名字别太长就行。这个其实很好理解,在MATLAB中创建结构体时候,能够通过工作区查到这个变量的字段名的,个人理解其实就是个字典的模式。

这个函数只是创建了一个结构体矩阵,每个结构体内部的变量并没有被赋值,也就是每个字段包含一个为NULL的mxArray指针,可以使用mxSetFieldmxSetFieldByNumber进行赋值。注意,如果创建了一个4*7*1*1的矩阵,实际上创建后这个矩阵为4*7。

void mxSetField(mxArray *pm, mwIndex index, const char *fieldname, mxArray *pvalue);
void mxSetFieldByNumber(mxArray *pm, mwIndex index, int fieldnumber, mxArray *pvalue);

上述这俩函数,都是设置这个矩阵某个元素的字段值的,index可以通过mxCalcSingleSubscript查询得到。fieldnumber其实就是fieldname对应的字段位置,可以通过mxGetFieldNumber查询得到。

int mxGetFieldNumber(const mxArray *pm, const char *fieldname);

其他相关函数说明:

bool mxIsStruct(const mxArray *pm); // 判断输入矩阵是否为结构体矩阵,如果是返回1
mxArray *mxGetField(const mxArray *pm, mwIndex index, const char *fieldname); // 返回指定元素指定字段的值
mxArray *mxGetFieldByNumber(const mxArray *pm, mwIndex index, int fieldnumber); // 同上,不同的是字段换成字段ID
int mxGetNumberOfFields(const mxArray *pm); // 返回字段个数
const char *mxGetFieldNameByNumber(const mxArray *pm, int fieldnumber); // 通过字段ID返回对应的字段字符串
int mxAddField(mxArray *pm, const char *fieldname); // 添加新字段,成功返回字段个数
void mxRemoveField(mxArray *pm, int fieldnumber); // 移除一个字段

3.3 创建一个Cell矩阵

mxArray *mxCreateCellMatrix(mwSize m, mwSize n); // 创建一个m行n列的cell矩阵
mxArray *mxCreateCellArray(mwSize ndim, const mwSize *dims); // 创建N维cell矩阵
mxArray *mxGetCell(const mxArray *pm, mwIndex index); // 返回index位置处的cell矩阵
void mxSetCell(mxArray *pm, mwIndex index, mxArray *value); // 设置index处的cell值
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值