c 与matlab混编,C与MATLAB混合编程之调用MATLAB引擎
Visual Studio调用MATLAB需要的配置已经在《Visual Studio调用MATLAB的配置》一文中给出了详细的步骤,本文将介绍混合编程的示例。
在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*ep;
if(!(ep=engOpen("\0")))
{
fprintf(stderr,"\nCan't
start MATLAB engine\n");
returnEXIT_FAILURE;
}
接下来将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" )
intmain()
{
Engine*ep;
if(!(ep=engOpen("\0")))
{
fprintf(stderr,"\nCan't
start MATLAB engine\n");
returnEXIT_FAILURE;
}
intNsample=50;
constdoublePI=3.1415926;
double*t=newdouble[Nsample];
for(inti=0;i<
style="LINE-HEIGHT: 28px; COLOR:
rgb(101,123,131)">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);
returnEXIT_SUCCESS;
}
在调试的时候,会弹出一个错误窗口,提示没有dll动态链接库,如下所示:
由于貌似需求的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的命令行窗口,并绘制出了图形。
不需要输入任何命令,只需等待即可。Visual
Studio调用MATLAB需要花费较长的时间,即使功能非常简单也是如此。在许多应用中,不仅会有输入参数,而且需要matlab进行计算后,把计算结果传递给Visual
Studio,下面以矩阵的运算为例,关于matlab与Visual
Studio的接口函数,大家可以参照matlab的help中的“C/C++ and Fortran API
Reference”,这些在help中讲解的比较清楚。
需要注意的是,在C语言中数组的序列是以行元素优先的,而在MATLAB中数组序列是以列元素优先的。
#include
#include
using namespace std;
#include
//
使用VC++和Matlab引擎混合编程就必须加这个头文件,它里面包含了
#include
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libeng.lib")
void main()
{
//
定义循环变量
int
i =
0, j = 0;
//
状态变量
int
nStatus = 0;
//
定义MATLAB引擎指针
Engine
*ep;
//
定义mxArray变量指针
mxArray
*A, *B;
//
定义矩阵数组, 注意:VC中矩阵的行列次序与MATLAB正好相反,需要转置 double
arData[3][3] =
{{7.5,16.3,9.6},{13.2,8.9,12.3},{9.6,5.4,13.7}};
double
arResData[3][3];
//
输出原矩阵
cout<
for(i
= 0; i < 3; i++)
{
for(j
= 0; j < 3; j++)
{
cout<
";
}
cout<
}
//
打开MATLAB引擎
ep
=
engOpen(NULL); //
在Windows系统中该函数的参数都为“NULL”。
if(ep
== NULL)
{
cout<
exit(EXIT_FAILURE);
}
//
是否显示MATLAB窗口:true-显示;false-隐藏。
nStatus
= engSetVisible(ep,
true); //
设为ture运行时也只是一闪而过
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
//
为mxArray变量分配空间
A
= mxCreateDoubleMatrix(3,3,mxREAL);
B
= mxCreateDoubleMatrix(3,3,mxREAL);
if(A
== NULL || B == NULL)
{
cout<
exit(EXIT_FAILURE);
}
//
将数组中的数据写入到mxArray空间中
memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData)); //
使用内存数据复制函数memcpy进行复制
//
将矩阵变量A写入到MATLAB引擎空间
nStatus
= engPutVariable(ep,"A",A);
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
//
执行引擎命令求矩阵A的逆矩阵
nStatus
=
engEvalString(ep,"B=inv(A)"); //
B=inv(A)为要在MATLAB中运行的命令参数
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
//
从MATLAB引擎空间中读取执行结果
B
= engGetVariable(ep,"B");
//
将矩阵变量B复制到数组arResData中
memcpy((void*)arResData,(void*)mxGetPr(B),sizeof(arResData));
//
释放矩阵变量空间
mxDestroyArray(A);
mxDestroyArray(B);
//
输出计算结果
cout<
for(i
= 0; i < 3; i++)
{
for(j
= 0; j < 3; j++)
{
cout<
";
}
cout<
}
//
暂停程序,查看结果
system("pause");
//
关闭MATLAB引擎
engClose(ep);
}
运行结果为
至此,该方法已经试验成功。
在网络博文《MATLAB引擎方式实现VC与MATLAB混合编程》中,对用该方法所会用到的一些命令进行了总结,第2个例子也是出自该博文。
这种方法,是通过MATLAB引擎调用MATLAB运行,需要在Visual
Studio里逐条输入命令,当所需功能较为简单、MATLAB命令较少时,该方法是可以的,如果命令较多则最好换用其他方法。
c 与matlab混编,C与MATLAB混合编程之调用MATLAB引擎相关推荐
- c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎
Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...
- 调用matlab混合编程,vc调用matlab的m文件混合编程(引擎方式)
// test.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include #include #include /************* ...
- matlab振动频谱分析是不是要,VB和Matlab混编实现振动信号的频谱分析
VB和Matlab混编实现振动信号的频谱分析 3 0 物理测试 2 O O 4年第 2期 V B和 Ma t l a b混编实现振动信号的频谱分析 谭轶平, 王振清 ( 北京航空航天大学材料学院,北京 ...
- mac下配置进行c和matlab混编
mac下配置进行c和matlab混编 是用mac的小伙伴有时候有没有感觉很痛苦!遇到什么问题,找相关的解决办法真心不方便,我最近在搞一段程序,要进行c和matlab的混编,可是,在matlab中输入: ...
- 解决了java+matlab混编+web(jsp)调用Matlab,网页中显示Figure,详细实例
例子简介 网上java+matlab混编的挺多,大多数实例也都能实现出来,但是将matlab生成出来Figure显示在jsp页面中并配合WebFigure实现的例子却很少,所以我将自己的尝试结果详细的 ...
- matlab输出lccde_Matlab与Visual C++混合编程处理全站仪数据的方法
Matlab 与 Visual C++ 混合编程处理全站仪数据的方法 胡加星,刘立龙,刘靖晔 [摘 要] 内业数据检核中经常要对点的外业实测坐标与内业成图后的坐标进行 比较,以此来发现是否出现造点或是 ...
- matlab 职坐标,C#编程怎么调用MATLAB的动态链接库?
本文主要向大家介绍了C#编程怎么调用MATLAB的动态链接库?,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. ? ? 最近在用C# 做一个程序,可以实时显示心电波形.大家都知道在采集心电 ...
- wpf matlab混编,WPF(C#)与MATLAB混合编程
WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...
- c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)
记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...
最新文章
- 面试官: Redis 与 MySQL 双写一致性如何保证?
- html载入字体,css怎么导入字体?
- spring boot一:入门
- java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java
- python解析mht文件_php解析mht文件转换成html的方法
- 我用Java写了个女朋友,甚至还能跟我聊两句!?
- rwkj 1359 友元:两点距离
- G6 图可视化引擎——入门教程——使用图布局 Layout
- java依赖注入_Java依赖注入选项
- 使用extract-text-webpack-plugin提取css文件
- ieda使用 在jsp页面中,有时候会出现不能智能显示方法 idea pageContext.setAttribute...
- android 消息循环滚动条,Android 电池电量进度条,上下滚动图片的进度条(battery)...
- SAS 学习笔记 (一) — SAS简介
- 微软Windows的 EAPHost 简介
- UUID是什么 ?
- mysql ansi sql标准_Mysql数据库隔离级别(ANSI SQL92规范,行锁,间隙锁)
- Unity通过脚本实现不规则多边形的碰撞检测
- Dart笔记(10):Runes
- GBase 8s 客户端工具之dbaccess
- Lua热更原理以及加载规则
热门文章
- python中str函数_python字符串str的常用函数
- 【utorrent】ubuntu 安装utorrent
- docker nginx tomcat mysql_使用docker部署nginx+tomcat架构(2):访问mysql数据库
- 没有qpress_MySQL 大数据备份方案之Percona XtraBackup
- python递归函数的使用方法_让你Python到很爽的加速递归函数的装饰器
- 左右声道测试_小说:少年参加测试,直接挑战十只狗恐兽,众人见了惊呼:SS级...
- mysql general bin区别_MySQL_编码utf8_bin和utf8_general_ci的区别
- easyui treenode java_easyui tree的简单使用
- java 集合操作_Java 集合的操作 个人方法总结
- _报告指出:黑客已将攻击的目标逐渐迁移到 Linux 服务器和工作站上