vc调用matlab工具箱实例

合集下载

vc++中调用matlab函数的方法:COM组件

vc++中调用matlab函数的方法:COM组件

在利用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.设置系统路径。

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

VC++调用MatLab数学库接口设计

VC++调用MatLab数学库接口设计
W A u .u , I i u NG n ri LU L. n j
( . h 4 hR s r s t e f C T 跏i z a g 1 T e5 t e a hI tu E C, j h n e c n i to i u a O o8 , i ; 5o 1 n a 2 H bi n e i cn m c T d , h i h a gH bi 5 0 1 C i ) . e i r t o oo i e U v s y fE s& r e S i zu n e 0 6 。 hn a j a e0 a
M t b库文 件 的发 布 等 内容 。 aa L 关 键词 V +; a a 态 库 ; 号 处 理 函数 C+ M t b动 L 信 中图 分 类 号 T 94 N 1 文 献 标 识 码 A
The M eh d o t o fVC ++ CalM a La a h Li l t b M t b
0 引 言
M ta a b的信 号 处 理 工 具 箱 提 供 了经 典 信 号 处 L
理 的大部分 方法 , 于 电子对 抗 专 业 的研 究 人 员 来 对 说是 一个非 常优 秀 的 算 法研 究 和 辅 助设 计 的工 具 。 但是 安 装 M ta a b对 计 算 机 的 配 置 要 求 较 高 , L 且 M ta aLb为解 释性语 言 , 以工 程 上一 般 不 用 M ta 所 a b L
维普资讯
专 题 技 术 与工 程 应 用
V C+ +调 用 MaL b数 学 库接 口设 计 ta
王 俊 蕊 刘 力 军 ,
( .中国电子科 技集 团公 司第 5 1 4研 究所 , 河北 石 家庄 00 8 ; 50 1
2 河北经 贸 大学 , . 河北 石 家庄 0 0 6 ) 50 1

C语言环境中调用Matlab程序指南

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)配置方法

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)步就解决这个问题的。

Vc++下如何利用Matlab工具箱进行数字信号处理

Vc++下如何利用Matlab工具箱进行数字信号处理

Vc++下如何利用Matlab工具箱进行数字信号处理【摘要】这篇文章将介绍在Vc++下如何利用Matlab工具箱进行数字信号处理。

我们将介绍Matlab工具箱的基本概念,然后深入探讨数字信号处理的基本概念。

接着,我们会详细讲解使用Vc++调用Matlab工具箱的步骤,并通过数字信号处理实例演示来加深理解。

我们还会探讨优化算法在数字信号处理中的应用。

通过本文的学习,读者将了解Vc++下利用Matlab工具箱进行数字信号处理的优势,并展望未来在数字信号处理领域的发展。

通过结合实际案例和理论知识,读者可以更好地掌握数字信号处理技术,提高工程实践能力。

【关键词】Vc++, Matlab工具箱, 数字信号处理, 调用步骤, 实例演示, 优化算法, 优势, 发展展望1. 引言1.1 介绍Vc++下如何利用Matlab工具箱进行数字信号处理在Vc++下利用Matlab工具箱进行数字信号处理是一种非常有效的方法。

Matlab工具箱提供了丰富的数字信号处理工具,包括滤波器设计、信号分析、频谱分析等功能,可以帮助用户快速高效地处理数字信号。

在本文中,我们将介绍Matlab工具箱的基本概念,数字信号处理的基本概念,以及如何使用Vc++调用Matlab工具箱进行数字信号处理。

我们还将通过一个数字信号处理实例演示,展示优化算法在数字信号处理中的应用。

我们将总结Vc++下利用Matlab工具箱进行数字信号处理的优势,并展望未来在数字信号处理领域的发展。

通过本文的学习,读者将能够了解如何在Vc++环境下利用Matlab工具箱进行数字信号处理,并掌握相关的技术和方法。

2. 正文2.1 Matlab工具箱的介绍Matlab工具箱是一款功能强大的工具,专门用于进行数字信号处理。

它包含了许多专业的算法和函数,可以帮助用户高效地处理各种信号数据。

Matlab工具箱涵盖了从信号采集、分析到处理的全过程,为数字信号处理提供了强大的支持。

