基于Qt与MATLAB的混合编程技术
面美观,我们需要将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 (文件名
Qt MATLAB 混合编程 动态链接库 201610 相关文章:
- 基于Qt/Embedded的/蓄电池状态检测控制软件设计(09-06)
- 基于Hilbert变换的电压凹陷检测方法(06-20)
- 牛奶微生物检测仪的设计 (06-13)
- 基于MATLAB的皮肤听声器系统的研究(08-20)
- 线性预测及其Matlab实现(04-22)
- 在WaveMaster中创建自定义运算函数(06-17)