Vc++6.0调用matlab的数学库函数
VC6.0调用Matlab7.0编译动态库步骤
VC6.0调用Matlab7.0编译动态库步骤1、Matlab步骤a)运行安装D:\MA TLAB7\toolbox\compiler\deploy\win32\MCRInstaller.exeb)安装matlab编译器MCR;c)配置mbuild –setup,( mex –setup可以不用);d)编写m函数文件;e)mcc –B csharedlib:libdllname mfilename.m,生成libdllname.h,libdllname.dll,libdllname.lib, libdllname.ctf文件。
2、VC步骤a)建立工程;b)将1.e生成的四个文件拷贝到工程目录下;c)在VC++6.0 下进行如下设置包含目录: Tools—>Options—>Directories—>Showdirectories for: Include files—><matlab7.0 安装目录>\Extern\Include;d)在VC++6.0 下进行如下设置lib文件包含目录:Tools—>Options—>Directories—>Show directories for: Library—><matlab7.0 安装目录>\Extern\Lib\Win32\Microsoft\msvc60;e)Project—>Add to Project—>Files⋯将C++头文件"libdllname.h"加入到VC++工程中,并在工程的头文件中加入#include "libdllname.h"。
还需设置当前工程的链接选项Project—>Settings—>Link—>Category:Input—>Object/library modules: dllname.lib;f)另外,还需将<matlab7.0 安装目录> \Extern\Lib\Win32\Microsoft\msvc60下所有库文件加入到VC工程中,Project—>Settings—>Link—>Category:Input—>Object/library modules: libeng.lib libfixedpoint.lib libmat.lib libmex.liblibmwarpack.lib libmwlapack.lib libmwrefblas.lib libmwservices.lib libmx.lib libut.libmclcom.lib mclcommain.lib mclmcr.lib mclmcrrt.lib mclxlmain.lib;g)初始化:mclInitializeApplication(NULL,0); lib dllname Initialize();h)增加mxArray 输入输出公共变量,用于数据交换。
对VC++6.0与Matlab的混合编程技术的探讨
表 1 Ma a 擎库 函数 t b引 l
Malb V + 的混 合编 程是 通过 应用 程序 t 与 C+ a 接 口( P) A I实现 的 。Malb中提供 的 v + 应 用程 t a C+ 序接 口方 式有 3种 :)通过 调用 语 言编 译器 和链 ( 1 接 器 。将 Mal tb程 序 编 译 成 V + 文 件 ; ) a C+ ( 在 2 V + C +中使 用 Malb引 擎 服 务 ,通 过 引 擎 调 用 t a
很好 的程 序 设 计 方 法 。
关 键 词 : 用 程序 接 口 ; t b引 擎 ; C + 客 户机 / 务 器 应 Ma a l V +; 服
Mal t b是 Mah ok 公 司推 出 的 一 套高 效 a tw rs 1 用户 数 据 请 求 (C 数 据 类 型 )、x ry 种 , Poet a e中输 入项 目名 , 项 目引 导完 、 V 2m Ar a 在 r cnm j 按 率的数 值计 算 和可视 化软 件 ,具有 极其 强大 的数 矩 阵 ( 数 据 结 构 )、 t b 命 令 成 项 目工程 创建 。 3 Mal a 在这 里我们 创建 一个 MF C单文 值分 析 、矩 阵运 算 、信 号 处 理 和图 形显 示 功 能 ; 4 Ma a 、 t b变量 ( l 数据 结 构) 、 t b命 令 6 Malb 档工程 , 名为 D m eg 5 Mal a 、 t a 命 e on 。 Maa t b以其强 大的数 据处 理能 力 和丰 富的工 具箱 变量 ( l 数据 结 构 ) 、 x r y矩 阵 ( 据 结 果 ) 、 7m Ar a 数 8 31 .2打开 界面 , 菜单 栏 中选 择 T o -o - _ 在 ol >p s
vc++6.0与matlab7.1 混编配置和注意事项
一,配置matlab7.1为了能够使用MA TLAB的Complier将*.m函数文件编译为动态链接库DLL,必须对MATLAB的环境做出相应的设置。
具体做法如下:1.。
在MATLAB的Command Window下输入命令mbuild –setup,并根据MA TLAB的提示选择合适的编译器,笔者使用的是Microsoft Visual C++6.0,进行对C++连接环境的设置。
过程如下:>> mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n? ySelect a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc[2] Microsoft Visual C++ 2005 in d:\Program Files\Microsoft Visual Studio 8[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio[0] NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C++ 6.0Location: D:\Program Files\Microsoft Visual StudioAre these correct [y]/n? yTrying to update options file:C:\Documents and Settings\hk\Application Data\MathWorks\MATLAB\R2008a\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008a\bin\win32\mbuildopts\msvc60compp.batDone . . .2.。
VC中使用matlabC++数学函数库
求关于以上两矩阵的广义特征值问题。
!,$5,"*88 ,9$ *4154&$ +88&’*+,’41 ^’1*&2#$_5,#+%-"9_ ^’1*&2#$_)+,&+("988_ ^’1*&2#$‘5,#&’("97?!25$# %40 abHTcDNFFaDD!? ^’%#$% MFF ^’%1#$% abHTcDNFFaDD ^#$%’1$ abHTcDNFFaDD Z ^$1#’% ^$1#’% !)+,&+( 中的数据存储是以先列后行的顺序存储 O40,0+1 相同 5,+,’* #42(&$ #+,+YWX: e { YZdYdYdYdSdYd[dJYd[} 5,+,’* #42(&$ #+,+[WX: e { Yd\d]d[dAd>dSd@d@} ’1, )+’1f’1, +0;*d*9+0!+0;<WXg { !*0$+,$ ,Q4 )+,0’*$5 )QP00+G )+,ZfSdSd#+,+Yge!即生成矩阵 P )QP00+G )+,YfSdSd#+,+[ge!即生成矩阵 h !定义几个 )QP00+G 矩阵用于输出结果 )QP00+G PPdhhdUdVdie !调用数学函数库 UVf g计算广义特征值问题 !实际上利用了数值计算中的 UV 算法 PP:jRfkhhdkUdkVdkid)+,Zd)+,Yge !80’1, ,9$ )+,0’*$5 !实际上 )QP00+G 类重载了 FKK流操作符77与‘‘ !可以很方便地输出结果 *42,‘‘)+,Z‘‘$1#&e *42,‘‘)+,Y‘‘$1#&e !输出计算结果 *42,‘‘_PP_‘‘$1#&‘‘PP‘‘$1#&; !特征值利用 PP 主对 *42,‘‘_hh_‘‘$1#&‘‘hh‘‘$1#&e角元素除以 hh 相应的主对角元素 *42,‘‘_U_‘‘$1#&‘‘U‘‘$1#&e!PP:U!W)+,YX!V *42,‘‘_V_‘‘$1#&‘‘V‘‘$1#&; !hh:U!W)+,[X!V *42,‘‘_i_‘‘$1#&‘‘i‘‘$1#&e!i 为特征元素 *42,‘‘_PPfYdYg?hhfYdYg_‘‘PPfYdYg?hhfYdYg‘‘$1#&e *42,‘‘_PPf[d[g?hhf[d[g_‘‘PPf[d[g?hhf[d[g‘‘$1#&e *42,‘‘_PPfSdSg?hhfSdSg_‘‘PPfSdSg?hhfSdSg‘‘$1#&e 0$,201fabHTcDNFFaDDge } !特征值J["[Z\= !特征值JY"\=@[A !特征值 Z"[Y[YA
VC调用matlab的步骤
数据拟合的关键步骤数据拟合的好坏与模型是否能够成功有很大的关系,因此在数据拟合上,该软件库使用了比较成熟的数据拟合算法,即采用比较权威的高效计算软件Matlab6.1中的数据拟合函数进行拟合。
对于在Visual C++中调用Matlab应用程序接口,关键在于设置编译环境和使用正确的调用规则,然后,在发布软件时携带必要的动态连接库就可以保证程序的独立性[10]。
1、设置Visual C++编译环境对于调用Matlab的应用程序来说,只要保证程序的编译路径中包含Matlab 的目录下的Extern\Include目录,然后在程序中添加libmx.lib、libmmfile.lib、libmex.lib和libmatlb.lib即可[14]使用Matlab提供的高效算法。
而针对于Visual C++6.0来说,具体设置如下:图3.1 选项目录属性页第一步:打开应用程序工程后,在‘工具’菜单下选择‘选项’选单,将弹出选项对话框,选择其中的‘目录’属性页,如图3.1所示,在其中的Showdirectories for下拉式选项框中分别选择Include Files和Library Files,在下部的编辑框中输入以下路径:Matlab根目录\EXTERN\INCLUDEMatlab根目录\EXTERN\LIB然后选确定按钮。
第二步:选择下拉菜单Project中的菜单项Add To Project>>Files,将Matlab根目录\\extern\lib\win32\microsoft\msvc60下的四个lib文件:libmx.lib、libmmfile.lib、libmex.lib、libmatlb.lib添加到工程中。
完成上述工作后,就可以在Visual C++中调用Matlab数学函数及计算引擎了。
2 、Matlab应用程序接口调用规范在需要调用Matlab应用程序接口的单元文件.Cpp开头添加#include “Matlab.h”语句,然后在程序实现部分调用Matlab函数。
C#调用C++函数库,c++调用matlab数学函数库实例
C#调用C++函数库,c++调用matlab数学函数库实例在上一篇关于调用MatLab数学函数库的文章中,基本上只说了一件事情:MatLab的底部数学计算引擎其实都是一些C++函数库,这些函数库被编译成了C++动态链接库(也就是在安装目录下的bin\win32文件夹中的那些.dll文件),我们可以直接来调用这些存在于.dll文件中的函数,而与MatLab运行环境无关。
当然,这样做,可能会觉得有点儿盗窃的感觉,不过,可以肯定的是,这不是盗窃,这是合法的(因为这个函数库向外公开,也是MatLab产品的一部份,公司还为这个专门出了文档。
可是,好像7.0以后的版本就没有这么好的事儿了)。
在这里又多了一种语言——“C#”。
主要是因为如果要开发一个软件,那么,在现在这个时代里,用C++来做界面显示,实在是一种非常不可取的事情。
虽然也用VC6.0的MFC来开发过软件,但现在想想还是很后怕的。
而C#做界面显示和整个程序的架构就显得非常的简单方便了。
所以,我的想法是这样的:在C++中调用MatLab数学库中的函数(我真的是把绝大多数的数值计算都压到MatLab 身上了)包装成我自己的数学计算库,然后再在C#中调用我自己的数学计算库中的数值算法。
这个过程,开始的时候我也不知道能不能成功,后来经过不断的尝试发现是可行的。
下面就举一个完整例子写到下面,因为我非常害怕自己会忘掉。
就举一个LU分解解一次方程组的例子吧:1、安装MatLab6.5主要是为了得到MatLab数学库的头文件.dll文件和.lib文件,当然可以从其它电脑上把包含这些文件的文件夹拷过来用,具体是哪些文件夹,后面会说到。
2、启动VC6.0,新建一个工程,新建的时候选“工程”页中的"Win32 Dynamic-Link Library",表示要建一个动态链接库项目。
3、建好了.dll(Dynamic-Link Library的简称)项目之后,首先要做就是进行包含目录设置:“工具”—>“先项”—>“目录”—>“目录[S]”在这个下接框中选“Include files”项进行头文件库设置,在下面的文本框中输入要需要的头文件的所在的文件夹目录(这样设置之后,在需要的时候,编译器就会这些目录下在查找头文件),这里应该输入是D:\MatLab6dot5\extern\include\cpp和D:\MatLab6dot5\extern\include。
VC中调用matlab配置方法
ATLAB提供了许多方法与VC程序的通信:MATLAB引擎(ENGINE)模式,采用了客户机/服务器(CLIENT/SERVER)的计算形式,通过MA TLAB应用程序接口(API)中有关函数,在VC 环境中调用MATLAB函数,但此种方法需要MATLAB环境后台支持,因此系统必须安装MATLAB;MA TLAB本身提供的MCC工具编译,编译m文件生成VC++或c语言,直接在VC中使用;MATLAB的MEX工具将m文件编译成DLL,供VC调用。
MATLAB现具有的MA TLAB Add—in(其包装了MCC、MEX)更方便了第二、三种方法的应用,现本系统的实现就是以第三种为基础的。
2.1 MA TLAB与VC实现互连为了在开发时实现对MA TLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行“mex –setup;mbuild –setup;cd(prefdir); mccsavepath;”命令。
之后运行VC开发工具,从VC++菜单中依次打开“Tools->Customize->Add-ins and Macro Files”,选中MA TLAB Add—in宏,可以看到工具栏中多了一个。
现在VC就可以利用它来得到m文件所对应的c、c++文件。
2.2 开发工具VC运行环境设置开发时,须对VC的开发环境变量进行设置。
通过“Tools->Options->Directories”找到的“Directories”项中添加环境变量。
添加头文件和库文件搜索路径有(本计算机的文件搜索路径为):F:\MATLAB6P5\EXTERN\INCLUDEF:\MATLAB6P5\EXTERN\INCLUDE\CPP同时将MA TLAB的链接库添加到VC中。
从“Tools->Options->Directories”中“Show directories for:”下拉框里选择“Library files”,然后再在“Directories”项中添加环境变量。
Matlab程序在VC中的调用
Matlab程序在VC中的调用摘要:利用vc与matlab接口技术,用VC 调用Matlab 编译的DLL 文件进行复杂数据处理不仅简洁通用,更具有很强的实用性和可扩展性,在科学计算与工程运用领域具有广泛的推广应用价值。
关键词:MATLAB ;VC;DLL ;接口1. VC与MATLAB简介VC 是大家都非常熟悉的一个软件,它是MicroSoft公司开发的在Windows 环境下主要软件开发环境之一,用其中的MFC 可以快速方便地编写出各种友好的用户界面,且用VC ++ 开发的系统具有容易维护升级、界面友好,代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中的主流工具之一。
①、MATLAB是Mathworks 公司开发出的一款著名软件,如今已成为世界上使用最广泛的数学软件,它具有强大的数值计算、数据处理、图象显示、符号运算、系统分析、模拟仿真功能,由于受到各个领域专家学者的青睐,在他们的共同努力下,经过多年的发展,如今的Matlab 不仅拥有功能完善的内部函数库,更有专用于各领域的强大工具包,在这个平台上只需寥寥数语便可完成在其它环境中复杂度不可想象的功能;另外,开放性也是Matlab 一个最重要、最受欢迎的特点,除内部函数外,所有Matlab 工具包中主包文件和各工具包文件都是可读可改的源文件,用户可通过对源文件的修改来形成新的工具包,甚至亦可完全由自己编写源文件来构筑自己研究领域的专用工具包。
在欧美发达国家中,Matlab 已经成为应用线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生、硕士生、博士生必须掌握的基本技能;在设计研究单位和工业部门,Matlab 也被广泛地用于研究和解决各种具体工程问题。
Matlab在中国得到充分的重视,在各科研机构和高校中得到大量的使用。
2 利用VC 与MATLAB接口实现matlab程序在VC中的调用(1) 在Matlab 环境中编写. m 文件。
VC++6.0与MATLAB-R2010a混合编程实例
VC++6.0与MATLAB R2010a混合编程实例VC中调用MATLAB编译生成的动态链接库方法软件:MATLAB 7.10(R2010a),VC++6.0系统环境变量:在我的电脑—属性—高级—环境变量—系统变量—path中,添加D:\MATLAB\R2007a\bin\win32。
备注:如果在MATLAB中mcc命令出错,提示“cmd不是内部或外部命令。
”,是因为path 中system32的路径被修改了,需要把系统的变量添加进去。
第一部分:对MATLAB程序进行编译,得到动态链接库1 运行mbuild –setup,安装VC++6.0编译器。
2 编写MATLAB函数,(精通MATLAB与C++混合编程设计 186页的例子) m文件为:function y = sincplot(n)x1 = 0.01:0.01:n*pi;y1 = sin(x1)./x1;x2 = -n*pi:0.01:-0.01;y2 = sin(x2)./x2;y = [y2 y1];plot([x2 x1],y);3 把m文件编译为dll文件运行mcc -B csharedlib:libsincplot sincplot.m,把m文件编译成动态链接库文件。
其中要用到的程序为libsincplot.h,libsincplot.dll,libsincplot.lib,libsincplot.ctf。
并复制到工程目录下。
第二部分:在VC中调用MATLAB动态链接库1、新建工程MFC单文档应用程序。
启动VC,首先对VC进行配置,以便在VC中调用MATLAB动态链接库TOOLS—options—detectories—includes files中添加MATLAB路径D:\MATLAB\R2010\EXTERN\INCLUDED:\MATLAB\R2010\EXTERN\INCLUDE\WIN32(貌似可以不添加)。
Library files中添加D:\MATLAB\R2010A\EXTERN\LIB\WIN32\MICROSOFT以上设置是对VC软件进行的设置,只需设置一次即可。
Matlab引擎的VC++6.0接口调用及其面向对象编程
(0 , , , ) I 8 80 I J G , 8 E A L 7 8 5 L 8 + 5 M9 8 L @ 5 I I B + E . 7 54 5 7 5 8 8 E 7 5 5 7 O 8 E P 7 , B + E . 7 5! 3 " " " ! 0 @ 7 5 + 6 K 6 H 6 6N H
第( V卷第! !期 ( " " !年! !月
应 用 科 技 < 7 8 M A L 7 8 5 L 8 + 5 M 9 8 L @ 5 I I K K 6 H
, / I 2 ( V W2 ! ! , > I O 2 ( " " !
文章编号: ( ) ! " " # $ % & ! ’ ( " " ! ! ! $ " " ) ! $ " )
: (< ) $ / 7 * ; ) ( * 9 @ 8* + , + . 4 5 7 5 8 7 PI 5 8I Q , @ 8+ 7 L + , 7 I 5K E I E + J7 5 , 8 E Q + L 8 : F G P 7 5 + , + . 7 5/ 0112 6 K K 6 6* , < Q , 8 E , @ 8M 8 , + 7 8 M+ 5 + P 7 P, @ 8K + 8 E E I I P 8 P , I 8 5 L + P G + , 8 , @ 8 + E E + 5 8 J 8 5 , I Q M + , + + 5 M , @ 8G P + 8 I Q , @ 8 H K K K K 6 6 * + , + . 4 5 7 5 8 2 </ 011L + P P 5 + J 8 M0 * + , + . 4 5 7 5 8 7 P M 8 Q 7 5 8 M 2 9 @ 8 L + P P 7 J 8 J 8 5 , P , @ 8 O 7 , E 7 Q 7 L + , 7 I 5I Q 6 6 K , , @ 8 + E E + 5 8 J 8 5 , Q I E M 7 Q Q 8 E 8 5 , M + , + L + P PK E 8 M 7 8 P , P , @ 8K E I E + J J 7 5 E I L 8 P P + 5 MK E I O 7 M 8 P + Q E 7 8 5 M 7 5 , 8 E R 6 6 6 6K H , Q + L 8 8 5 O 7 E I 5 J 8 5 , Q I E , @ 8K E I E + J2 S 7 5 + , @ 8K + 8 E M 8 P L E 7 . 8 P , @ 8* + , + . 4 5 7 5 8 7 5+ 58 T + J 8 2 6 H K 6 K : ; ; ; / > # + ; 5 7< : F * + , + .8 5 7 5 8 / 011 L 7 8 5 ,P 8 E O 8 E 6 ?@
VC++中如何能调用matlab函数
Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。
但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。
Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。
不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。
基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。
本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。
1. 什么是Matlab引擎所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。
可以主要功能有:★打开/关闭一个Matlab对话;★向Matlab环境发送命令字符串;★从Matlab环境中读取数据;★向Matlab环境中写入数据。
与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。
通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。
对所有的数据结构提供100%的支持。
同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。
实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。
在Matlab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。
如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。
Vc++6.0调用matlab的数学库函数
Vc++6.0调用matlab的数学库函数Vc++6.0调用matlab的数学库函数前段时间在摸索如何在VC++6.0当中调用Matlab的里的数学库函数。
当时弄得我很是郁闷,现在想想,自已走了很多弯路,原来,是如些的简单。
所以,与出来和大家一起讨论和分享。
一、关于Matlab6.x首先,matlab它本身也是用C++语言编写的,具是什么是编译器我倒是忘记了(好像是Borland吧)。
说Matlab是一种科学计算语言吧,其实也可以,不过,其实也可以把它看作是一个科学计算软件。
它里面有很多的已写好的数值计算、分析以及统计等的函数。
然后在Matlab里写文件(比如.m文件),文件里的每一个语句其实都是在调用它里面的函数。
说白了,Matlab就是为我们写了一大堆的数学运算函数,然后再能过文档(help指令)来告诉我们怎么调用这些函数,就是这样。
其次,为什么要选择Matlab的6.x版?现在最新的版本好像是7.x 了吧,照理说,就应该用最新版的。
可是,最新版的Matlab(7.x)不再把数学库公共了,如果想要调用它里面的函数库,就必须将Matlab在后台运行。
也就是说,不管你用什么语言,只要你想调用Matlab7.x里面的函数,那么你的程序就必须在Matlab运行环境下运行。
哦,刚才忘记说了,这篇日志的目的是要建立独立于Matlab 运行环境的程序。
最后,Matlab6.x已推出七八年了,会不会和7.x版本相比而有点过时了?我是这样理解的,如果你调用的函数不是一些当前数值计算领域的新兴问题,那就是没有问题的。
对于我们工科的人来说,10年前的伟大的mathworks公司绝对可以提供我们想要的计算方法了。
所以,6.x,没问题。
二、关于C++和Matlab混合编程关于这个主题的文章是非常之多的,足以让你眼花缭乱了。
更让我感到不解的是,有好多人居中然以C++和Matlab混合编程为主题,在正式期刊上发表文章。
不信你可以在知网或万方上搜搜看,呵呵,一大把。
vc调用matlab函数
vc调用matlab函数时间:2007-09-18作者:佚名编辑:本站点击:3564 [评论]Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。
其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。
但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。
1、Matlab与VC混合编程的实现方法Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。
一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。
具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信(2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)中调用。
(3)通过DLL实现VC与Matlab的混合编程。
DLL是一个可执行的二进制文件。
把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享[2]。
在上述三种方法中,第一种方法对调用Matlab的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用Matlab 引擎(Engine)来实现的。
本文主要介绍采用通过引擎(Engine)来实现VC与Matlab的混合编程。
VC╫中使用MATLAB6.0 C╫数学库的新特点
VC╫中使用MATLAB6.0 C╫数学库的新特点
张让勇;张梅;宋文武;严敬;陈次昌
【期刊名称】《四川工业学院学报》
【年(卷),期】2002(21)4
【摘要】MATLAB6.0与MATLAB5 .3相比 ,在VC 6.0中使用其数学库建立独立于MATLAB运行环境的应用程序时 ,有了很大的不同 ,应用在 5 .3版本下的方法已经不再适用于 6.0版本。
本文作者在详细介绍了这些重大改变后 ,通过一个简单的实例 ,具体说明如何在VC 中使用MATLAB 6.0C 数学库来建立独立运行应用程序的过程。
【总页数】3页(P29-31)
【关键词】MATLAB6.0C++;VC++;数学库;水轮机;选型;软件开发
【作者】张让勇;张梅;宋文武;严敬;陈次昌
【作者单位】四川工业学院能源与环境工程系
【正文语种】中文
【中图分类】TK73;TP311
【相关文献】
1.用Add-in减少VC6.O中goto语句使用错误的研究 [J], 张全法;陈倩
2.如何在VC程序中使用MATLAB的C数学库 [J], 刘春艳
3.VC++中使用MATLAB 6.0 C++数学库的新特点 [J], 张让勇;张梅;宋文武;严敬;陈次昌
4.黑白影像中的光与影--VISICO韦思VC-600HSS高速灯使用报告 [J], 贾云龙(摄影)
5.现代局部战争中后备军使用的新特点 [J], 田宝贤
因版权原因,仅展示原文概要,查看原文内容请购买。
在VC++6.0环境下调用MATLAB6 函数和M文件的方法
在VC++6.0环境下调用MATLAB6 函数和M文件的方法周立鑫;蔡烽;万林;侯建军;张永胜
【期刊名称】《网络新媒体技术》
【年(卷),期】2003(024)001
【摘要】本文探讨了在Visual C++6.0环境下调用MATLAB6中函数、M文件的方法,介绍了VC++与MATLAB接口库的生成、数据传递方法,并给出了具体应用实例加以说明,实现了在VC++环境下利用MATLAB矩阵处理和绘图功能.
【总页数】3页(P60-62)
【作者】周立鑫;蔡烽;万林;侯建军;张永胜
【作者单位】海军大连舰艇学院航海系,大连,116018;海军大连舰艇学院航海系,大连,116018;海军大连舰艇学院航海系,大连,116018;海军大连舰艇学院航海系,大连,116018;海军大连舰艇学院航海系,大连,116018
【正文语种】中文
【中图分类】TP3
【相关文献】
bWindows/CVI环境下调用MATLAB函数的实现方法 [J], 张福波;张志伟;刘光军
2.VS2005环境下多窗口程序中窗口间成员函数调用实例 [J], 丰立涛
3.在Visual C++中不依赖MATLAB环境调用其函数的方法 [J], 杨建国;刘然
4.VC++6.0环境下基于MFC的打印过程及其函数的构造实例 [J], 鲁佩云;林军
5.信息技术调研数据Excel文件与远程VFP数据库在低网络开销环境下的相互调用 [J], 郭占龙;王永生;肖中杰
因版权原因,仅展示原文概要,查看原文内容请购买。
VC调用matlab的linprog函数-----自己的总结
VC调用matlab的linprog函数-----自己的总结1.编写m文件function [X,f]=lin(f,A,b)[x,fval] = linprog(f,A,b);X=x;f=fval;End保存为lin.m2.将m文件编译为dllmcc -W cpplib:liblin -T link:lib lin.m -v其中,libname为编译后的库文件名,lin.m为matlab的m文件名该命令用于mwArray数据类型生成四个文件(用到的):liblin.ctf liblin.dll liblin.h liblin.lib3.VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件(2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改)----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60(3)针对该工程的设置:工程---->设置----->连接---->对象/库模块:加入mclmcrrt.libliblin.lib(自己制作dll时生成的库文件)注:也可以不在这里设置,在test.cpp文件中加入:#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")(4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)例: min f = -4x1- x2,s.t. -x1+2x2<=42x1+3x2<=12x1-x2<=3x1,x2>=0(1)在matlab中计算:>> f = [-4;-1];>>A = [-1 2; 2 3; 1 -1];>>b = [4;12;3];>>[x,fval] = linprog(f,A,b)(2)在VC中调用dll具体代码:#include <iostream>using namespace std;#include "mclmcr.h"//mwArray类型定义#include "liblin.h"dll的头文件#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")int main(){//初始化程序if(!mclInitializeApplication(NULL,0)){cout<<"Could not initialize the application!";exit(1);}//初始化库if(!liblinInitialize()){cout<<"Could not Initialize the library!";exit(1);}//输入参数f,A,bmwArray A(3,2,mxDOUBLE_CLASS);mwArray f(2,1,mxDOUBLE_CLASS);mwArray b(3,1,mxDOUBLE_CLASS);//输出参数X,fvalmwArray X(2,1,mxDOUBLE_CLASS);mwArray fval(1,1,mxDOUBLE_CLASS);//输入,传给mwArraydouble aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样double bb[]={4,12,3};double ff[]={-4,-1};//给f,A,b赋值A.SetData(aa,6);b.SetData(bb,3);f.SetData(ff,2);//调用函数lin(2,X,fval,f,A,b);//从X,fval取值double* x;double* fv;x = new double[2];fv = new double[1];X.GetData(x,2);fval.GetData(fv,1);//输出结果cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;//关闭库和程序liblinTerminate(); mclTerminateApplication();return 0;}。
VC6.0调用matlab引擎修改版
1.创建dlg:2.成员变量:.h文件添加头文件#include "engine.h"#include <cv.h>#include <highgui.h>添加成员变量mxArray *m_pOrigMatrix, *m_pColorBw, *m_pBw;int m_nHeight, m_nWidth, m_nChannels;BYTE *lpBuf;BOOL* OpenARPAMotionMatrix;Engine *m_ep;IplImage *m_pOrigin;CHAR* buff;3.按键响应函数//处理void CMatlabEngine00Dlg::OnProcessing(){// TODO: Add your control notification handler code hereBYTE *temp;temp = (BYTE*)mxGetData(m_pOrigMatrix);int i, j;for( i=0;i<m_nHeight;i++ )for( j=0;j<m_nWidth;j++ ){temp[i*m_nWidth+j] = lpBuf[i*m_nWidth*3+j*3];temp[m_nWidth*m_nHeight+i*m_nWidth+j] = lpBuf[i*m_nWidth*3+j*3+1];temp[m_nWidth*m_nHeight*2+i*m_nWidth+j] = lpBuf[i*m_nWidth*3+j*3+2];}engPutVariable( m_ep, "Origin", m_pOrigMatrix );engEvalString( m_ep, "[colorBw,bw]=func(Origin);");if( !mxIsUint8(m_pColorBw=engGetVariable(m_ep,"colorBw")) ){MessageBox("colorBw不是BYTE型!");return;}if( !mxIsLogical(m_pBw=engGetVariable(m_ep,"bw")) ){MessageBox("bw不是布尔型!");return;}BYTE* tempone;BOOL* temptwo;tempone = (BYTE*)mxGetData( m_pColorBw );temptwo = (BOOL*)mxGetData( m_pBw );for( i=0;i<m_nHeight;i++ )for( j=0;j<m_nWidth;j++ ){lpBuf[i*m_nWidth*3+j*3] = tempone[i*m_nWidth+j];lpBuf[i*m_nWidth*3+j*3+1] = tempone[m_nWidth*m_nHeight+i*m_nWidth+j];lpBuf[i*m_nWidth*3+j*3+2] =tempone[m_nWidth*m_nHeight*2+i*m_nWidth+j];//OpenARPAMotionMatrix[i*m_nWidth+j] = temptwo[i*m_nWidth+j];}IplImage *m_lpBuf = cvCreateImage( cvSize(m_nWidth,m_nHeight),8,m_nChannels);memcpy( m_lpBuf->imageData, lpBuf, m_nHeight*m_nWidth*m_nChannels*sizeof(BYTE) ); // IplImage *m_OpenARPAMotionMatrix=cvCreateImage( cvSize(m_nWidth,m_nHeight),8,1); //memcpy(m_OpenARPAMotionMatrix->imageData, OpenARPAMotionMatrix,m_nHeight*m_nWidth*sizeof(BOOL) );cvSaveImage( "E:\m_lpBuf.png", m_lpBuf );//cvSaveImage( "E:\m_OpenARPAMotionMatrix.png", m_OpenARPAMotionMatrix );cvReleaseImage( &m_lpBuf );//cvReleaseImage( &m_OpenARPAMotionMatrix );}//初始化void CMatlabEngine00Dlg::OnInit(){// TODO: Add your control notification handler code herem_pOrigin = cvLoadImage( "E:\\123.png" );m_nWidth = m_pOrigin->width;m_nHeight = m_pOrigin->height;m_nChannels = m_pOrigin->nChannels;if( !(m_ep=engOpen(NULL)) )MessageBox( "无法打开MATLAB引擎" );//命令行添加路径engEvalString( m_ep, "path(path,'c:\');" );%测试成功//engEvalString( m_ep, "addpath('c:\');" );%测试不成功unsigned int dims[3];dims[0] = m_nHeight; dims[1] = m_nWidth; dims[2] = m_nChannels;m_pOrigMatrix = mxCreateNumericArray( 3, dims, mxUINT8_CLASS, mxREAL );lpBuf = (BYTE*)malloc(m_nHeight*m_nWidth*m_nChannels*sizeof(BYTE));memcpy(lpBuf, m_pOrigin->imageData, m_nHeight*m_nWidth*m_nChannels*sizeof(BYTE) );OpenARPAMotionMatrix = (BOOL*)malloc(m_nHeight*m_nWidth*sizeof(BOOL));memset( OpenARPAMotionMatrix, 0, m_nHeight*m_nWidth*sizeof(LONG) );}4.m文件(个人经验:输出变量在matlab中强制转换为需要的变量,若在C++中转换,会出错)function [ output1 output2 ] = func2( b )%UNTITLED2 Summary of this function goes here% Detailed explanation goes hereticsubplot(1,3,1);imshow(b);gray=rgb2gray(b);output2=logical(im2bw(gray,0.4));%强制转换output1=uint8(zeros(1024,1024,3));%强制转换a = output2;a(a==1)=60;o utput1(:,:,1)=uint8(a);%强制转换a = output2;a(a==1)=220;output1(:,:,2)=uint8(a);%强制转换subplot(1,3,2); imshow(output1);subplot(1,3,3); imshow(output2);end。
利用VC调用Matlab数学图形函数库
本文针对Matlab应用程序接口,详细论述了在可视化编程环境中,利用VC++调用Matlab数学图形函数库,编制可以独立运行的应用程序。
经过实践证明,可以在很大程度上提高软件开发效率,增加算法的稳定程度。
目前已有一些利用混合编程开发的软件系统:如雷达特性分析、实时预测软件等,在实际中已得到了应用。
一、引言1984年美国的Mathworks公司推出Matlab,到目前为止,它已发展成为国际上最优秀的科技应用软件之一。
其强大的科学计算与可视化功能,简单易用的开放式可扩展环境以及多达30多个面向不同领域而扩展的工具箱(Toolbox)支持,使得Matlab在许多学科领域中成为计算机辅助设计与分析、算法研究和应用开发的基本工具和首选平台。
但是由于其编译器采用伪编译的方式,在Matlab中编写的程序无法脱离其工作环境而独立运行。
针对这个问题,Mathworks公司为Matlab提供了应用程序接口,允许Matlab和其它应用程序进行数据交换,并且提供了C/C++数学和图形函数库,为在其它程序设计语言调用Matlab高效算法提供了可能。
C++语言是新一代的以面向对象(OOP)概念为根本的高级程序设计语言,它的面向对象的概念更加符合程序员开发软件的思维习惯,类封装性和模块化的构造非常适合软件的移植和维护,使用C++开发有助于提高软件工程的质量。
VC++是美国微软公司利用C++的底层机理开发的新一代编译器,与其它一些C++编译器相同,都是以C++语言为编译对象。
VC++在编译速度和代码优化方面,是同类产品的佼佼者,并且绝大多数的软件开发包都提供了对它的接口,这是VC++得到程序员认可的主要原因。
对于理工科研究生和一些偏重于数值计算的工程技术人员,为了能够较好的在短期之内完成一个兼具友善界面和稳定的计算内核的程序,利用软件接口技术,可以借助于第三方的函数库。
二、Matlab应用程序接口MATLAB提供的应用程序接口按目的一般来说可以分为以下三种:1.利用其它应用程序的优点,例如计算速度快和使用已有算法而制定的接口;2.建立MATLAB与其它应用程序间的数据交换;3.拓广MATLAB的应用范围和应用手段。
VC中matlab6.x C++数学库的使用
Category:Preprocessor
Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND
Category: Precompiled Headers
ቤተ መጻሕፍቲ ባይዱ择: Automatic use of precompiled headers
b\win32.
"D:\MatlabR12" 是MATLAB6的按装目录
(3)在: Project->Settings->General->Microsoft Foundation Classes, 选择“Use
MFC in a shared DLL”.
(4) 在: Project->Settings->C/C++->Category (General), 在 Preprocessor Defini
(1)添加自己编写的程序模块
用下面文件头:
#include "stdafx.h"
#include "matlab.hpp"
然后, 按照C++ MathLib文档要求的格式书写程序.
(2)嵌入mcc生成的文件
注:下面这个目录是那些lib所在的地方。
如果都挪到上面的目录,这个自然就不要了。
4、编写程序
用MCC命令生成的CPP文件和自己手工编写的CPP文件, 其项目设置是完全相同的,
程序的语法原则上也是一样的. 只是MCC生成的CPP文件有大量"没用"的代码.
libmx.def
libmat.def
它们位于目录c:\matlab\extern\include
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Vc++6.0调用matlab的数学库函数
前段时间在摸索如何在VC++6.0当中调用Matlab的里的数学库函数。
当时弄得我很是郁闷,现在想想,自已走了很多弯路,原来,是如些的简单。
所以,与出来和大家一起讨论和分享。
一、关于Matlab6.x
首先,matlab它本身也是用C++语言编写的,具是什么是编译器我倒是忘记了(好像是Borland吧)。
说Matlab是一种科学计算语言吧,其实也可以,不过,其实也可以把它看作是一个科学计算软件。
它里面有很多的已写好的数值计算、分析以及统计等的函数。
然后在Matlab里写文件(比如.m文件),文件里的每一个语句其实都是在调用它里面的函数。
说白了,Matlab就是为我们写了一大堆的数学运算函数,然后再能过文档(help指令)来告诉我们怎么调用这些函数,就是这样。
其次,为什么要选择Matlab的6.x版?现在最新的版本好像是7.x了吧,照理说,就应该用最新版的。
可是,最新版的Matlab(7.x)不再把数学库公共了,如果想要调用它里面的函数库,就必须将Matlab在后台运行。
也就是说,不管你用什么语言,只要你想调用Matlab7.x里面的函数,那么你的程序就必须在Matlab运行环境下运行。
哦,刚才忘记说了,这篇日志的目的是要建立独立于Matlab 运行环境的程序。
最后,Matlab6.x已推出七八年了,会不会和7.x版本相比而有点过时了?我是这样理解的,如果你调用的函数不是一些当前数值计算领域的新兴问题,那就是没有问题的。
对于我们工科的人来说,10年前的伟大的mathworks公司绝对可以提供我们想要的计算方法了。
所以,6.x,没问题。
二、关于C++和Matlab混合编程
关于这个主题的文章是非常之多的,足以让你眼花缭乱了。
更让我感到不解的是,有好多人居中然以C++和Matlab混合编程为主题,在正式期刊上发表文章。
不信你可以在知网或万方上搜搜看,呵呵,一大把。
不过,我还是要感谢这些文章啊,因为这些文章让我理解了什么是“灌水”。
所谓的C++和Matlab混合编程大概是指这样的一个过程:
1)在Matlab里写.m文件,当然,这种文件中除了函数好像就没有别的什么了。
2)在Matlab里的命令行中使用mcc命令生成C/C++代码。
当然,还可以直接生成.dll和.lib,这里的.dll和.lib都是C的,不能生成C++的动态链接库(反正文档里是这么说的)。
3)在C/C++编译器中嵌入生成的C/C++源码,或调用生成的.dll。
我说,何必这么麻烦呢?
三、弯路子
如果要按照上面所述的三个步骤来进行C++和Matlab混合编程的话,那就必须要安装Matlab了(要不然怎么编写.m文件和使用mcc命令)。
在安装Matlab的时候,注意,最好是安装在和你的C/C++编译器所在安装目录的同一个目录下,这一点很重要,要不然,你会发现mcc命令不好使。
安装好之后,你就可以按以上的三个步骤来编程了,具体的一些细节,相关的文章实在是太多了,这里就不多说了。
因为,我觉得这是一种弯路方法。
四、言归正传
拜完了“前辈们”,终于轮到我说话了。
其实,不用安装Matlab,不用.m文件。
其实,说到底,Matlab就是为我们写了许多数学计算函数(可以调用的大约在400多个),然后把这些函数放在一个个的动态链接库中。
是的,就是这样理解的,不用想得太多了。
那么既然是这样,我们直接调用这些库不就成了嘛,是的,就是这样的,就是这么简单。
首先,我们需了解matlab的安装目录里都有些什么东西,当然,在这里,我们就只关心它的数学库在什么地方。
是这样的,只用关心两个文件夹:<matlab>/bin和<matlab>/extern(<matlab>指的是matlab的安装目录),是吧,找到了吧,bin这个文件夹,看到这个
名字就知道它是里面一定是一些.dll,果然是这样的,matlab里面的所有c/c++数学库都在这个文件夹里面的。
别外,要想引用这
些.dll,你当然需要相应的.h/.hpp头文件和.lib文件了,那么,在<matlab>/extern/include里面就是头文件,而在
<matlab>/extern/lib就是.lib文件(静态链接库)了。
我们所需要的东西就是这么多了,别的,真的不需要了。
所以,我说,不需要安装matlab了,你直接在一台装有matlab的机器上把这两个文件夹(<matlab>/bin和<matlab>/extern)拷到你的电脑来就行了。
两个matlab的两个官文档是很有用的:MATLAB C++ Math Library User’s Guide 和MATLAB C++ Math Library Reference具体是这两个文档,顾名思义,就不用我说了,如果你发现在网上找这两个文档有困难的话,我的机器上倒是有。
五、总结
虽然,一二三四五这么一串说下来是说了很多没有用的话,不过对于新手来说,应该是有一定帮助的,真的可以节省很多宝贵的时间。
唉,其实真是还有一些比较重的细节的东西没有写出来,比如
c++编译器环境的配制,mwArray和mxArray的困惑,c++函数的调用格式与matlab里调用的异同等,不过,对于新手来说,上面的这些东西已经够烦的了,呵呵。
下午就要回家了,回家过年,就到这里吧。