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值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-6488199.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 啃书:图像处理的偏微分方程方法(1) —— 数学准备:平面微分几何
  • 论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection
  • Pytorch学习(1) —— Tensor基础
  • Pytorch学习(2) —— 网络工具箱 TORCH.NN 基本类用法
  • Pytorch学习(3) —— nn.Parameter nn.ParameterList nn.ParameterDict 源码解析
  • Pytorch学习(4) —— nn.Sequential nn.ModuleList nn.ModuleDict 源码解析
  • Pytorch学习(5) —— 简单模型构建,损失函数,训练方法等
  • Pytorch学习(6) —— 加载模型部分参数的用法
  • 椭圆检测 Arc Adjacency Matrix-Based Fast Ellipse Detection 代码和数据集使用教程
  • OpenCV实验(二):基于圆和深度信息的位姿测量
  • 读博之路——开题那些事
  • 爷青没!OpenCV 4.x之后竟然没了LSD算法!
  • 爷青回!我竟然在OpenCV 4.x中使用了LSD算法!
  • OpenCV Aruco 参数源码完整解析理解!
  • 针对电陶炉E5错误的维修总结(狗头)
  • 克罗内克张量积 Kron 的 OpenCV C++实现
  • 关于使用SDKManager刷机出现No SDKs are available for your account的解决办法
  • 求你们了,以后按照我的办法配置OpenCV好么 (*╹▽╹*)
  • MATLAB调用C++开发——尝试写一个套着C++皮的Matlab函数
  • 论文阅读 2013 — EDCircles: A real-time circle detector with a false detection control
  • 是科研人就要快!加速你的算法!
  • 论文阅读 2017 —— Sensor Fusion for Fiducial Tags: Highly Robust Pose Estimation from Single Frame RGBD
  • [开源工具] 串口转wifi —— 两个串口之间通过网络进行通信
  • 论文阅读 2021——SUNet: Symmetric Undistortion Network for Rolling Shutter Correction
  • 论文阅读 2021 —— CodeMapping: Real-Time Dense Mapping for Sparse SLAM using Compact Scene
  • 论文阅读 2021 —— DnD: Dense Depth Estimation in Crowded Dynamic Indoor Scenes
  • 论文阅读 2018 —— CodeSLAM - Learning a Compact, Optimisable Representation for Dense Visual SLAM
  • 论文阅读 2020 —— VDO-SLAM: A Visual Dynamic Object-aware SLAM System
  • 论文阅读2021——Motion Basis Learning for Unsupervised Deep Homography Estimation with Subspace Projection
  • 论文阅读 2021 —— Pixel-Perfect Structure-from-Motion with Featuremetric Refinement
  • 在旭日X3派开发板上使用Intel Realsense深度相机
  • 利用OpenCV中的eigen替换函数dsyev来求解特征值和特征向量
  • 在旭日X3派开发板上使用USB Wifi来提高网络速度
  • pythpon基础:创建文件索引升级版
  • 【21】C语言 | 几个经典数组练习题
  • 跟我学c++高级篇——模板元编程之五模板和元编程
  • 【机器学习】(西瓜书习题8.5)编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。
  • 关于婚姻
  • java复习一
  • JAVA复习 2数据类型
  • java复习 3运算符
  • java复习 4流程控制
  • java复习 5数组 6对象
  • Java复习 9继承与多态
  • Java复习 9.1问题???
  • java 创建实例时,里面的实例变量首先初始化???
  • java 两种方式的区别?
  • Java Review 9.3重写
  • Java Review 9.4 Ovrride
  • Java Review 12 Exception