在Matlab工具箱中,用户可以找到各种常用的信号处理功能,如滤波、频谱分析、傅里叶变换等。

C++调用matlab动态库

C++调用matlab动态库

C++调用matlab动态库环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b1. matlab中dll创建1.1 m文件编写function t = func(file)t=2;end将M文件保存为func.m,保存在d:/test文件夹中。

1.2 设置编译器在Matlab主窗口中将当前文件夹改为d:/test。

为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mex -setup然后出现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] Lcc-win32 C 2.4.1 in D:\PROGRA~1\Matlab\sys\lcc[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0[0] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n?键入y后回车,出现*************************************************************** ************Warning: MEX-files generated using Microsoft Visual C++ 2008 requirethat Microsoft Visual Studio 2008 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLAB users, be sure that they have the run-time libraries.*************************************************************** ************Trying to update options file: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB \R2010b\mexopts.bat From template:D:\PROGRA~1\Matlab\bin\win32\mexopts\msvc90opts.bat Done . . .*************************************************************** ***********Warning: The MATLAB C and Fortran API has changed to support MATLABvariables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at:/doc/35346238.html,/support/solutio ns/en/data/1-5C27B9/?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.*************************************************************** ***********如果出现以上说明,则证明Matlab编译器设置成功了。

Vc++下如何利用Matlab工具箱进行数字信息信号处理

Vc++下如何利用Matlab工具箱进行数字信息信号处理

Vc++下如何利用Matlab工具箱进行数字信息信号处理潘卫明;赵敏
【期刊名称】《电脑与信息技术》
【年(卷),期】2000(008)006
【摘要】详述了在Vc环境下利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎,Matlab自身的编译器,以及利用MathTools公司的Matcom进行对工具箱函数的调用。

【总页数】4页(P28-31)
【作者】潘卫明;赵敏
【作者单位】南京航空航天大学测试工程系;南京航空航天大学测试工程系
【正文语种】中文
【中图分类】TN911.72
【相关文献】
1.利用Matlab神经网络工具箱在VC++中进行形状识别 [J], 鹿文鹏;刘巍;孟祥增
2.VC++下如何利用Matlab工具箱进行数字信号处理 [J], 高飞
3.Vc++下如何利用Matlab工具箱进行数字信号处理 [J], 黄玉妍
4.Vc++下如何利用Matlab工具箱进行数字信号处理 [J], 李自清
5.利用Matlab工具箱进行数字信号处理 [J], 李自清
因版权原因,仅展示原文概要,查看原文内容请购买。

使用VC调用matlab_engine编程

使用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 引擎两种方式)文库

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 中调用。

在C++中调用Matlab

在C++中调用Matlab
5)将Matlab中的运行结果回传给C、C++
二、程序实现
我们通过一个简单的程序demo.c来说明C、C++对Matlab的调用。
#include
#include
#include
#include
/*在头文件中加入engine.h。其包含了调用的Matlab函数声明。*/
#include "engine.h"
在c,c++中调用Matlab
在பைடு நூலகம்,c++中调用Matlab
在C、C++中调用Matlab
Matlab是美国MathWorks公司的产品,是一种以矩阵为基本编程单位的高效数值计算语言。Matlab集科学计算、图像处理、声音处理于一体,为用户提供了丰富的Windows图形界面设计方法,使用户能够在利用其强大数值计算功能的同时设计出友好的图形界面
engClose(ep);
mxDestroyArray(a_ptr);
return(0);
}
当然,该程序在编译之前还需设置一些环境参数。在不同的开发环境中,其设置方法略有差异,我们以Borland C++ builder开发平台为例加以说明。
1)首先必须完成Matlab中链接库的导入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定义文件,在DOS环境中对它们执行命令:
另一种方式是选择将一个自定义的数据结构复制到mxArray中,值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
3)调用engPutArray函数将矩阵放入到Matlab工作区中。

Matlab CC++函数库介绍及应用举例

Matlab CC++函数库介绍及应用举例

经过实践证明,可以在很大程度上提高软件开发效率,增加算法的稳定程度。

目前已有一些利用混合编程开发的软件系统:如雷达特性分析、实时预测软件等,在实际中已得到了应用。

一、引言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++下如何利用Matlab工具箱进行数字信号处理

