文章背景:由于C语言没有使用较为便利的图形库,使得在C语言中画图较不方便,本文使用C语言调用MATLAB引擎plot抛物线函数,希望能向大家介绍写MATLAB引擎在C语言中的用法, 方便大家在C语言中进行相关开发工作。
准备工具:VS 2013,MATLAB 2016b。
C语言开发环境配置:本文通过VS 2013进行C语言程序开发,在VS中需要配置MATLAB 目录。在VS工程配置中,选至选项页VC++目录,在包含目录中添加“D:Program FilesMATLABR2016bexterninclude”,在库目录中添加“D:Program FilesMATLABR2016bexternlibwin64microsoft”,以上目录路径取决于你MATLAB安装的位置和操作系统位数,配置结束如图:
配置好VC++的环境后,还需要配置调用MATLAB引擎时的输入文件,在链接器->输入的附加依赖项中添加“libeng.lib;libmat.lib;libmex.lib;libmx.lib;”,到此就基本将VS调用MATLAB的环境配置完毕。
以上配置完成后,还需要在windows系统的环境变量-path中添加当前系统位数对应的MATLAB运行目录,如本文在系统环境path中添加“D:Program FilesMATLABR2016bbinwin64;”。至此,前期准备工作宣告结束。
C语言调用MATAB引擎API函数:
1、engOpen():打开MATLAB引擎;
2、mxCreateDoubleMatrix():创建MATLAB变量矩阵;
3、mxGetPr():获取MATLAB变量的地址值;
4、memcpy():将C语言中的变量值赋值给MATLAB变量;
5、engPutVariable():将创建的MATLAB变量放至MATLAB工作空间;
6、engEvalString():执行字符串形式的MATLAB语句;
7、mxDestroyArray():释放MATLAB中创建的变量,释放内存;
8、engClose():关闭MATLAB引擎。
以上便是本文即将用到的MATLAB API函数(针对C语言)。
代码编写:通过以上介绍,编写的画图代码如下
//调用MATLAB函数绘制函数曲线
#include "stdio.h"
#include <math.h>
#include "engine.h" //添加MATLAB引擎头文件
#include <string.h>
int main()
{
//定义x,y数组并赋初值
const int N = 20;
double x[N], y[N];
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函数生成矩阵,即申请空间,MATLAB引擎中使用mxArray类型数据
mxArray *xx = mxCreateDoubleMatrix(1, N, mxREAL);//1行N列,mxREAL为实双精度矩阵
mxArray *yy = mxCreateDoubleMatrix(1, N, mxREAL);
//mxGetPr获取指向输入、输出矩阵数据的指针
memcpy(mxGetPr(xx), x, N*sizeof(double));//将数组 x 复制到 mxarray 数组 xx 中,即给xx数组赋值
memcpy(mxGetPr(yy), y, N*sizeof(double));
engPutVariable(ep, "xx", xx);//将 mxArray 数组 xx 写入到 Matlab 工作空间,命名为 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在运行时C语言时,窗口会一闪而过,本文通过调用系统的system("pause")函数确保画图窗口不会一闪而过。
实例视频: