首页 > 编程语言 >MATLAB与C++参数传递(最完整)

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

时间:2024-09-10 10:20:15浏览次数:3  
标签:mwArray double C++ TCP 参数传递 mxDOUBLE MATLAB CLASS

目录

前言

数据传递

传递单个数据

传递矩阵

传递字符串

传递结构体


前言

通常 将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);
	//结构体转mwArray
	mwArray parameter = Staruct2mwArray(&para);
	return 0;
}

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

标签:mwArray,double,C++,TCP,参数传递,mxDOUBLE,MATLAB,CLASS
From: https://blog.csdn.net/y12345655/article/details/142091741

相关文章