VC++下如何利用Matlab工具箱进行数字信号处理
计算机光盘软件与应用
多媒体技术 及应 用 C m u e D S fw r n p l c t o s o p t r C o t a e a d A p ia in 21年第 8 02 期
V + 下如何利用 Mal 工具箱进行数字信号处理 C+ tb a
高飞
( 渤海船舶 职业学院教 育技 术 中心 ,辽宁葫芦岛
的基 础 上 学 以致 用 。
连续信号是指时间连续 、 幅度连续 的信号 , 也称之为模拟 信 号。数字信号则是指在时间和幅度上都离散 的信号 。 在计算 机中只能处理数字信号 , 模拟信号必须经过采样和量化后 , 即 变为数字信号 , 才能够被计算机处理 。 对模拟信号进行时间域 的采样就得到 了时 间域离散 的采样信号 。 若采样速率满足 内奎 斯特采样定理 ,即采样速率大 于等于模拟信 号的最 高频率 的 2 倍, 那么模拟信号可 以由采样序列构成的时间离散信号无失真
中图分类号 :T 33 文献标识码 : P9 A 文章编号 :10- 59( 1) 8 07- 2 07 99 2 20- 16 0 0
v +是微软公司开发的一个 IE 集成开发环境) 换句话说, C+ D( , 就是使用 c + + 的一个开发平台。有些软件就是这个编 出来的。另 外还有 、 ,v , 『 F 只是使用不同语言。但是,V +是在微软的操作 B C+ 系统上 的 c + + 编程环境, 学习 V c就要 了解很多计算机专业的知识 以及微软操作平台的使用。还要掌握一些端 口操作的知识,能够 实现软件仿真 、硬件检测的功能,是需要很高的专业技能。如果 要借助于微软的操作系统, 就要了解 w n o s id w 的特性以及在此基 础上的函数调试知识, 还要掌握 M C F 微软基础类库 的操作知识 以 及类和对象的概念,封装以及模块化设计的理念,同时也要了解 C M的使用操作和应用原理等 。 O V + 知识简介 c+ C+ + 是在 c语言的基础上研发 出来的高级汇编语言 ,它是 以 C语言为依托而晚上 的高级编程工具 , 也是现在世界上公认 的功 能最 强大编程 方式 。正因为它不可 比拟 的优 点以及通用 性,现在 已经是 同行业 公认的 “ 工业标准 ”以及 “ 厂商标准 ” , 而后者是依据前者发展补充而创立 的。有 人技 术人 员认 为 V c 是非常难掌握 的,但 是它和 c + + 有着紧密 的联系 ,同时也是适 应微软操作系统而研发 的,具有广泛 的应用性 。 在微软 的操作 系统上使用 v +进行程序研 发时,有 2个 c+ 主流模式 ,其 一是 WN h I I P ,其二是 M c F ,而后者是针对于前 者 的一种 改进 , 对前者进行 了系统化 的封装 处理。 而前者在 实 际的应用 中显得过于繁琐而且效率也不是很高 。

VC++中如何能调用matlab函数

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命令提示符后执行上述命令,重新注册。

手把手教你用C#调用MATLAB函数

手把手教你用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();编译运行即可看到输出,此函数是姿态角转四元数函数,具体功能就不做说明了。

VC++调用Matlab实现图像处理

VC++调用Matlab实现图像处理
i t e n i , e n tu t a dme g n t . g n h os r c srci n e o g n r i g e c
Ke r s: lb:n neVC + + y wo d M a a egi ; t
0 引 言
在计算机 软件 开发过程 中 , VC++以其高效 的编 码率 可以快速地 开发 出 Widws n o 环境 下功 能强 大、 图 形界 面丰富的应用 软件 系统 , 以说 是 一个不 错 的编 可 程工 具 。对 于 图像 的处理 , 以在 VC+ +平 台上 直 可 接对 O eG pn L或 Drc 3 i t D进行 编 程实 现 。但 是 由于 e v c++在数值计算方面不如 Mal , t b 尤其 是在进行 图 a 像处理时 , 每一个算法都需要添加大量的程序代码 , 程 序冗长 , 浪费系统资源。因此 , 用具有强大 的矩 阵运 使 算 、 据处 理 和 图形 显示 功 能 的 Mal 数 tb更具 优势 _ 。 a 1 J Ma a 语言是一种 以矩 阵和 阵列 为基本 编程单 元 的 , tb l 拥 有完 整的控制语句、 据结构 、 数 函数编写与调用格式 和输入输 出功能 的、 有面 向对 象程序 设计 特征 的高 具
命 令的 动态 通信 。通过该 方法 可 以方便 、 地实 现 图像 的压 缩处 理 , 论从 程 序 实 现 过 程还 是 从 最终 处理 效 果 上来 说 快捷 无
都 明显 优于 单独 使 充 C与 Maa 各 自的优 势 。该 方 法也 可 以扩 展 到对 图像 去噪 、 tb l 重 构、 融合 等 图像处 理过 程中 。
关 键词 : t b 引擎 ; C++ Mal ; a V 中图分 类号 : P 1 T 3 文献标 识码 : A 文章编 号 :6 3 2 X 2 0 )8 2 5 4 1 7 —6 9 ( 0 7 0 —0 1 —0

基于COM的VC调用Matlab的方法及实现

基于COM的VC调用Matlab的方法及实现

甚 j百 行 代码 。 =
t e d t id e hd o e l e 秆a 8 e a 8 b t e n h e ae m to t rai l z n f r d t e w e
Ma a  ̄V 是 目前应用最广 泛的工程仿 t b lC l
真 和 开发 软 件 ,但 是 它 们 有 着 各 自的 优 缺 点。Mal t b具有 强大 的矩阵 运算 、数据 处理 a 和 图形 显示 功能 ,其输 出结 果可 视化 ,编 程
法 厦其各 的优 块. 点.然后鳍合 详 细的 实例
运 行速 度 、功能 性 以及 应用 程序 界面 开发 方
面功能强大 ,但是在数值计算和数据可视化
方 面 ,VC并不具 备太 多优 势 ,在 Malb中 t a

两行代码 就 可以实现 的功能在 V 中要 儿十 C
中那样精 细的 图形 , 且对 于有的 绘图语句 也 而
不 支持 。现 在 M ah os公 司已 经被生 产 t To l Mal t b的 Mah ok 公司兼 并 ,之后部 分 a tW r s Macm的 内容 被合并  ̄Mah r s i a t o 1 twok的V s l ] u Malb中 。 t a 4 )使用 Mal 的cmb i eT具 。 O t b o ul r . C M a d 是 C mp n n j tMo ue的简称 ,它 o o e tObe d l c
T i h ss ie a r f i r d c i o p a t a hs e i v s b l jt o u t n f r c i l t g e n o c s nf a c o h c m ia in f a l ih C, i ii n e f t e o bn t o M t b w t V g c o a a a5 日 SV P Is e i c w& 8 o h w o m lme t n l B8 B B & p cf y n o t iPe n f i i , a v n a e a d ds na e O 甑c w y & e t d atg s n i tg s f W n a r nj e t n d觞 W l hn 1i D e .T e ^ h 1 f t ec ) 删船 协 船Fosr t a n nta e

