matlab与MFC
混合编程其实不难,关键是没有一个规范的,真正可以解决设置过程中出现的小问题的方法。我在设置的过程中,遇到了不少问题,花了多半天的时间,终于解决了,顺利地在vc中调用matlab 生成的dll文件中的函数,并返回一个值,探出对话框,显示正确。这种混合编程的方式不能脱离matlab环境,如果需要发布独立的应用程序,需要安装MCR。下面分步骤地讲一下混合编程的设置及其原因:
1 matlab方面的操作
首先先写一个算阶乘的函数,存成test1.m文件,该文件的内容是:
function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
现在有了文件,下一步我们要设置好系统,设置好matlab,然后再把该文件编译成dll文件。
1、在环境变量(我的电脑右键-高级)path中加入<MATLAB71_root>\bin\win32;
2、添加环境变量matlab值设为< MATLAB71_root >即matlab7.1的安装路径;
3、配置mbuild使用的C/C++编译器;
在Matlab命令窗口中输入:
mbuild -setup
按照提示选择VC6.0的编译器,完成后在Matlab命令窗口中输入:
mex -setup
同样选择VC6.0的编译器,就完成编译器的安装和配置。
接下来我们要把.m文件存储的程序编译成dll文件,在matlab命令窗口中输入:
首先设置好工作目录,否则找不到文件
mcc -W lib:test1 -T link:lib test1.m
这个需要等一小段时间,最终,在当前目录下生成了
到此,在操作系统和matlab这一方面的工作就做完了
2 vc++6.0中的操作
在vc中建立一个MFC AppWizard[exe]基本对话框工程,名字叫做test1app.
1 )在 VC 中创建一个 MFC 工程(本人创建的为基于对话框的),环境设置根据如下帖子
: 怎样设置 Visual Studio 与 Matlb Complier 4.0 一起工作 中的指导进行。在
本例子中,只需要在 VC 中进行如下步骤:
A. Tools->Options->Directories->Show directories for : Include files-><matlab
7root> \Extern\Include ;
B. Tools->Options->Directories->Show directories for : Library files-><matlab
7root> \Extern\Lib\Win32\Microsoft\msvc60 ;
C. Project->Setting->C/C++->Category : Code Generation->Use run-time library
: Debug Multithread DLL ;
D. Project->Setting->Link->Category : Input->Object/library modules : test1.lib mclmcr.lib libmx.lib libmat.lib libeng.lib
2 )拷贝 MATLAB 当前目录下刚才用 mcc 生成的 test1.h , test1.dll , test1.lib ,以及 test1.ctf 文件到 VC 当前工程目录下,并用 Project->Add to Project->Files… 将 test1.h 加入到当前工程中。
3 )在当前工程的对话框的头文件和cpp中加入 #include "test1.h" 与 #include "mclmcr.h" ;
工程设置到此就结束了,下面开始写代码:
首先需要在对话框的初始化程序BOOL CTest1appDlg::OnInitDialog()内写
if( !mclInitializeApplication(NULL,0) ) //matlab环境初始化
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
/* Call the library intialization routine and make sure that the
* library was initialized properly. */
if (!test1Initialize()) //test1Initialize是test1.h中定义的test1函数的初始化函数
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
在对话框的确定按钮的消息响应函数内,调用dll中的阶乘函数,
void CTest1appDlg::OnOK()
{
// TODO: Add extra validation here
//此处为dll中的函数准备好参数,然后调用
double n = 4 ;
mxArray * t; //经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值
//都需要转换成该种格式
t = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);//该函数中的参数1,1定义了 t 这个矩阵的大小
memcpy(mxGetPr(t), & n, sizeof ( double ));//给 t 赋值为4
mxArray * y; //准备一个接收返回值的变量
y = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);
mlfTest1(1,&y,t); //运行该函数,进行阶乘计算,4的
double r1 = 0; //vc中的接收返回值的函数
memcpy(&r1,mxGetPr(y),sizeof(double));
mxDestroyArray(t); //销毁废弃内存
test1Terminate();//中止调用
CString showrslt;
showrslt.Format("%f",r1);
AfxMessageBox(showrslt);//显示阶乘计算的结果
CDialog::OnOK();
}
matlab与MFC的更多相关文章
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...
- WPF(C#)与MATLAB混合编程
WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...
- C++调用matlab函数
C++与matlab混合编程——C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值. ...
- PreEssentials与MFC集成使用
ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...
- 编写 Matlab mexFunction (C mex)
资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用M ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- Matlab 2013a 和 VS2010 混合编程
最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能.因此,基于MATLAB生成DLL, C 调用的方式完成. 环境:MATLAB 2013a + VS2010 + w ...
- 【转】三种方式在C++中调用matlab
C/C++调用Matlab 在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎.包含m 文件转 换的C/C++文件,以及调用m文件生成的DLL 文件. 1 利用Mat ...
- VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...
随机推荐
- 深入PHP内核之函数和返回值
1.关于返回值,PHP内核中使用了大量的宏来实现,我们先看一个函数 PHP_FUNCTION 宏的定义(Zend/zend_API.h) #define PHP_FUNCTION ZEND_FUNC ...
- eclipse背景颜色调整参考(绿色养眼哟),其他工具也可以设置
http://hi.baidu.com/630270730/blog/item/d64f64dcc05376385982ddf6.html 提示键配置.提示快捷键.提示背景色.关键字颜色.代码显示.编 ...
- Linux命令-文件系统常用命令:df,du,fsck,dumpe2fs
df -h 人性化显示文件系统的分区信息 注意:在linux中目录也是文件,不要混淆下面的目录文件说法. 传统方式查看文件大小可以使用:ll -h /目录/文件名,就可以看到文件的大小,但是如果你想看 ...
- Oracle游标解析
本节对Oracle中的游标进行详细讲解. 本节所举实例来源Oracle中scott用户下的emp表dept表: 一.游标: 1.概念: 游标的本质是一个结果集resultset,主要用来临时存储从数据 ...
- WebApi和MVC的区别
使用上区分,mvc主要用于建站,web api主要用于构建http服务,当然你非要用mvc来构建Uri式的Api也行,不过显然是没有这个必要的,一个不恰当的比喻就像是你也可以玩破解版的单机游戏,也可以 ...
- 用HTTP协议传输媒体文件 学习
用HTTP协议传输媒体文件可以分两个阶段,第一个阶段是Progressive Download(渐进式下载方式)阶段,第二个阶段是HTTP streaming(HTTP流化)阶段.其中,第一个阶段可以 ...
- RHEL7 -- 使用team替换bonding实现链路聚合网卡绑定
将网卡enp0s8.enp0s9进行链路绑定 安装teamd包 # yum install teamd 创建一个team链接 # nmcli con add con-name team0 type t ...
- (一)RocketMq入门之安装运行
一.几个重要的地址 Git地址:https://github.com/apache/incubator-rocketmq 编译好的文件:https://rocketmq.incubator.apach ...
- HTML DOM的总结
DOM 是 Document Object Model(文档对象模型)的缩写,是 W3C(万维网联盟)的标准 W3C DOM 标准被分为 3 个不同的部分: 1.核心 DOM - 针对任何结构化文档的 ...
- wxWidgets编程起步
開始学习wxWidgets,上一篇写了"安装wxWidgets遭遇的两大关卡"(简称"前文"). 先推荐一下这两天找到的学习材料. 博客中有一个系列教程,貌似作 ...