Qt Creator与matlab混合编程
引言:项目要求在Qt平台下搭建基于有限元算法的光学仿真平台,首先需要进行网格划分的实现。由于网格划分算法在matlab平台下已经有非常成熟的工程以及代码,如果可以直接调用,将大大缩短开发周期。故有了如下Qt与Matlab混合编程的例子。
参考文档:Qt与matlab混合编程
以下内容所使用的操作系统、软件以及编译器版本:win10、Qt5.14.1(msvc2017_64)、Matlab R2020a
.m文件示例
matAdd.m
function [C]= matAdd(A, B)
% 两个矩阵数相加
C = A + B;
end
Qt工程中引用Matlab相关的库和文件
.pro文件作如下设置,其中E:\software\matlab 为matlab的安装路径,可以根据自身实际安装的路径进行更改
通过动态库(dll)调用matlab
将.m文件编译成C++可以直接调用的动态库,之后在Qt程序中直接使用。这种方法最为简单,也最为常见。
matlab函数编译动态库
- matlab中打开需要编译的.m文件,命令行输入
mbuild -setup
确认所使用的编译器是和Qt对应的msvc2017,若不是则需要修改。
2. 对库进行打包操作
选择C++ Shared Library,对需要打包的代码进行添加,并命名输出的文件夹名称,点击Package。
生产完成后,在matlab工程下可以看到动态库
Qt调用matlab生成的动态库
将生成的文件添加进工程
.h文件放入根目录下,.lib文件放于新建的lib文件夹中,.dll文件放入工程构建后产生的debug目录下。
Qt调用dll
方法1:Qt工程中.pro引用生成的动态库
LIBS += D:/qt_prj/occQt-master/lib
方法2:
右键工程添加外部库,选择.lib文件。注意这里只是用win版本就足够。
引用头文件
通过添加现有项,将.h文件加入工程,include到被调用的文件中。
必须要进行初始化操作!!
Qt中调用动态库的函数
if(!matAddInitialize()) { // 初始化,必须要使用
qDebug() << "add init failed.";
return;
}
qDebug() << "susss";
double vectA[]={1,2,3}; // 向量A
double vectB[]={5,6,7}; // 向量B
int rowCnt=1; // 行数
int colCnt=3; // 列数
int elementCnt=3; // 元素个数
mwArray matrixA(rowCnt, colCnt, mxDOUBLE_CLASS, mxREAL); // 定义数组
matrixA.SetData(vectA, elementCnt); // 将C++ 的一维数组存储到MATLAB的二维数组
mwArray matrixB(rowCnt, colCnt, mxDOUBLE_CLASS, mxREAL);
matrixB.SetData(vectB, elementCnt);
//计算
mwArray matrixC(rowCnt, colCnt, mxDOUBLE_CLASS, mxREAL); // 定义数组,double类型
int nargout=1; // 输出变量个数
matAdd(nargout, matrixC, matrixA, matrixB); // 调用函数计算,返回的结果保存在matrixC变量中
//读取结果
int dim = 1; // 按照向量读出matrixC
double a = matrixC.Get(dim, 1);
double b = matrixC.Get(dim, 2);
double c = matrixC.Get(dim, 3);
//输出结果
qDebug()<<a;
qDebug()<<b;
qDebug()<<c;