微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > 基于Qt与MATLAB的混合编程技术

基于Qt与MATLAB的混合编程技术

时间:09-28 来源:电子产品世界 点击:

面美观,我们需要将MATLAB的Figure窗口嵌入到Qt窗口组件中。这种方法的基本思路是去除MATLAB 的Figure窗口的标题栏及边框,然后把它移动到Qt窗口组件中,同时设定Qt窗口组件为父窗口。具体由以下代码实现。获取MATLAB 的Figure窗口句柄:

HWND hfigure =FindWindow(NULL,str.toStdWString().c_str());

获得Qt窗口组件的句柄:

HWND centralWidget = (HWND)(this->winId());

设定Qt窗口组件为Figure窗体的父窗体:

if(NULL==::SetParent(hfigure, centralWidget))

2.3 创建VC++动态链接库

要想在Qt中调用MATLAB的各种绘图函数,满足工程需要,使用动态链接库无疑是最好的选择。

动态链接库[6]是Windows操作系统中实现共享函数库概念的一种方式,使进程可以调用不属于其可执行代码的函数。DLL可以采用多种编程语言来编写。例如,可以利用Qt来编写程序界面,然后调用VC++编写的完成绘图功能的DLL。动态链接库有助于共享数据和资源,简化项目管理,节省磁盘空间和内存,更易于升级。

2.4 MATLAB数据类型与VC++数据类型相互转化

我们知道在MATLAB当中运算都是基于矩阵的,因此,在VC++中调用MATLAB函数时,无论函数的返回值、参数必须是矩阵类型(mwArray)[7],而在C++当中的二维数组可以看成一个矩阵,在VC++当中可以用下面的函数将数组转化成MATLAB中的矩阵类型。例如data= new double[m*n],可以用mwArray mwdata(m,n,data);这样就可以将二维数组变量转化成mwArray 类型,进而可以作为MATLAB函数的参数。反之,把mwArray 类型的变量转化成C++中的二维数组:例如存在mwArray 变量mwdata,用函数size获得矩阵的大小,row=size(&col,mwdata),其中row,col是函数的返回值,data=new double[row*col];data.ExtractData(mwdata); 这样就可以把mwArray类型转化成数组类型。另外,用GetData()和mxGetPr、mxGetPi组合可以得到指向mwArray对象的指针。

3 VC++和MATLAB混合编程

3.1 VC++与MATLAB混合编程步骤

在工程实践中,VC++调用MATLAB 的方法主要有两种:调用MATLAB计算引擎和调用MATLAB生成独立可执行的C++函数文件。为满足工程需要,选择第二种方法。

3.1.1 在MATLAB中进行编译器设置

MATALB编译器是一个运行于MATLAB环境的独立工具。其主要功能是把M程序转换成C/C++代码,然后再调用外部C/C++编译器,把产生的源代码编译、链接成用户指定的格式[4]

需要在MATLAB环境中配置外部C/C++编译器,在MATLAB命令环境行输入mbuid-setup设置要用到的C/C++编译器。输入mex-setup对MEX文件进行配置编译。

3.1.2 新建M文件并编译

(1)建立M文件,将工程中需要用到的数学函数库和图形库中的常见函数plot、mesh、hist、image、figure、fft、contour、set、get等函数编写成M函数。功能相同的函数,参数个数不同时要视为两个不同函数。

(2)利用mcc命令编译M文件,在MATLAB环境中使用mcc命令将M文件编译成可独立执行的C++函数文件。

3.1.3 在VC++中进行编译环境设置

首先设置系统变量,在系统环境的用户变量添加MATLAB及VC++软件的安装目录。然后在VC++设置编译环境:

(1)添加MATLAB库的头文件和库函数的路径;

(2)设置运行时动态链接库;

(3) 导入静态链接库文件。

3.1.4 创建动态链接库

动态链接库是将功能封装在一起的模块,因此,与代码直接写入调用模块中相比,它不仅可以提高程序的复用,减少代码开发工作量,同时也可以节省内存,提高代码利用率。

VC++调用MATLAB混合编程生成可以独立运行的C++代码,创建动态链接库,通过静态加载或动态加载的方式来使用DLL。新建一个空的动态链接库工程,添加一个头文件dllMATLAB.h和源文件dllMATLAB.cpp。将mcc编译后生成的C++文件添加到项目中,对MATLAB中M文件中的函数重新定义,满足MATLAB数据类型与VC++数组类型相互转化。编译生成dllMATLAB.dll和dllMATLAB.lib文件。这样其他应用程序只需将dllMATLAB.h、dllMATLAB.dll、dllMATLAB.lib添加到工程目录中就可以使用这个动态链接库,实现调用MATLAB的绘图功能了。

3.2 MATLAB不同版本的区别

值得注意的是,不同MATLAB软件版本导致混合编程的方法不同。与之前版本相比,MATLAB7.0之后的版本的编译器发生了较大变化。其主要新特点及变化包括以下两个方面:一、不再提供C++数字库和图形库;二、不再编译所有的M函数,只是产生必要的C/C++接口函数。

所以VC++调用不同版本的MATLAB的动态链接库的过程也有很大差别,具体表现在三个方面。

3.2.1 mcc命令及编译产生C++文件不同

MATLAB7.0之前的版本编译命令为:mcc - B sglcpp (文件名

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top