CC++下调用matlab函数操作说明

CC++下调用matlab函数操作说明

CC++下调⽤matlab函数操作说明1.matlab的安装连接:/s/1qXuF7aO安装32位版本的matlab(在⽬录下bin⽂件夹中有两个⽂件夹,选择win32⽂件夹下的setup进⾏安装)2.matlab mex编译器配置安装完matlab之后,需要设定对应的c++编译器才能编译.m⽂件⽣成可供c++调⽤的库⽂件。

打开matlab,在命令⾏输⼊:mex -setup,选择已安装的vc编译器我的matlab版本是R2010b,选择的是[2] Microsoft Visual C++ 2008 Express,然后⼀直选择y直到看到Done然后继续在命令⾏中输⼊:mbuild -setup ,按照上述类似的⽅式设置编译器假设存在⼀个Add.m的⽂件需要编译成库⽂件,Add.m⽂件function C=Add(A,B)C=A+B;end使⽤命令编译:mcc -W cpplib:libAdd -T link:lib Add.m成功编译会在Add.m的路径下⽣成⼀些⽂件:如果出现错误,可能是编译器配置错误,依次输⼊⼀下两⾏命令查看配置⽂件:>> cd(prefdir)>> edit compopts.batset VSINSTALLDIR= 这⾥如果是空值,需要将电脑中安装的VC路径写到这⾥3.创建c++程序调⽤matlab函数将前⾯⽣成的libAdd.dll"、"libAdd.h"和"libAdd.lib"三个⽂件拷贝到新建的vc⼯程中,并配置⼯程属性,添加matlab安装⽬录下extern中include⽂件夹,我的是D:\matlab\extern\include然后配置库⽬录:添加D:\matlab\extern\lib\win32\microsoft这⾥需要注意的是,该路径下有" mclmcrrt.lib"⽂件,是我们需要的。

