c程序调用matlab
方法一: 在c程序中调用matlab引擎(相当于打开一个精简版matlab然后往里输入命令,即客户机/服务器模式, c程序为客户机,matlab作为本地服务器)
方法二:将m文件打包成dll文件,然后在c语言环境下调用
优缺点分析:
方法一,易于实现,可以实时监控程序的运行,但独立性差,速度慢,需要安装完整版matlab,且每次调用都会启动matlab.exe进程;
方法二,实现复杂,调试麻烦,但只需要安装mcr(matlab component runtime),耗费资源较少;还有就是便于发布,在没有安装matlab的电脑中,利用最少的资源即可运行matlab程序。
demo(方法一)
1. vs配置(vs2008为例)
选择“工具”-----> “选项”----->”VC++目录“, 如下图所示添加路径。注意选择对应的平台(x64平台为例)
2. matlab配置
在matlab命令行中输入如下命令,按提示选择编译器
mex -setup
mbuild -setup
3. 添加PATH系统环境变量(根据自己的matlab安装路径,重启机器)
4. 新建工程,添加如下代码 (注意选择工程的活动解决方案平台)
// matlab.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "engine.h"
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
int main(int argc, char* argv[])
{
//
Engine *ep;
if (!(ep = engOpen(NULL))) {
fprintf(stderr, "\nCan‘t start MATLAB engine\n");
return EXIT_FAILURE;
}
int Nsample = 50;
const double PI = 3.1415926;
double *t = new double[Nsample];
for(int i = 0; i < Nsample; i++)
{
t[i] = i * 2 * PI / Nsample;
}
mxArray *T = NULL, *result = NULL;
T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
memcpy((void *)mxGetPr(T),(void *)t, Nsample*sizeof(t[0]));
engPutVariable(ep, "T", T);
engEvalString(ep, "Y=sin(T);");
engEvalString(ep, "plot(T,Y);");
engEvalString(ep, "title(‘y=sin(t)‘);");
engEvalString(ep, "xlabel(‘t‘);");
engEvalString(ep, "ylabel(‘y‘);");
printf("Hit return to continue\n\n");
fgetc(stdin);
mxDestroyArray(T);
engEvalString(ep, "close;");
engClose(ep);
return EXIT_SUCCESS;
//printf("hello, world\n");
}
5. 编译,运行,结果如下 :
首先会启动matlab 命令行,并完成绘图。
详细函数及数据类型参考:《c语言与matlab接口-编程与实例》