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 值 |
---|---|
int8 | mxINT8_CLASS |
uint8 | mxUINT8_CLASS |
int16 | mxINT16_CLASS |
uint16 | mxUINT16_CLASS |
int32 | mxINT32_CLASS |
uint32 | mxUINT32_CLASS |
int64 | mxINT64_CLASS |
uint64 | mxUINT64_CLASS |
single | mxSINGLE_CLASS |
double | mxDOUBLE_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指针,可以使用mxSetField和mxSetFieldByNumber进行赋值。注意,如果创建了一个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值
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-6488199.html
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!