MATLAB与C++参数传递(最完整)

ops/2024/10/18 10:16:07/

目录

前言

数据传递

传递单个数据

传递矩阵

传递字符串

传递结构体


前言

通常 将MATLAB代码打包为.dll,.lib,.h文件供C++调用。而MATLAB通常用于算法的编写,输出只需要一个数组。

打开一个MATLAB打包生成的.h文件,可以看到注册了这样一个函数。

extern LIB_SKD_CPP_API void MW_CALL_CONV detectedPoint(int nargout, mwArray& result, const mwArray& posEnd, const mwArray& rectanglePosition, const mwArray& jointPoseStart, const mwArray& Para);

其中:

int nargout:为输出参数的个数,通常为1,如果不为1,也尽量将输出参数放到一个数组里面输出,使得输出参数为1.

其他参数mwArray& XXX 都是mwArray类型,这个数据类型是MATLAB库封装的。因此任何C++数据类型都必须转换成mwArray类型才可以传到MATLAB。

数据传递

MATLAB库定义的数据类型有:

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  //对象类型  
}  

传递单个数据

//定义mwArray 容器,大小为1*1,数据类型为,mxDOUBLE_CLASS(double)
mwArray flag(1, 1, mxDOUBLE_CLASS);
double a = 1;
//容器装载
flag.SetData(&a, 1);

传递矩阵

//定义数组
double Point1[] = { 1 , 2 ,3 ,4 , 5, 6};
//定义mwArray 容器,大小为1*6,数据类型为,mxDOUBLE_CLASS(double)
mwArray posStart(1, 6, mxDOUBLE_CLASS);
//容器装载
posStart.SetData(Point1, 6);

此时传到MATLAB端的值为:

[1,2,3,4,5,6]

//定义数组
double Point1[] = { 1 , 2 ,3 ,4 , 5, 6};
//定义mwArray 容器,大小为2*3,数据类型为,mxDOUBLE_CLASS(double)
mwArray posStart(2, 3, mxDOUBLE_CLASS);
//容器装载
posStart.SetData(Point1, 6);

该过程相当于把1*6的矩阵,转化为2*3的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:

此时传到MATLAB端的值为:

[1, 3, 5

2, 4, 6]

如果要使值为

[1, 2, 3

4, 5, 6]

//定义数组
double Point1[] = { 1 , 2 ,3 ,4 , 5, 6};
//定义mwArray 容器,大小为3*2,数据类型为,mxDOUBLE_CLASS(double)
mwArray posStart(3, 2, mxDOUBLE_CLASS);
//容器装载
posStart.SetData(Point1, 6);

此时传到MATLAB端的值为:

[1, 4,

2, 5,

3, 6]

matlab端转置一下,就可以得到结果。

传递字符串

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

传递结构体

如果要传递很多数据,可以用结构体的方式传递。需要将结构体转换为mwArray。

// 定义配置参数结构体
struct Para
{double DH[30];double TCP[6];
};
//结构体转mwArray
mwArray Staruct2mwArray(struct Para *Para)
{mwSize m = 1, n = 1;const int nfields = 2;const char *fieldnames[2] = { "DH","TCP"};const mwIndex index = 0;mwArray pm(m, n, nfields, fieldnames);mwArray DH(6, 5, mxDOUBLE_CLASS);DH.SetData(Para->DH, 30);pm(fieldnames[0], 1, 1) = DH;mwArray TCP(1, 6, mxDOUBLE_CLASS);TCP.SetData(Para->TCP, 6);pm(fieldnames[1], 1, 1) = TCP;return pm;
}int main()
{mclmcrInitialize();if (!mclInitializeApplication(NULL, 0)) return -1;if (!SKDInitialize())return -1;Para para;// 定义配置参数double DH[30] = { 0, 90, 0, 0, -90, 90,0, 0, 425, 393, 0, 0,160.7, 0, 0, 113.3, 99, 93.6,0, 90, 0, -90, 0, 0,0, 0, 0, 0, 0, 0 };double TCP[6] = { 5, -42, 420.7, 0, -10, 180 };memcpy(para.DH, DH, sizeof(double) * 30);memcpy(para.TCP, TCP, sizeof(double) * 6);//结构体转mwArraymwArray parameter = Staruct2mwArray(&para);return 0;
}

此时matlab端接收到的是一个对象,使用 . 的方式调用收到的参数,如para.DH,para.TCP。


http://www.ppmy.cn/ops/109088.html

相关文章

Vue解說

Vue.js(通常简称为 Vue)是一个开源的 JavaScript 框架,用于构建用户界面和单页应用程序(SPA)。 它由前谷歌工程师尤雨溪(Evan You)创建,并首次发布于2014年。 Vue 被设计为易于上手…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能,掌握重要标签(a标签,form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情,后端做什么…

会声会影2024发布了没有? 会声会影2024更新哪些内容?

嘿,亲爱的的朋友们,今天我要跟大家安利一款让我彻底沉迷、不能自拔的神器 —— 会声会影2024!如果你还在为视频编辑头疼,那么准备好迎接你的救星吧! 会声会影2024是一款功能全面的视频编辑软件,它不仅能帮你…

滑动窗口在算法中的应用

滑动窗口是一种经典的算法技巧,就像在处理一系列动态数据时,用一扇可以滑动的“窗口”来捕捉一段连续的子数组或子字符串。通过不断地移动窗口的起点或终点,我们能够以较低的时间复杂度来解决一系列问题。在这篇文章中,我们将通过…

逐行解析多头注意力机制

多头注意力机制是NLP算法岗常考的代码题,本篇文章将逐行梳理多头注意力机制的代码。 全部代码 import math import torch import torch.nn as nnclass MultiHeadAttention(nn.Module):def __init__(self, d_model, nums_head):super(MultiHeadAttention, self).__i…

【2024】MySQL库表基本操作

目录 登录数据库创建数据库直接创建数据库使用IF NOT EXISTS方式创建查看数据库信息删除数据库 数据表操作创建数据表增加新字段插入数据删除数据表 登录数据库 首先登录到数据库:输入用户名和密码登录到数据库内部 [rootlocalhost ~]# mysql -uroot -p Enter pas…

linux下framebuffer相关函数及知识点详解及整合运用

在 Linux 下,framebuffer(简称 fb)是一个提供硬件图形缓冲区的接口,允许用户应用程序直接访问图形设备的显示内存。它可以用于简单的图形显示操作,如直接向屏幕绘制像素、图形等。Framebuffer 的作用是让开发者可以直接…

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 …