vc++中调用matlab函数的方法:COM组件
MATLAB与VC++混合编程的研究及应用
MATLAB与VC++混合编程的研究及应用摘要:介绍了三种实用易行的matlab与vc++混合编程方式,即利用matlab的mcc编译器,使用matcom软件转化m文件,使用matlab的com builder工具制作com组件。
针对具体程序分别应用三种方法来实现,对每种方法介绍了详细步骤。
对三种方法进行了分析比较,总结了各自的优缺点,实现了matlab出色的图形处理功能和数值计算能力与vc++强大编程能力的结合。
关键词:matlab;vc++;混合编程中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)10-2353-03matlab是适合多学科,多种工作平台的功能强大的大型数值计算和系统分析软件。
matlab将数值分析、矩阵计算、信号处理和图形显示相结合,包含了大量高度集成的函数,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具,在数值分析、科学计算、算法开发、建模和仿真等方面具有独特优势[1]。
但是matlab使用的是解释性语言,限制了自身的执行速度;程序的执行限制与matlab自身的运行环境,不利于应用程序的开发;gui功能较差。
vc++是强大的windows应用程序开发工具,它提供了高度集成的工具集和可视化集成的编程环境,包括了microsoft的代码优化技术,极大提高了应用程序的设计效率,还提供了复杂的资源编辑器,拥有强大的gui功能[2]。
因此,实现matlab与vc++等可视化程序设计语言的混合编程,提高程序的执行速度,美化应用程序界面,脱离matlab环境,发布独立的应用程序,同时利用matlab在数值分析、矩阵计算、信号处理和图形显示等方面的强大功能,具有重要的意义。
1 matlab与vc++混合编程方法matlab与vc++有多种接口方法,但是一些常见方法难以实现,执行效率低,如matlab engine、直接调用matlab的c/c++数学函数库等。
MATLAB函数的定义和调用方法
MATLAB函数的定义和调用方法引言MATLAB作为一种强大的数学软件,广泛应用于科学、工程和技术领域。
而函数的定义和调用是MATLAB中的基本操作之一。
本文将介绍MATLAB函数的定义和调用方法,帮助读者更好地理解和运用这一功能。
一、MATLAB函数的定义1. 函数的基本概念函数是一种将一组输入转换为一组输出的数学关系。
在MATLAB中,函数是一个独立的代码块,可以在程序中多次被调用和重复使用。
通过定义函数,可以将复杂的计算过程封装起来,提高代码的可读性和重用性。
2. 函数的语法在MATLAB中,函数的定义采用以下语法:```function [输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)函数体end```其中,方括号内的部分表示可选项,可根据实际需要决定是否需要设置输出参数。
函数名可以是任意合法的MATLAB变量名,输入参数和输出参数也可以是任意数据类型。
3. 函数体函数体是函数定义的核心部分,用于实现具体的计算任务。
在函数体内部可以使用MATLAB提供的各种算法和语法,包括数值计算、矩阵运算、条件判断、循环等。
函数体应该被包含在一个代码块(用于控制函数范围的一对关键字)中,代码块的结束由`end`关键字来指定。
4. 输入参数和输出参数输入参数用于传递数据给函数,输出参数用于将计算结果返回给调用函数的地方。
在函数定义中,可以设置多个输入参数和输出参数,用逗号分隔。
输入参数和输出参数的顺序应该按照实际需求来定义,以便于调用函数时进行有效的数据传递。
二、MATLAB函数的调用1. 函数的调用方式在MATLAB中,函数的调用可以通过下面的语法来实现:```[输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)```其中,`[输出参数1, 输出参数2, ...]`是用于接收函数返回结果的变量,可以根据需要定义为不同的数据类型。
C语言环境中调用Matlab程序指南
C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。
本文就对如何在C程序中调用Matlab程序作说明。
在C程序中调用Matlab程序有两大类方法。
第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。
前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。
关于MCR,请见第四章的说明。
至于两种方法需要在C环境中如何配置请见第五章。
而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。
一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。
下面是调用Matlab中的加法程序add.m的例子。
先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。
VC++调用Matlab引擎(engine)配置方法
如何在C/C++语言里调用Matlab引擎(engine)——(上篇)windows下的Visual C++平台Windows下调用Matlab引擎要做好以下三点设置(1)设置头文件目录(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3)设置环境变量以下以Visual Studio 2008为例来说明如何设置这三点:1、添加头文件目录依次选择:“工具”->“选项”,调出对话框后再在对话框左边“选择项目和解决方案”->“VC++目录”然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我的是:C:\Program Files\MATLAB\R2011a\extern\include如果现在生成项目,链接将不会通过,比如可能会出现:1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。
C#与Matlab混合编程的几种方式
C#与Matlab混合编程的几种方式主要参考资料: 《Matlab C# Book》,我看的是第一版的电子书,网上可以搜到。
说实话,我觉得C#与Matlab混合编程相比VC与Matlab混合编程没有啥优势,基本上还是通过P/V Invoke操作Matlab mcc编译器生成的C语言版本的DLL。
此外,速度上也慢的吓人-_-下面简单写写C#与Matlab混合编程的4种方式(可能还不够全,欢迎补充):1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC 和VC2008(注意如果使用做应用的话,建议编译器选VC2008,否则C #中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h 文件中有导出的函数原型。
4) 建立C#工程,并将前面的dll拷贝到合适路径,使用[ DllImport( "myplusl ib.dll ", CallingConvention = CallingConvention.Cdecl)] 将.h文件中的函数使用C#的语法声明。
一般来说,这些函数中会有**Initialize,**Terminate和M文件中定义的函数(**代表lib名称)。
5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。
该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。
使用VC调用matlab_engine编程
关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。
Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。
调用使用的函数是:engEvalSting。
下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。
我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。
(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。
Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库
本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。
<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。
VS 2010调用matlab 2010
再次编译,运行程序如下:
手把手教你学 VS 2010 调用 MATLAB 函数
点击“plot”按钮,就绘制出一个正弦曲线。
好了,先讲到这里吧。没来的急检查,先发出来吧!要是还有疑问,请加我的 QQ 群吧: 128229028。记住啊:Work time, no disturbance. 祝大家在学习编程的里程中一帆风顺!
点击“环境变量”按钮,出现下页的对话框。点击系统变量下得新建按钮,弹出“编辑系统变 量对话框” , 假设 VS 装在 D 盘, 变量名随便取一个, 变量值设置为 “D:\Program Files\Microsoft Visual
手把手教你学 VS 2010 调用 MATLAB 函数
Studio 10.0\VC\bin” (以实际的编译器位置为准哦! ) 。完成后点击确定。
4. 动态库调用示例 新建一个工程,工程名:test,建立一个基于对话框的程序。对话框上加一个按钮,取名“plot” 。 在 testmtDlg.cpp 文件中加入如下标灰色背景的代码。
#include "stdafx.h" #include "testmt.h" #include "testmtDlg.h" #include "afxdialogex.h" #include "test.h" //#pragma comment(lib,"libmx.lib") //#pragma comment(lib,"libmat.lib") //#pragma comment(lib,"libeng.lib") #pragma comment(lib,"mclmcrrt.lib") #pragma comment(lib,"test.lib") ……………….. BOOL CtestmtDlg::OnInitDialog() {
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命令提示符后执行上述命令,重新注册。
matlab函数定义与调用
matlab函数定义与调用
Matlab函数定义与调用
MATLAB(Matrix Laboratory)函数是指在MATLAB编程环境中定义或
编写的可以重复使用的一组代码片段。
它既能利用现成的工具(例如Mathworks公司提供的Libraries),也能从头开始编写自己的函数。
定义和调用MATLAB函数的常用方法如下:
1、定义MATLAB函数:
定义MATLAB函数需要按照以下步骤:
(1)新建一个函数:
在MATLAB中,可以通过在MATLAB命令行输入“edit functionname.m”的命令来新建一个函数。
(2)编写函数代码:
在函数顶端,注明函数名称、函数参数格式,函数语句及函数返回值
类型。
(3)保存函数代码:
使用“save functionname.m”命令将函数代码保存为*.m文件,并保
证该函数文件已放置在MATLAB搜索路径中。
2、调用MATLAB函数:
在MATLAB中,若要调用自定义函数(包括自定义和现有函数库中的函数),只需输入“functionname(input1,...,inputN)”的命令即可,
并且可以给函数传递不定数量的参数,以满足不同需求。
此外,在调
用函数之前,也可以先设置函数参数以指定函数行为,这样可以实现
函数可配置性。
总之,MATLAB函数定义与调用是MATLAB编程中常用的两种方式,
它们具有灵活性和可重用性,并且可以让程序编写变得更加简单。
MATLAB的函数定义和调用的步骤既可以来自于现有的函数库,也可以
从零开始自定义,以满足多种不同的编程需求。
c++调用matlab函数
一、问题描述有关在C++程序中使用MATLAB编译产生的动态链接库DLL,看了好多帖子,感觉描述的不尽详细,调试过程费了好多劲,现在用文字和图片的形式记录一下自己学习的过程。
MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。
这里以调用C++接口的DLL中的函数为例来介绍。
在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。
所以问题归结为如何在C++程序中使用mwArray。
在这个例子中,输入输出都是矩阵,至于标量,可以作为矩阵的一行或一列传递。
二、实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。
为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。
三、实现环境:Windows xp 2002 sp3Matlab 2008b 安装路径:D:\Program Files\MATLAB\R2008bVs 2008 sp1 安装路径:D:\Program Files\Microsoft Visual Studio 9.0四、配置matlab生成dll文件:1.在matlab 中选择C++编译器>> mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?nSelect a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005[5] Microsoft Visual C++ 2005 Express Edition[6] Microsoft Visual C++ 2008[0] NoneCompiler: 6The default location for Microsoft Visual C++ 2008 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? nPlease enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0Please verify your choices:Compiler: Microsoft Visual C++ 2008Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? Y******************************************************************* *********Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.******************************************************************* *********Trying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone . . .>>2.编写m文件编写myadd2.m文件(如下),保存在D:\My Documents\MATLAB目录下;同时把该目录设置为matlab当前目录。
c_调用matlab函数(混合编程)
第2部分实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs2008.2.1.1 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。
%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------两个输入参数,两个输出参数,并且都是矩阵形式(2)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。
获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。
本实例中给它添加了MatrixOpera等函数。
class方法(4)完了之后就可以编译了。
编译出来后需要一两分钟的时间。
编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。
手把手教你用C#调用MATLAB函数
】【【转载】手把手教你用C#调用MATLAB函数编译环境:Microsoft Visual Studio2008版本9.0.21022.8RTM Framework版本 3.5已安装的版本:ProfessionalMicrosoft Visual Basic200891986-031-5000002-60050Microsoft Visual Basic2008Microsoft Visual C#200891986-031-5000002-60050Microsoft Visual C#2008Microsoft Visual C++200891986-031-5000002-60050Microsoft Visual C++2008Microsoft Visual Studio2008Tools for Office91986-031-5000002-60050Microsoft Visual Studio2008Tools for OfficeMicrosoft Visual Web Developer200891986-031-5000002-60050Microsoft Visual Web Developer2008Crystal Reports AAJ6G-K0MSA4K-680002ZCrystal Reports Basic for Visual Studio2008Matlab2008b首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild-setup 显示如下>>mbuild-setupPlease choose your compiler for building standalone MATLAB applications:,Would you like mbuild to locate installed compilers[y]/n?n%选择nSelect a compiler:[1]Lcc-win32C2.4.1[2]Microsoft Visual C++6.0[3]Microsoft Visual C++.NET2003[4]Microsoft Visual C++2005[5]Microsoft Visual C++2005Express Edition[6]Microsoft Visual C++2008[0]NoneCompiler:6%选择6,其他编译器可以选相应的选项,我没有验证过The default location for Microsoft Visual C++2008compilers is C:\Program Files\Microsoft Visual Studio9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio9.0anyway[y]/n?n%选择nPlease enter the location of your compiler:[C:\Program Files\Microsoft Visual Studio9.0] D:\Program Files\Microsoft Visual Studio9.0%选择您自己的当前安装路径Please verify your choices:Compiler:Microsoft Visual C++2008Location:D:\Program Files\Microsoft Visual Studio9.0Are these correct[y]/n?y%看上述信息,如果正确选择y**************************************************************************** Warning:Applications/components generated using Microsoft Visual Studio2008require that the Microsoft Visual Studio2008run-timelibraries be available on the computer used for deployment.To redistribute your applications/components,be sure that thedeployment machine has these run-time libraries.**************************************************************************** Trying to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%至次编译器设置完成%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在matlab的Command window中输入:>>deploytoolMatlab产生deployment tool配置窗口单击新建按钮,新建工程------>选择MATLAB Builder NE选项卡----->选择.NET Component 并添加工程名eaqual(测试用名,其实工程名称就是你导入C#后的命名空间名称,Matlab会在当前工作目录中新建文件夹文件夹名既为equal)---->点击ADD File按钮将你需要编译的MATLAB函数添加进当前工程,我这里导入的是D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m文件---->点击build.deployment tool output窗口输出以下信息:Build output(2009-03-2815:32:55).[url=matlab:mcc%20-F%20%27E:%5CMATLAB%5Ceaqual.prj%27]mcc-F 'E:\MATLAB\eaqual.prj'[/url]等待...................................有点久当输出以下信息时编译成功了Compiler version:4.9(R2008b)Warning:Duplicate directory name:E:\MATLAB.mcc-W 'dotnet:eaqual,Eaqual,0.0,private'-d'E:\MATLAB\eaqual\src'-T'link:lib'-v'class{Eaqual:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m}'Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Processing D:\Program Files\MATLAB\R2008b\toolbox\aero\mcc.enc Processing D:\Program Files\MATLAB\R2008b\toolbox\matlab\mcc.enc Processing include files...2item(s)added. Processing directories installed with MCR...The file E:\MATLAB\eaqual\src\mccExcludedFiles.log contains a list of functions excluded from the CTF archive.2item(s)added.Generating MATLAB path for the compiled application... Created40path items.Begin validation of MEX files:Sat Mar2815:35:112009End validation of MEX files:Sat Mar2815:35:112009Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Deleting0temporary MEX authorization files.Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\deployprint.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\printdlg.m"(Referenced from:"Compiler Command Line").Generating file"E:\MATLAB\eaqual\src\Eaqual.cs".Generating file "E:\MATLAB\eaqual\src\EaqualNative.cs".Generating file "E:\MATLAB\eaqual\src\readme.txt".Generating file "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs".Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqual.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqual.dll" "E:\MATLAB\eaqual\src\Eaqual.cs""E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqualNative.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqualNative.dll""E:\MATLAB\eaqual\src\EaqualNative.cs" "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Copying:E:\MATLAB\eaqual\src\eaqual.dll->E:\MATLAB\eaqual\distribCopying:E:\MATLAB\eaqual\src\eaqualNative.dll->E:\MATLAB\eaqual\distrib Copying:E:\MATLAB\eaqual\src\readme.txt->E:\MATLAB\eaqual\distribCompilation completed succesfully.The output is located in E:\MATLAB\eaqual\distrib.You can package the component by clicking on the"ackage"icon in the Deployment Tooltoolbar,or by clicking the Tools->ackage menu when the Deployment Tool panel is selected.To include additional files in the package,click Project->Settings).生成的文件在工程文件夹里面我的是E:\MATLAB\eaqual\distrib\angle2quat.dll至此MATLAB的操作全部完成打开VISUAL Studio2008新建C#工程我这里用的是控制台名为TestOfmatlab_consolt我的是E:\Visual Studio2008\Projects\TEST\TestOfmatlab_consolt添加引用E:\MATLAB\eaqual\distrib\angle2quat.dll和D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll(这里我没有用MATLAB画图,所以只引用MWArray.dll)加入命名空间:using .Arrays;将下面代码加入Main函数eaqual.Eaqual eq=new eaqual.Eaqual();.Arrays.MWArray m=10,n=4,j=7,k;MWArray S="XYZ";k=eq.angle2quat((MWNumericArray)m,(MWNumericArray)n, (MWNumericArray)j,(MWCharArray)S);MWNumericArray temp=(MWNumericArray)k;double[,]location=(double[,])temp.ToArray(MWArrayComponent.Real);Console.WriteLine(location[0,0].ToString());Console.WriteLine(location[0,1].ToString());Console.WriteLine(k[2].ToString());Console.WriteLine(k[3].ToString());Console.WriteLine(k[4].ToString());Console.ReadLine();编译运行即可看到输出,此函数是姿态角转四元数函数,具体功能就不做说明了。
VB调用Matlab制作的COM组件实现二者混合编程
4、Matlab中处理返回结果并使用它进行进一步计算或可视化等操作。
四、注意事项
在使用基于COM的VB与Matlab混合编程时,需要注意以下几点:
1、确保VB COM接口和Matlab代码之间的兼容性。这通常需要对两种语言进 行适当的转换和映射。
2、COM接口的创建和实现可能需要耗费大量时间和精力,因此需要仔细规划 和设计。
4.处理异常
在调用Matlab函数时,你可能会遇到各种异常情况,例如参数类型不匹配、 参数数量不匹配等等。为了处理这些异常,你需要在VB代码中使用异常处理机制:
result = myMatlabObject.YourFunctionName(input1, input2)
' Handle the exception here
1、创建Matlab COM组件
首先,我们需要创建一个Matlab COM组件。打开Matlab,编写你希望从VB 调用的函数,例如一个用于图像处理的函数。然后在命令窗口中输入以下命令以 创建COM组件:
这将打开COM工具箱。在“新建项目”窗口中,选择“COM库”,然后输入库 名和位置。接下来,添加你的Matlab函数到库中。
在这个例子中,如果myMatlabObject.YourFunctionName(input1, input2) 抛出一个异常,那么这个异常会被Catch块捕获,并可以进一步处理。
5.在VB中使用返回值 在你的Matlab函数返回值后,你可以在VB中使用它。例如:
在这个例子中,如果result不是Nothing,那么你可以进一步使用这个结果。 6.错误检查和清理
1、创建 MATLAB函数:首先
例如: function obj = MyClass(x) function result = add(obj, y)
基于COM技术的C_与Matlab混合编程
—87—基于COM 技术的C#与Matlab 混合编程姚光强,陈立平(国家农业信息化工程技术研究中心,北京 100097)摘 要:提出基于组件对象模型(COM)技术实现Visual C#与Matlab 混合编程的2种方法,一种是通过C#使用Matlab 提供的自动化服务,另一种是使用Matlab COM Builder 将M 语言文件编译成COM 组件供C#调用。
以地理信息系统中常用的空间插值分析为例给出了这2种方法的具体实现。
对两者进行比较,提出了各自的适用范围。
结果表明使用COM 技术实现混合编程能充分发挥Visual C#与Matlab 各自的特点,提高程序开发和运行效率。
关键词:Visual C#语言;Matlab 软件;混合编程;组件对象模型Integrated Programming Between C# and Matlab Based onComponent Object ModelYAO Guang-qiang, CHEN Li-ping(National Engineering Research Center for Information Technology in Agriculture, Beijing 100097)【Abstract 】Two approaches of integrated programming based on Component Object Model(COM) are introduced. One utilizes the automation server provided by Matlab. The other compiles the Matlab program written in M scripting language to component by using Matlab COM builder,then invoking it in Visual C#. The usual spatial interpolation algorithm in GIS is implemented by these two approaches. The advantages and defects of them are discussed, and the adaptive application range is suggested. The result is that the COM based methods for integration, which make full use of the two platforms, can speed up software development and improve its performance. 【Key words 】Visual C#; Matlab; integrated programming; Component Object Model(COM)计 算 机 工 程Computer Engineering 第34卷 第14期Vol.34 No.14 2008年7月July 2008·软件技术与数据库· 文章编号:1000—3428(2008)14—0087—03文献标识码:A中图分类号:TP3111 概述Matlab 是一种专门以矩阵形式处理数据的科学计算软件,广泛地应用于数值分析、控制系统、图像处理、数字信号处理等领域的分析、仿真和设计。
VC++调用Matlab实现图像处理的3种常用方法比较
A sr c :Cal g M a l b i bt t a l n ta n VC+ 4 e v r n n o p o e s i g s i a e f c i e s o tu y Th s p p r i to u e i - n i me t t r c s ma e s fe t h r c t wa . o v i a e n r d c s t r e c mmo t o s f rc mb n d p o r mmi g b t e h e o n me h d o o i e r g a n ewe n VC 4 a d M a l b Th h e o - 4- n t . a e t r e c mmo t o s a o t Ma lb n me h d d p ta e gn ,M ATCOM o i ra d COM u l e .Th h e t o sa ec mp r d a d r s a c e e al nt e a p c so l w n ie c mp l n e B i r d et r eme h d r o a e n e e r h d i d t i i h s e t ffo n r aia i n a a e c a g ,f n t n c l,r n ig r t ,g a h ci g u c i n s p o ta d p o r m e e s . Th d a t g s e l t ,d t x h n e u c i al u n n a e r p i ma e f n t u p r n r g a r l a e z o o o ea v na e
董 建 婷 ,王 杰
( 京 空 间 机 电研 究所 , 京 北 Mal c t b实现 图像 处理 是 一 种 快 捷 高 效 的 方 法 。针 对利 用 Mal a t b引 擎、 用 MA C M 编 译 器 a 利 T O
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;}。
Visual C++调用MATLAB建造模糊专家推理系统
Vsa c++调用 MA L i l u T AB建 造模糊专家推理系统
王 庆香 , 等
Vsa C+ +调 用 MA L B建造 模 糊 专 家推 理 系统 i l u TA
王庆 香 , 炳达 孙 ( 广州 中医药大学信息技术学院 广州,145 500 ) ( 东技 术 师 范学院 广 州 ,10 0 广 50 0 )
( 符号计算、 图像处理 、 优化 、 统计和控制等工具箱) 两 大部分构成 , 在这些专业工 具 中含有丰富相关专业领 域的算法 , 运用这些算 法很 容易实现专业领域 的科学 计算 。其中模糊逻辑工具 箱含有很多模糊逻辑运算 和 推理的函数。它提供了创建 和编辑模糊推理 系统的一
种工 具 。
t n u e eo igt . y a d c td v lpn i me
Ke r s: u z x ets s m ; y wo d F zye p r yt e MATA B; M o o e t Ifrn e I CO c mp n n ;nee c
中圈分类号 :P8 T 11
fz o lo ho g M.T ers l s o sta eme o su e eeice s zye p r sse rl bl u z tob x tru hCO y h ut h w t t d sdh r n ra ef z x et y tm ei i- e h t h h u a i
sr c u r r s n e . i i a s p cf d a o t Vi a + + c l n u z n ern u cin i t t r a c p e e td t s l s e i e b u s lC u e o i u a i g f z y i fri g f n t n MAT AB l o L
C#调用matlab
C#调用matlab(转载)收藏.net是微软的发展方向,以后我们开发软件的时候不免会调用一些matlab语言今晚一直在***图用c#调用matlab,终于成功。
主要思想就是首先把matlab的m函数做成com组件,然后在c#中应用此com组件,即可。
主要步骤如下:1.建一个m文件(test.m)例如:function test(h,D)for x=-10:0.1:10,if x>Dy=h;hold on;plot(x,y)elseif x<-Dy=-h;hold on;plot(x,y)elsey=h/(D*x);hold on;plot(x,y)endend2.在matlab中输入comtool命令,就打开了matlab com builder,点击file-new project,新建一个工程,在component name里输入名字点击ok就行了。
然后点击project--Add files,将test.m添加入工程,然后点Build-Com Object,就会在comtest\distrib\文件夹下生成一个test1_0.dll(它就是做好的com组件),Build时matlab已经自动将此dll在注册表中注册我们还需做一个准备工作,进入<matlabroot>/ bin/win32目录下(matlabroot为你机器上matlab安装的路径),打regsvr32 mwcomutil.dll ,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。
3.c#下实现调用新建一个c#项目(我采用的是2003),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到test_1_0 .dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择然后编写程序test.testclassClass st=new test.testclassClass();object m=1,n=2;st.test(m,n);即可然后在c#中就出现了我们所想得到的图形,呵呵。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在利用vc++编程时,常需要一些特殊的数学函数,因此可以调用matlab中的强大的数学函数,通常使用的方法有引擎和com方法。
下面对此两种方法进行简单介绍。
1。
引擎,如何设置?matlab安装在c:\matlab6p5操作系统:windows2000(1)在vc中把“工具”-〉“选择”菜单中的“目录”选项卡中设置好include(C:\MATLAB6P5\EXTERN\INCLUDE),executable files(c:\matlab6p5\bin\win32)和library(C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60)目录,包括进来上面这两个目录。
(2)在C:\MATLAB6p5\bin\win32\mexopts下双击msvc60opts.bat和msvc60engmatopts.bat(3)在vc中把“工程”-〉“设置”选项卡中的Link的“对象/模块库”中再加上以下内容:libeng.lib libmat.lib libmatlb.lib libmatlbmx.liblibmex.lib libmmfile.lib libmwarpack.lib libmwlapack.liblibmwmcl.lib libmwrefblas.lib libmwservices.lib libmwsglm.liblibmx.lib libut.lib mclcommain.lib sgl.lib(4)最后在编写程序时加入这么一句预编译语句#include<c:\matlab6p5\extern\include\engine.h>2。
com组件首先,设置合适的编译器。
在MATLAB命令窗口里敲:mbuild–setup和mex–setup,完成编译器的设置。
●Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers[y]/n?y●Select a compiler:[1]Lcc C version2.4in C:\MATLAB7\sys\lcc[2]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:2●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):y●Try to update options file:C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R14\compopts.batFrom template:C:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.batDone...-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcomutil.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcomutil.dll succeeded-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcommgr.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcommgr.dll succeeded●Please choose your compiler for building external interface(MEX)files:Would you like mex to locate installed compilers[y]/n?y●Select a compiler:[1]Digital Visual Fortran version6.0in C:\Program Files\Microsoft Visual Studio[2]Lcc C version2.4in C:\MATLAB7\sys\lcc[3]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:3●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):yTry to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.batFrom template:C:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.batDone...1.设置系统路径。
我的电脑->属性->高级->环境变量->系统变量->Path选项,增加以下路径:头文件:C:\MATLAB7\extern\include;库:C:\MATLAB7\extern\lib\win32\microsoft\msvc60;DLL:C:\MATLAB7\bin\win322.做一个简单的M函数(只能是函数不能是文件)。
文件名和函数名一致。
运行并测试此文件的正确性。
function plot_test(result)plot(result);%画图3.在命令窗口敲comtool,出现com组件builder。
选择FILE选项->New Project选项。
Component name选项:设置com组件的名称,注意不要和上面添加的m文件重名。
Class name选项:设置类名称。
一般将鼠标点击空白位置,系统会自动生成类名。
Project version选项:版本号。
系统默认为1.0,将来要修改或添加其他函数时,可以修改此选项为2.0,3.0等。
Project directory选项:工程所在目录。
Complier options选项:编译器配置选项,全部选中。
最后单击OK。
系统会出现对话框,问你是否创立工程目录,你选YES。
4.单击Project Files->plotclass->M-files,然后选中comtool菜单Project->Add File选项,添加上面写好的plot_test M函数。
5.单击Build按钮,选中Com Object选项,这时com-builder会帮你自动编译连接该组件,生成所需要的头文件,源文件,接口描述文件,动态连接库文件,等等。
在右侧Build Status显示框里给出了编译的过程和信息。
在菜单Component->Component Info里有关于接口、类、库的信息。
在C:\MATLAB7\work\plot文件夹里,出现了两个子文件夹,distrib和src,这是我们VC中需要用到的文件、库、资源、接口等。
在src->plot_idl_i.c中,有关于com 类和com接口的GUID。
其中CLSID(类的GUID)在VC编程中需要用到。
6.打开VC++编译器,选择文件->新建->工程->MFC(exe)->命名(plot)->单文档->完成。
我们在资源Toolbar里建立两个按钮,一个用于启动COM(OLE),获得接口指针;另一个用于调用绘图(plot_test)命令。
用查看->类向导建立,在CplotView类里建立command消息映射。
7.再次打开类向导,在Add Class选项内,选中From a typed library,进入C:\MATLAB7\work\plot\src文件夹,选中plot_idl.tlb文件,点击打开 OK。
这时一个COM类便加入进来了,查看一下Iplotclass类。
里面有些,我们想要的东东。
8.下面就是OLE调用的基本方法了,具体可以参见MSDN。
首先在CplotApp类的InitInstance()里添加初始化OLE代码。
BOOL suc=AfxOleInit();//初始化OLEif(suc==FALSE){::AfxMessageBox("初始化OLE失败!");}其次,在CplotView里包含plot_idl.h,math.h头文件,并定义常量PI;并从C:\MATLAB7\work\plot\src\plot_idl_i.c中拷贝类的GUID并复制到PlotView.h文件类定义的上面。
#include"plot_idl.h"#include"math.h"#define PI3.1415926535897const CLSID CLSID_plotclass= {0xAED07AAF,0x3190,0x4996,{0xAD,0xD6,0x31,0xF9,0x45,0x41,0xB1,0xC5};再次在构造函数CPlotView()的上面定义类全局对象;Iplotclass plot;然后,OnStart()函数里添加获得COM指针的函数,代码如下:plot.CreateDispatch(CLSID_plotclass,NULL);//创立接口COleDispatchDriver();//连接(此句可以不写)然后,在OnPlot()函数里添加绘图代码,代码如下,这里关于VARIANT变量的用法说明请参照MSDN。
const int N=100;//数组大小double a[N];//数组定义double f=50;//正弦信号频率double Ts=0.002;//采样时间//赋值for(int i=0;i<N;i++){a[i]=sin(2*PI*f*i*Ts);}//任意变量VARIANT x;VariantInit(&x);//初始化x.vt=VT_ARRAY|VT_R8;//类型(数组,双精度型)SAFEARRAYBOUND rgsabound[1];rgsabound[0].cElements=N;//数组所含元素数rgsabound[0].lLbound=0;//数组上界//创立数组x.parray=SafeArrayCreate(VT_R8,1,rgsabound);//创立一维数组//锁定数组SafeArrayLock(x.parray);//数组传递数据x.parray->pvData=a;//调用方法plot.plot_test(x);//解锁SafeArrayUnlock(x.parray);最后,在析构函数~CPlotView()里添加释放接口和资源的代码。