Vc++下如何利用Matlab工具箱进行数字信号处理

Vc++下如何利用Matlab工具箱进行数字信号处理

摘 要 :本文详述 了在 VC 环境 F 如何利用 Mal b工具 箱进行数字信 号处理 ,全文以 M alb工具 箱中功率谱 密度分析 函数 为例 ,介 ta ta 绍 了通过 Malb自带 的引擎、Ma lb自身的编译 器以及利 用 Mah o l公 司的 Mac m进 行对工具箱 函数的调用 。 ta t a t T os to 关键词:Malb M 文件 引擎 编译 器 Macm Vc + t a to + 中 图分类 号 :TP 3 9 3 文献标 识码 :A 文章编号 :1 7 3 9 (0 6 1 () 0 6 — 2 6 2 7 12 0 )2a 0 5 0 Malb的信号处理 工具箱是 信号算法 文 t a mn f=mxCr a e u lM a rx 1 1 pd. 文件生 成 可供 Vc ft e tDo b e ti ( . 。 s m 调用 的 函数 。 件的集 合 , 处理 的基本对 象是 信号 与 系统 , mx AL) 它 RE l 将 pd m文 件拷贝一份 至 Mal \ i s. t b bn目 a mF = s mxC e t Do b e t i ( , , 录下 ,改写 相应调 用的 M 文 件如 n r c k. r a e u lMa rx 1 l ag h 信号处理工具箱位 于 目录 、T ob x Sg a o lo \ in l RE ) 下 , 用工具 箱 中的文件 可 以实现信 号变换 、 mx AL l 利 m, h n ig m等 为使表 述简 明 ,将 p d a nn . s. 滤波 .滤波 器设 计等。在其 它的环境如 V 下 c mx eN meT。T”l Sta ( ” ) m 修 改为 如下 形式 ,限 于 篇幅给 出关 键的 几 如果能调用 Mal I具箱 中的文 件 , tb a 会大大地 mx eNa ( f ,mnf”l St memnf ” f ) t t 步: 加快一些算法 的实现 , 同时其 可靠性也很 高。 mx eNa ( s ” s) St memF ,mF ”l fn t n 【x f Y (sn tn vr p u ci P x,=  ̄t ,f ,oel , o l F a me p (c a *mx eP ( , h r ) X mc y (h r) G trT)( a* c ) d tx,12 *ief o be) aa 04 s o( u l)I z d wid w= ,・1 c s *i(:f ) n o o5 (- o( p*1nf ’/ 2 t 1利用M tb I al  ̄擎 aJ me p (C a 十mx e P ( ft。 (f t 1) / h n ig 窗 mc y (h r ) G t rmn f) nf + ) , / a nn ) M a l b引擎采 用客 户和 服务 器计算 方 ta df ag= ’ none’1 l c r)f h t i o( u l) z d , 式 , 运用中,V 的 c 言或 Ct 语 言的程 ( a*nf,s ef o be) 在 c 语 } me p ( h r) x eP ( s, h r) mcy( a*m G trmF)( a * c c wid w= n o I n o wid w() 序作为 前端 客户机 , 它向 Malb引 擎传递命 t a s 1 s o( u l)l z d 令和数 据信息 , 并从 Malb引擎接 收数据 信 F , 牛ie f o be) ta e g u A rye , ,/ n P t ra ( T) /将转 化的参数 p 假设上 述代 码重新 存 为 t swi m , e t n. 在 息 ,它 提供 了下 列儿个 函数 :n Op n,n e g e eg

C 中调用MATLAB方法

C  中调用MATLAB方法

