目录
前言
通常 将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(¶);
return 0;
}
此时matlab端接收到的是一个对象,使用 . 的方式调用收到的参数,如para.DH,para.TCP。
标签:mwArray,double,C++,TCP,参数传递,mxDOUBLE,MATLAB,CLASS From: https://blog.csdn.net/y12345655/article/details/142091741