C与MATLAB混合编程之调用MATLAB引擎

标签:
c与matlab混合编程matlab引擎 |
分类: 工作札记 |
Visual Studio调用MATLAB需要的配置已经在《Visual
在C中调用MATLAB,据网上介绍主要有3种方法:
1)、在C程序中调用MATLAB引擎;(本文)
2)、将M文件编译生成dll文件供C程序使用;
3)、将MATLAB程序编译成C/C++源文件并嵌入到C程序中。
1、在C程序中调用MATLAB引擎
为了调用MATLAB引擎,首先需要引入相应的头文件。
#include "engine.h"
然后需要加如下几行代码,这样顺利地完成连接。
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
有时候你可程序所调用的函数可能还需要其他的库。如果有链接错误提示的话,上网搜一下,然后按上述格式把需要的库加上就可以了。
接下来就可以在需要的地方调用matlab引擎了。使用时首先需要打开引擎:
Engine
if
{
fprintf(stderr,
return
}
接下来将C程序中相关的变量变为MATLAB需要的格式,一般使用mxCreateDoubleMatrix、mxCreateLogicalScalar和memcpy函数,将Visual Studio的源数据转换为MATLAB格式。
完成转换后使用engPutVariable将数据送到matlab引擎。
最后调用engEvalString,将MATLAB命令作为其参数,就可以利用MATLAB引擎进行计算了。
计算完成后通过engGetVariable和memcpy函数将结果数据返回给Visual Studio即可。
计算完成后不要忘了清理工作:使用mxDestroyArray清除mxCreateDoubleMatrix产生的变量,最后使用engClose关闭引擎。
下面是一个例子,绘制y=sin(t)的图像
代码:
#include
#include
#include
#include "engine.h"
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
int
{
Engine
if
{
fprintf(stderr,
return
}
int
const
double
for(int
{
t[i]
}
mxArray
T
memcpy((void
engPutVariable(ep,
engEvalString(ep,
engEvalString(ep,
engEvalString(ep,
engEvalString(ep,
engEvalString(ep,
printf("Hit return to continue\n\n");
fgetc(stdin);
mxDestroyArray(T);
engEvalString(ep,
engClose(ep);
return
}
在调试的时候,会弹出一个错误窗口,提示没有dll动态链接库,如下所示:http://s15/mw690/002jgDYpzy6FvcOciGq0e&690
由于貌似需求的dll文件较多,故将所有dll文件皆进行了拷贝。
调用matlab需要的dll文件在目录“C:\Program Files\MATLAB\R2010b\bin\win64”下。(须与实际安装位置对应)
Visual Studio运行时查找dll的路径是目录“C:\Windows\System32”下。
因此,将目录“C:\Program Files\MATLAB\R2010b\bin\win64”下的所有dll文件都拷贝到了目录“C:\Windows\System32”下。
这样则解决了该错误。
设置好断点,并启动调试后,可以看到启动了matlab的命令行窗口,并绘制出了图形。
http://s16/mw690/002jgDYpzy6FvdrJ7IPdf&690
不需要输入任何命令,只需等待即可。Visual
Studio调用MATLAB需要花费较长的时间,即使功能非常简单也是如此。http://s10/mw690/002jgDYpzy6FvdA6zsR39&690
在许多应用中,不仅会有输入参数,而且需要matlab进行计算后,把计算结果传递给Visual
Studio,下面以矩阵的运算为例,关于matlab与Visual
Studio的接口函数,大家可以参照matlab的help中的“C/C++ and Fortran API
Reference”,这些在help中讲解的比较清楚。
需要注意的是,在C语言中数组的序列是以行元素优先的,而在MATLAB中数组序列是以列元素优先的。
#include
#include
using namespace std;
#include
#include
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libeng.lib")
void main()
{
}
运行结果为
http://s5/mw690/002jgDYpzy6FzTU9n3Se4&690
至此,该方法已经试验成功。
在网络博文《MATLAB引擎方式实现VC与MATLAB混合编程》中,对用该方法所会用到的一些命令进行了总结,第2个例子也是出自该博文。
这种方法,是通过MATLAB引擎调用MATLAB运行,需要在Visual Studio里逐条输入命令,当所需功能较为简单、MATLAB命令较少时,该方法是可以的,如果命令较多则最好换用其他方法。