三种方式在C++中调用matlabC/C++调用Matlab在工程实践中,C/C++调用Matlab的方法主要有调用Matlab计算引擎、包含m文件转换的C/C++文件,以及调用m文件生成的DLL文件。

1利用Matlab计算引擎Matlab的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab文件。

该方法采用客户机/服务器的方式,利用Matlab引擎将Matlab和C/C++联系起来。

在实际应用中,C/C++程序为客户机,Matlab作为本地服务器。

C/C++程序向Matlab计算引擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。

Matlab提供了以下几个C语言计算引擎访问函数供用户使用:engOpen,engClose,engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse,engGetVisible,engSetVisible。

下面以C语言编写的、调用Matlab引擎计算方程x3?2x+5=0根的源程序example2.c 为例,说明C/C++调用Matlab计算引擎编程的原理和步骤:#include<windows.h>#include<stdlib.h>#include<stdio.h>#include"engine.h"int PASCAL WinMain(HANDLEhInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,intnCmdShow){Engine*ep;mxArray*P=NULL,*r=NULL;char buffer[301];doublepoly[4]={1,0,-2,5};if(!(ep=engOpen(NULL))){fprintf(stderr,"\nCan'tstart MATLAB engine\n");return EXIT_FAILURE;}P=mxCreateDoubleMatrix(1,4,mxREAL);mxSetClassName(P,"p");memcpy((char*)mxGetPr(P),(char*)poly,4*sizeof(double));engPutVariable(ep,P);engOutputBuffer(ep,buffer,300);engEvalString(ep,"disp(['多项式',poly2str(p,'x'),'的根']),r=roots(p)");MessageBox(NULL,buffer,"example2展示MATLAB引擎的应用",MB_OK);engClose(ep);mxDestroyArray(P);return EXIT_SUCCESS;}在Matlab下运行example2.exe:mex-f example2.c。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。

关键词:Matlab M-文件引擎编译器Matcom Vc++Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、Toolbox\Signal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。

在其它的环境如Vc下如果能调用Matlab工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。

1. 利用Matlab引擎Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C 语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数:engOpen, engGetArray, engPutArray, engEvaString,engOutputBuffer ,engClose与客户机进行交互。

下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine.,在对话框.cpp文件中加入”engine.h”和“math.h”头文件,下面给出部分程序清单。

