最近用到Qt来调用Matlab动态链接库来进行计算,需要向Matlab函数传递结构体进行计算。matlab动态链接库的生成和调用方法不多说了(着重注意的坑是Matlab如果是盗版安装的,可能会少很多头文件,我又重装了一上午),网上有很多教程,这里着重写一下怎么把Qt中结构体传给Matlab函数。
第一步定义一个结构体。
typedef struct test_input_tag
{
unit8_t test_uint8;
unit16_t test_uint16;
int8_t test_int8;
int16_t test_int16;
float32_t test_float;
double64_t test_double;
}test_input_t;
然后写一个结构体变量,赋值。
test_input_t inputStruct;
inputStruct.test_uint8 = 100;
inputStruct.test_uint16 = 10000;
inputStruct.test_int8 = -100;
inputStruct.test_int16 = -10000;
inputStruct.test_float = 999.999;
inputStruct.test_double = 9999.9999;
qt中的结构体已经创建赋值成功了,然后就是作为参数传给Matlab。
Matlab的输入输出参数在C++中都必须要是mwArray类型的变量,接下来创建一个mwArray类型变量,指定创建行数、创建列数、变量个数和变量名称(这里注意变量名称需要Matlab函数中写的一致)。
const int nfields = 6;//结构体内的变量个数
const char *fieldnames[6]={"test_uint8","test_uint16","test_int8","test_int16","test_float32","test_double64"};
//结构体内的变量名称
mwArray mwStruct(1,1,nfields,fieldnames);//声明一个wmArray类型变量
/*
mwArray(mwSize num_rows,mwSize num_cols,int num_fields,const char**fieldnames)
创建行数为num_rows,列数为num_cols结构体阵列,结构体域名为由fieldnames指定,域名个数由num_fields指定
*/
mwArray m_uint8(inputStruct.test_uint8);
mwStruct(fieldnames[0],1,1)=m_uint8;//给结构体内的变量赋值
mwArray m_uint16(inputStruct.test_uint16);
mwStruct(fieldnames[1],1,1)=m_uint16;//给结构体内的变量赋值
mwArray m_int8(inputStruct.test_int8);
mwStruct(fieldnames[2],1,1)=m_int8;//给结构体内的变量赋值
mwArray m_int16(inputStruct.test_int16);
mwStruct(fieldnames[3],1,1)=m_int16;//给结构体内的变量赋值
mwArray m_float(inputStruct.test_float);
mwStruct(fieldnames[4],1,1)=m_float;//给结构体内的变量赋值
mwArray m_double(inputStruct.test_double);
mwStruct(fieldnames[5],1,1)=m_double;//给结构体内的变量赋值
qDebug()<<"输入结构体打印:"<<Qt::endl <<mwStruct.ToString()<<Qt::endl;
最后定义Matlab函数输出的变量,其中a,b,c,d,e,f分别为结构体中的变量,g为test_uint8和test_uint16的和。
//输出变量
mwArray a(1,1,mxUINT8_CLASS,mxREAL);
mwArray b(1,1,mxUINT16_CLASS,mxREAL);
mwArray c(1,1,mxINT8_CLASS,mxREAL);
mwArray d(1,1,mxINT16_CLASS,mxREAL);
mwArray e(1,1,mxSINGLE_CLASS,mxREAL);
mwArray f(1,1,mxDOUBLE_CLASS,mxREAL);
mwArray g(1,1,mxUINT16_CLASS,mxREAL);
test_MATLAB2QT_struct2(7,a,b,c,d,e,f,g,mwStruct);
qDebug()<<"输出结果打印:"<<Qt::endl
<<"a:"<<a.ToString()<<Qt::endl
<<"b:"<<b.ToString()<<Qt::endl
<<"c:"<<c.ToString()<<Qt::endl
<<"d:"<<d.ToString()<<Qt::endl
<<"e:"<<e.ToString()<<Qt::endl
<<"f:"<<f.ToString()<<Qt::endl
<<"g:"<<g.ToString()<<Qt::endl;
最好在Matlab每个变量前面,用disp打印一下,不然很容易出错。
看一下输出结果没问题。
参考链接:
MATLAB MinGW-w64安装与使用MATLAB MinGW-w64安装与使用_matlab安装mingw5.3.0-CSDN博客
qt调用matlab生成的dll库
QTCreator调用Matlab生成的.dll文件
QTCreater调用MatLab生成的.dll文件_qt调用matlab生成的dll_Fight_adu的博客-CSDN博客
C++和Matlab混合编程mwArray结构体传入