Qt中结构体传给Matlab函数

最近用到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库

qt调用matlab生成的dll库-CSDN博客

QTCreator调用Matlab生成的.dll文件

QTCreater调用MatLab生成的.dll文件_qt调用matlab生成的dll_Fight_adu的博客-CSDN博客

C++和Matlab混合编程mwArray结构体传入

C++和MATLAB混合编程 mwArray 结构体传入 - CodeAntenna

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值