Void CtestmatlabDlg::OnMatlabEngine(){Engine *ep;mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL;double datax[1024];char buffer[1024];for(int j=0;j<1024;j++)//注:如通过采集卡采集数据可将采集的数据放在datax[]数组中,此循环就不需要{double samt=(double)(1.0/1024);datax[j]=sin(2.0*63.0*samt*3.1415926+1.15*3.1415926);}double *pPxx,*pFxx;if(!(ep=engOpen(" \0"))){//打开Matlab引擎,建立与本地Matlab 的连接fprintf(stderr,"\n Can't start MATLAB engine\n");exit(-1);}double Fs[1]={1024};//因为Matlab所有参与运算的参数都是矩阵的形式,因而下列几行将参数转变double nfft[1]={1024};//成Matlab可接受的矩阵形式。

T=mxCreateDoubleMatrix(1,1024,mxREAL);mnfft=mxCreateDoubleMatrix(1,1,mxREAL);mFs=mxCreateDoubleMatrix(1,1,mxREAL);mxSetName(T,"T");mxSetName(mnfft,"mnfft");mxSetName(mFs,"mFs");memcpy((char*)mxGetPr(T),(char*)datax, 1024*sizeof(double));memcpy((char*)mxGetPr(mnfft),(char*)nfft, sizeof(double));memcpy((char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double));engPutArray(ep,T); //将转化的参数放入引擎中,此时可在Matlab command窗口下查看此参数engPutArray(ep,mnfft);engPutArray(ep,mFs);engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);"); //利用引擎执行工具箱中文件engOutputBuffer(ep,buffer,512); //如只想看显示图形,可将返回参数去掉,psd无返回参数缺省情况下会自动画图形result=engGetArray(ep,"pxx");//取出引擎中的数据放在所指的区域中供后续处理pPxx=mxGetPr(result);result=engGetArray(ep,"fo");pFxx=mxGetPr(result);engEvalString(ep,"plot(fo,10*log10(pxx));");//利用引擎画图engEvalString(ep,"title('功率谱分析');");engEvalString(ep,"xlabel('Hz');");engEvalString(ep,"ylable('db');");mxDestroyArray(T); //释放内存mxDestroyArray(mFs);mxDestroyArray(mnfft);mxDestroyArray(result);engEvalString(ep,"close;");engClose(ep);}上述程序在Vc下编译需要将libeng.dll和libmx.dll两个动态库利用以下的命令:lib/def:<自己的Matlab的安装路径,下同>e:\ Matlab\extern\include\*.def /machine:ix86 /out:*.lib来生成程序所需的静态连接库libeng.lib和libmx.lib,将libeng.lib和libmx.lib所在的目录加入Vc++ project/link/object/library modules下即可。

2. 利用Matlab自身的编译器调用工具箱中的函数Matlab的编译器可将Matlab的M文件转换为为C或C++的源代码以产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,不能调用Matlab工具箱中的函数,这非常不利于搞一些特殊的算法。

本人研究了一段时间发现,工具箱中的函数既然是M文件就一定可以用编译器来编译,以提供如Vc的调用函数,但是编译器只能编译一个独立的M文件,即这个M文件不依赖于其他的M文件。

如果M文件中又调用了其他的M文件,可将被调用的M文件拷贝到调用M文件的相应位置,作适当的改动就可以用于编译器编译。

编译器不支持图形函数,所以M文件中如有图形函数需注释掉。

当Matlab的编译器mcc加入适当的参数-e(mcc –e *.*)或-p(mcc –p *.*)就可生成将输入的M文件转换为适用于特定运用的C或C++源代码。

这样如果要在Vc下编译通过,还需连入以下几个库libmmfile.dll, libmatlb.dll, libmcc.dll, libmat.dll. libmx.dll. mibut.dll 以及Matlab C MATH库,建议采用前述的方法将动态连接改为静态连接。

对于C/C++编译环境的设置,在Matlab command窗口下运行mex –setup 然后依提示操作,而对于C/C++连接环境的设置,运行mbuild –setup依提示操作即可。

下面给出利用编译器将Matlab工具箱中psd.m文件生成可供Vc调用的函数。

1. 将psd.m文件拷贝一份至Matlab\bin目录下,改写相应调用的M 文件如nargchk.m, hanning.m等。

为生成的代码简洁,对于采集数据处理输入参数很明了的情况下可作大量的删减,最终使psd.m成为一个不依赖于其他M文件的独立的M文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步:function [Pxx,f]=psd(Fs,nfft,noverlap,x)window=o,5*(1-cos(2*pi*(1:nfft)’/(nffft+1)));//hanning 窗dflag=’none’;window=window(;)………………………………….以上只要稍懂Matlab语言和信号处理知识就可完成这项工作。

1. 假设上述代码重新存为testwin.m,在Matlab command 窗口下设置好环境参数运行mcc –e testwin,则可在Matlab\bin下生成testwin.c ,如运行mcc –p testwin 则生成testwin.cpp.2. Vc下建立一个基于对话框的文件,然后在对话框里加一个Button 控件OnButtonPsd将上述生成的.c文件的头文件加入到工程的.cpp中,且将#ifdef_cplusplusextern “c”{#end ifc代码声明加入Vc的包含文件和生成的.C的包含文件之间将#ifdef_cplusplus}#end if加入.cpp文件未尾3. 为了简洁且便于处理将生成的c函数稍改动,给出部分代码如下:1.void CTestpsdwinDlg::OnButtonPsd(){ mxArray* x_rhs_;//指向采集数据存放区Fs=23510;//数据采集的频率nfft=1024;//1024点的fft double datax[1024]//采集的数据x_rhs_mxCreateDoubleMatrix(1,1024,mxReal); memcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double)); noverlap=512;……………….……………….mccCopy(&Pxx,&Spec);mccCopy(&f,&frevgg_vector);for(int j=0;j<(int)(nfft/2+1);j++){datap[j]=mccGetRealVectorElement(&Pxx, (j+1));//功率谱密度存于datap[]数组dataf[j]=mccGetRealVectorElement(&f, (j+1));//相应频率存于数组dataf[]中}mccFreeMatrix(&Pxx);……………….SendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图Return;}如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇[幅在此不述。

相关文档
最新文档