ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Qt和matlab混合编程:在Qt中使用Matlab编译的文件

2019-04-14 08:49:16  阅读:177  来源: 互联网

标签:Qt mwArray double mxDOUBLE 参数 matlab Matlab


此系列包含两个内容。

Matlab函数转Qt具体操作步骤
链接:https://blog.csdn.net/baidu_32821143/article/details/82990956
Qt中Matlab库函数的使用

在Qt中使用Matlab编译的文件
设置Qt工程中的.pro文件

将Matlab生成的lib,h,dll拷贝到当下工程路径内。
在.pro文件的空白处单击右键,弹出库类型的选择,选择外部库,并单击下一步。

选择matlab编译解压后application文件中的lib文件,然后勾选如图的按钮,点击下一步。

在.pro文件中生成如下图红圈内的内容。

添加所需要的matlab库文件,选择解压for_redistribution中的mcr后的v93为路径,具体细节参考图片。之所以使用$$quote,是为了避免出现一些路径中包含空格,或者无法从char转换为LPWSTR之类的错误。

执行qmake,构建工程。

在Qt中向matlab函数传参
以此系列第一篇文章中的函数为例:

GroupSelectiveAssembly中的所有输入参数均为1X1的double类型(可为矩阵,可为其他类型),输出为nXn的double矩阵。

在Qt中调用Matlab函数前,首先需调用初始化函数。

#include <SelectiveAssemblyModule.h>
void main()
{
 GroupSelectiveAssemblyInitialize();
 ...
}
123456

在Qt中设置C++输入参数,设置成动态数组的原因是考虑到如果参数是未知大小,方便传参。

// Input Parameter
    double *dTup1;
    dTup1=new double[1];
    dTup1[0]=4.001;
    double *dTdown1;
    dTdown1=new double[1];
    dTdown1[0]=3.993;
    double *dTup2;
    dTup2=new double[1];
    dTup2[0]=4.000;
    double *dTdown2;
    dTdown2=new double[1];
    dTdown2[0]=3.996;
    double *dinterval1;
    dinterval1=new double[1];
    dinterval1[0]=0.002;
    double *dinterval2;
    dinterval2=new double[1];
    dinterval2[0]=0.002;
    double *dTup;
    dTup=new double[1];
    dTup[0]=0.002;
    double *dTdown;
    dTdown=new double[1];
    dTdown[0]=-0.001;
    
    // Output Parameter
    double *drecommendation_all;
    drecommendation_all=new double[10000];
1234567891011121314151617181920212223242526272829

向Matlab的函数传参需要将C++数据类型转换为mwArray类型,所以这里定义一下mwarray类型的输入输出参数。

    mwArray Tup(1,1,mxDOUBLE_CLASS);
    mwArray Tup1(1,1,mxDOUBLE_CLASS);
    mwArray Tup2(1,1,mxDOUBLE_CLASS);
    mwArray Tdown(1,1,mxDOUBLE_CLASS);
    mwArray Tdown1(1,1,mxDOUBLE_CLASS);
    mwArray Tdown2(1,1,mxDOUBLE_CLASS);
    mwArray interval1(1,1,mxDOUBLE_CLASS);
    mwArray interval2(1,1,mxDOUBLE_CLASS);
    mwArray recommendation_all(1,1,mxDOUBLE_CLASS);
123456789
mwArray的第一个参数为行数,第二个参数为列数,第三个参数是类型,详见Matlab帮助。

将C++数据类型转换为mwArray类型

    Tup.SetData(dTup,1);
    Tup1.SetData(dTup1,1);
    Tup2.SetData(dTup2,1);
    Tdown.SetData(dTdown,1);
    Tdown1.SetData(dTdown1,1);
    Tdown2.SetData(dTdown2,1);
    interval1.SetData(dinterval1,1);
    interval2.SetData(dinterval2,1);
12345678
使用SetData函数进行参数间的传递,第一个为传递的C++数据类型,第二个为参数个数(行数X列数)。

调用Matlab函数

GroupSelectiveAssembly(1, recommendation_all, Tup1, Tdown1,Tup2, Tdown2,interval1,interval2, Tup, Tdown);
1
GroupSelectiveAssembly第一个参数为输出参数个数(这里只传出一个recommendation_all),第二个为输出参数,第三个开始为输入参数。

传出输出参数

recommendation_all.GetData(drecommendation_all,recommendation_all.NumberOfElements());
1
使用GetData函数获得输出参数,第一个参数为double类型的输出参数,第二个为输出的元素个数,使用NumberOfElements获得。

完成调用函数后,使用GroupSelectiveAssemblyTerminate() 结束调用。
可以qDebug()一下对应的输出参数,对比一下在matlab中获得的结果,看一下是否有错误。这里一定要注意在Matlab中矩阵是列存储,所以存储到C中的数组,指针中一定将对应数据对应起来。可以qDebug()一下对应的输出参数,对比一下在matlab中获得的结果,看一下是否有错误。这里一定要注意在Matlab中矩阵是列存储,所以存储到C中的数组,指针中一定将对应数据对应起来。
--------------------- 
作者:SharingFisher 
来源:CSDN 
原文:https://blog.csdn.net/baidu_32821143/article/details/82993401 
版权声明:本文为博主原创文章,转载请附上博文链接!

标签:Qt,mwArray,double,mxDOUBLE,参数,matlab,Matlab
来源: https://blog.csdn.net/snowfoxmonitor/article/details/89292559

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有