Matlab 内置的绘图工具可以可视化数据,在使用 C/C++ 作为主体编程语言时,可以通过调用 Matlab 引擎,再使用相关的语法,在.c/.cpp 脚本文件中利用 Matlab 绘图,从而避免数据的读写等,提高程序运行效率。
如何在 VS 中调用 Matlab 引擎
(1) 版本。Matlab 的版本需要和 VS 的版本需要匹配,具体可以打开 Matlab 的安装目录/bin/win64/mexopts 文件夹,里面可以看到当前版本的 Matlab 适配的 VS 版本(如下图)。另一种就是看年份,通常同一年的 VS 和 Matlab 都是适配的。
(2) 配置环境。配置 Matlab 引擎和配置外部动态库基本相同。右键VS项目→属性→VC++目录。
在①处添加 Matlab 安装目录下/bin/win64;在②处添加Matlab 安装目录下/extern/include;在③处添加Matlab 安装目录下/extern/lib/win64/microsoft;
在属性→连接器→输入的附加依赖项中添加对应的库文件,基础的绘图库有4个:libeng.lib;libmat.lib;libmex.lib;libmx.lib
测试程序
#include "stdio.h"
#include <math.h>
#include "engine.h" //添加MATLAB引擎头文件
#include <string.h>
int main()
{
//定义x,y数组并赋初值
int N = 20;
double x[20], y[20];
for (int i = 0; i < N; i++)
{
x[i] = i + 1;
y[i] = x[i] * x[i];
}
Engine* ep; //定义MATLAB引擎指针变量
if (!(ep = engOpen(NULL))) //打开MATLAB引擎
{
printf("can't start MATLAB engine!");
exit(1);
}
//利用MATLAB API mxCreateDoubleMatrix函数生成矩阵
mxArray* xx = mxCreateDoubleMatrix(1, N, mxREAL);
mxArray* yy = mxCreateDoubleMatrix(1, N, mxREAL);
//mxGetPr获取指向输入、输出矩阵数据的指针
memcpy(mxGetPr(xx), x, N * sizeof(double));
memcpy(mxGetPr(yy), y, N * sizeof(double));
engPutVariable(ep, "xx", xx);
engPutVariable(ep, "yy", yy);
engEvalString(ep, "plot(xx, yy);"); //调用MATLAB中plot(x,y)函数
engEvalString(ep, "xlabel('x axis');");
engEvalString(ep, "ylabel('y axis');");
mxDestroyArray(xx); //释放内存
mxDestroyArray(yy);//释放内存
system("pause");
engClose(ep);
return 0;
}
程序能正常输出曲线图代表配置成功。有关 VS 中 Matlab 绘图引擎的详细使用,我们会在后续做更详细的介绍。