c#调用c++DLL实现车牌识别

c#调用c++DLL实现车牌识别
c#调用c++DLL实现车牌识别

//引用DLL

[DllImport("TcMenuRecognitionDll.dll")]

//static extern int Findcar_number(char* buf,string &charsRecognise,int type);

//static extern int Findcar_number(ref byte buf, ref string charsRecognise, int type);

//static extern IntPtr Findcar_number(ref byte buf, ref IntPtr charsRecognise, int type);

static extern int Findcar_number_F(ref byte filePath, ref string charsRecognise);

//byte[] buf;

byte[] buf;

byte[] filePath;

string charsRecognise="";

if(https://www.360docs.net/doc/294259648.html,pareTo ("8006037B")==0)

{

labInfo.Text = "车牌到达销毁区";

//自动拍照

if (System.IO.Directory.Exists("Photoes") == false)

System.IO.Directory.CreateDirectory("Photoes");

savebmpName = "Photoes\\" +

DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".jpg";

string date = DateTime.Now.ToString();

Save();

query.UpdatePhoto(date, savebmpName);

issavebmp = true;

}

if (savebmpName.Length!=0)

{

//读取二进制文件

//System.Drawing.Bitmap Photoes = Bitmap.FromFile("Photoes");

//FileStream stream = new FileStream(savebmpName, FileMode.Open);

//buf = new byte[stream.Length];

//stream.Read(buf, 0, buf.Length);

filePath = System.Text.Encoding.Default.GetBytes(savebmpName);

//调用方法

Findcar_number_F(ref filePath[0], ref charsRecognise);

//IntPtr ptrIn = Marshal.StringToHGlobalAnsi("");

//IntPtr charsRecognise = Findcar_number(ref buf[0], ref ptrIn, 0);

//string ptrRet = Marshal.PtrToStringAnsi(charsRecognise);

//输出识别结果

FrmInput.instance.Text = charsRecognise; }

matlab调用c语言编程

matlab与C语言混合编程 用C编写mex程序 大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读 一句执行一句的。这样做可以很方便的实现编程过程中的交互,也免去了麻烦又耗时的 编译过程。但凡事有一利必有一弊,matlab在执行时速度慢也就根源于此。在matlab里 tic for i=1:10000 b(i)=a(10001-i); end 怎么样,是不是很慢? 你的程序里如果再多几个这样的循环,运行速度就可想而知了。 上面程序的功能是将向量a里的数据逆序赋给向量b。下面的程序可以实现相同的功能 tic b=a(10000:-1:1); 为什么这个程序运行速度就这么快呢?这是因为matlab里的基础矩阵运算函数,像转置,复制等等,都是以二进制程序的形式存在的,运行起来速度当然比解释执行10000次所以编matlab程序时,应该尽量避免用循环语句,而使用等效的矩阵运算。虽然这样 但总是有的时候没法找到对应的矩阵运算来等效,或编出来的程序复杂得让人没法修 简单地说,mex程序就是根据一定的接口规范(matlab提出的)编写的一个dll,matla 比如我编了一个mex函数,名字叫max2.dll,那么只要把这个dll所在的目录加到matlab 的搜索路径里(用addpath),就可以像调用普通matlab函数一样来调用它了。因为把 循环体放到了二进制程序中,执行速度快得多。 Mex文件既可以用c,也可以用fortran来编。因为我用的是c语言,所以下面的介绍都 用c语言编写mex文件的方法。如果你用的是fortran,请你自己去看Apiguide.pdf,里 面有详细说明。 前面说到通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。这是 Matlab5.1本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Wat com C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,只要在Matlab里键入mex -setup ,就会出现一个DOS方式窗口,下面只要根据提示一步步设置就可以了。由于我用的是w 听说Matlab5.2已经内置了C语言的编译器,那么下面的这些可能就用不着了。可惜现 需要注意的是,在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的V C5装在路径C:\PROGRAM FILES\DEVSTUDIO下,那在设置路径时就要写成:C:\PROGRA~1 示例程序一、 这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序 存为hello.c。 #include "mex.h"

C或C++调用Matlab程序

1调用方式 1.将Matlab程序编译为独立可执行文件 可以脱离matlab运行exe程序,但需要MCR运行环境,对于有输入变量的函数而言,执行exe会出错,没什么实用价值 2.C/C++程序调用Matlab引擎 不能脱离matlab使用,实际上主要是用C/C++完成界面编写,通过接口函数调用matlab引擎,C/C++程序向matlab计算引擎传递命令和数据信息,并从matlab计算引擎接收数据信息,相当于在matlab中执行计算程序。 利用计算引擎的特点是:节省大量的系统资源,应用程序整体性能较好,但不能脱离matlab的环境运行,且运行速度较慢,在一些特别的引用(如需要进行三维图形显示)时可考虑使用。 3.C/C++程序调用Matlab程序编译后的动态链接库 可以完全脱离matlab使用,主要思想就是先编译m文件,将函数封装在库文件中,从而可以在C/C++程序中,通过调用DLL实现对matlab代码的调用。 利用mcc编译器生成的DLL动态连接库文件,只需在C/C++编译环境中将其包含进来,调用导出函数即可实现原m文件的功能,极大的方便了用户的代码设计。 4.C/C++程序调用Matlab程序编译后的COM组件 C/C++调用COM组件和调用Matlab程序编译后的动态链接库和的执行效率是相同的,但调用动态链接库实现起来比较简单,调用COM组件实现起来比较复杂,很少使用。 2C/C++调用m文件编译后的动态链接库 2.1Matlab设置步骤 1.命令窗口输入mbuild –setup和mex–setup命令,选择VC++6.0编译器

2.编写m文件,如add.m(脚本文件和函数文件都可以) function [a,b]=add(x,y) a=2*x+y; b=3*y; end 3.生成dll文件 输入命令:mcc -B cpplib:addadd.m或者mcc -W cpplib:add -T link:libadd.m 4.提取add.ctf,add.h,add.dll,add.lib 共4个文件(更高版本的matlab没有 ctf文件,只需另外3个就可以)

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

C语言环境中调用Matlab程序指南 甄梓宁 znzhen@https://www.360docs.net/doc/294259648.html, 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中。关于mxArray,在第三章会有详细说明。下面是对a=1,b=2的转换过程:

Matlab以MEX方式“调用”C源代码

Matlab以MEX方式“调用”C源代码 阅读() 评论() 发表时间:2008年09月26日 00:46 本文地址:https://www.360docs.net/doc/294259648.html,/blog/3311493-1222361217 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给 mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab 语句中调用函数时的输出值(如上例中的a)。 值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。在matlab6.5中使用mex -v 选项,你可以看到最后mex阶段有类似如下的信息: --> "del _lib94902.obj" --> "del "test.exp"" --> "del "test.lib"" 也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。 比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex-setup),在Windows中,MEX 文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数

在matlab中调用c程序

1.Maltab 编译Mex文件(不可调试) 1.1hello word 在matlab命令行中输入:mex -setup选择合适编译器,完成设置。 新建一个文件,输入: #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 把上面程序保存为一个C文件,如 hello.c 在command window下运行 >> mex hello.c >> 结束之后在current folder 窗口里会有一个hello.mexw32文件。 在command window下运行 >> hello() Hello word! 1.2如果是多维数组并不能用Arr[i][j]的格式寻址,在参数在C里只是一维数组, 一维数组按列排列,C语言是按行排列的, 如[a b c d;e f g h]C语言在内存中是按a b c d e f g h排列,而matlab是按 a e b f c g d h排列的。如果要变成C语言可Arr[i][j]索引的格式,可用for循环转化 打印函数: mexPrintf()相当于matlab的disp函数, mexPrintf函数里需要打印的部分必须用""而不能用'' 子函数的问题: 子函数有两种方式,一种采用return值得方式返回值 另一种方式为利用参数返回值,把需要return的值直接赋给形参。 多个.c文件的编译: 多个.c文件中只能存在一个mexFunction函数 可用mex ('a.c','b.c','d.c')的格式编译 在VS中调试mex 在vs中建立dll工程,建立project.cpp文件,输入 #include "project.h" #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 建立.h文件,输入 #include "matrix.h"

Matlab调用c语言程序代码

Matlab调用c程序 方法: 第一步:要先在matlab中安装c程序编译器,步骤如下: 键入命令:mex -setup; 选择c/c++编译器; 选择c/c++编译器版本; 确认。 第二步:键入:mex *.c 实例介绍:【转】 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab 的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。 可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows 中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。 我们现在来说mexFunction怎样写。 mexFunction的定义为: void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

手把手教你C_调用MATLAB函数

【转载】手把手教你用C#调用MATLAB函数 编译环境:Microsoft Visual Studio 2008 版本9.0.21022.8 RTM Microsoft .NET Framework 版本3.5 已安装的版本: Professional Microsoft Visual Basic 2008 91986-031-5000002-60050 Microsoft Visual Basic 2008 Microsoft Visual C# 2008 91986-031-5000002-60050 Microsoft Visual C# 2008 Microsoft Visual C++ 2008 91986-031-5000002-60050 Microsoft Visual C++ 2008 Microsoft Visual Studio 2008 Tools for Office 91986-031-5000002-60050 Microsoft Visual Studio 2008 Tools for Office Microsoft Visual Web Developer 2008 91986-031-5000002-60050 Microsoft Visual Web Developer 2008 Crystal Reports AAJ6G-K0MSA4K-680002Z Crystal Reports Basic for Visual Studio 2008 Matlab 2008b 首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild -setup 显示如下 >> mbuild -setup Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers [y]/n? n %选择n Select 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] None Compiler: 6 %选择6,其他编译器可以选相应的选项,我没有验证过The 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? n%选择n Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0 %选择您自己的当前安装路径

C语言与MATLAB混合编程的设置

C语言与MATLAB混合编程的设置 1.编译环境的安装 本次的程序是通过C语言来实现的,所以需要C的编译器,而且可视化是通过C语言与MATLAB混合编程来实现的,所以我们的编译环境需要两款软件 a.安装VC6.0 b.安装MATLAB(测试的软件是用的MATLAB2010a) 2.编译器的环境变量和工程连接的设置 安装好后就开始环境变量的设置,在我的电脑中打开属性 根据”高级”->”环境变量”->”path” 假设MATLAB的安装路径为D:\ProgramTool\matlab2010 在path中添加两项 “D:\ProgramTool\matlab2010\bin\win32”;“D:\ProgramTool\matlab2010\bin” 在两个路径间用分号隔开 打开VC6.0 根据”Tools”->”Opinions”->”Directories”->”include files”中添加一行 “D:\ProgramTool\matlab2010\extern\INCLUDE” 根据”Tools”->”Opinions”->”Directories”->”Library files”中添加一行 “D:\ProgramTool\matlab2010\extern\lib\win32\microsoft” 打开工程后 根据”Project”->”setting”->”Link”->”Object/library modules”中添加 “libeng.lib libmx.lib libmat.lib”三个libMATLAB自带文件 根据”Project”->”setting”->”Link”->”Project Opinions”中 将“/subsystem:windows”修改成“/subsystem:console” 根据”Project”->”setting”->”C/C++”->”Preprocessor Definitions” 将“_WINDOWS”修改成“_CONSOLE” 3.编译后的效果说明 设置好环境变量和链接后就可以开始进行编译了,编译好后在Debug中打开执行文件运行就可以开始模拟,在可视化中要调用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~=n2 display('矩阵大小不相同') error('参数错误'); end addRlt=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文件。同时还要从G:\Program Files\MATLAB\R2009b\toolbox\dotnetbuilder\bin\win32\v2.0拷贝出MWArray.dll和https://www.360docs.net/doc/294259648.html,module。第二个文件必须要哦,否则可能会

matlab与c语言的接口

MATLAB 与 C 语言的接口 东北大学薛定宇(原作) 转载时请注明作者信息、网址,谢谢 MATLAB 到 C 语言程序的转换可以由两种途径完成,其一是MATLAB 自己提供的 C 语言翻译程序mcc, 另一种是原第 3 方公司MathTools 开发的MATCOM 。后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MATLAB 6.0 (Release 12) 中。 依本人的观点,二者都不完善,有大量的MATLAB 函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MATLAB 程序翻译成 C 语言程序很晦涩。翻译后的 C 程序几乎不适合手动去维护,更谈不上升级了。 有几个不兼容的地方是不能令人容忍的,例如eval() 函数在 C 翻译下是不兼容的,最新的MATLAB 6 才刚刚敢说已经部分兼容了,但离真正的兼容还有

很长的路要走,有很多艰难的技术困难需要克服,短时间内不可能有突破性的进展。另一个大的问题是,众所周知,MATLAB 新的控制系统工具箱中定义了大量的LTI 类,MATLAB 5 开始也允许使用类与对象的概念,这已经向“面向对象”的编程走了一大步,但MATLAB 到 C 的翻译明显都不支持“对象”的数据类型,所以在控制系统分析与设计(当然还有其他的领域) 中这样的转换几乎没有什么实际意义,所以不要将这样的转换太理想化。 从转换的程序速度来看,因为mcc 和MATCOM 都沿用了MATLAB 的程序运算机制,所以不可能大幅度地提高程序运行速度。相反地,如果将MATLAB 程序中明显的瓶颈部分用 C 语言按照MEX 格式编写,则可以大大加快速度。作者在《科学运算语言MATLAB 5.3 程序设计及应用》一书中以例子做过探讨,MCC 可以比快50%, 而MEX 的形式可能快上百倍。 〖举例〗分形问题:从初始点(x0,y0) 出发,按下面的公式生成新的点(x1,y1) 其中gi 为(0,1) 区间均匀分布的随机数。要求从

C与matlab混合编程

VC++与Matlab混合编程之引擎操作详解1 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命令提示符后执行上述命令,重新注册。 2. 配置编译器 要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab 对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例): 1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在 C:\matlab目录)。 2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。(vs2005的话,不加msvc60) 3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。 以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ builder,设置大体相同,不再赘述

mex文件_实现调用C函数的接口

MEX文件--实现调用C函数的接口 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x,double y) { return x+y; } 现在我想要在Matlab中使用它,比如输入: >>a=add(1.1,2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX 文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。

该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab 调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。 值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。在matlab6.5中使用mex-v选项,你可以看到最后mex阶段有类似如下的信息: -->"del_lib94902.obj" -->"del"test.exp"" -->"del"test.lib"" 也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。 比如该C文件已写好,名为add.c。那么在Matlab中,输入:

如何在matlab中调用C程序

C语言使用范围非常广,如何实现在matalb中执行C程序一直是大家关心的 比如我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x,double y) { return x+y; } 现在我想要在Matlab中使用它,比如输入: >>a=add(1.1,2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。 值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。在matlab6.5中使用mex-v选项,你可以看到最后mex阶段有类似如下的信息: -->"del_lib94902.obj" -->"del"test.exp"" -->"del"test.lib"" 也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。 比如该C文件已写好,名为add.c。那么在Matlab中,输入: >>mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex-setup),在Windows中,MEX 文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M 函数是一样的了。

MATLAB_与_C_语言

MATLAB 与 C 语言 摘要:本文详细介绍了使用最新版本的Matlab的编译器(Compiler2.0)将Matlab源代码转化为C/C++源代码的方法,从而提供了Matlab与C/C++的接口。Matlab是Mathworks公司于1982年推出的一套高性能的数值计算可视化软件,它集数值分析、矩阵运算、信号处理和图形显示等于一体,被称为演算纸式的语言。它提供了功能强大的工具箱,其强大的扩展功能为各个领域的应用提供了基础。Matlab在一些国家如英、美等已被列为电气工程类学生的必修课程。最新版本的Matlab5.3在原有功能的基础上增加了彩色代码编辑器、程序调试器和C/C++的图形数学库等。Matlab的函数和命令几乎可以实现C/C++的全部功能。更为重要的是Matlab的工具箱之一的C编译器(Compiler2.0)提供了与其他高级语言如C/Fortran的接口。通过利用Matlab的编译器、C/C++数学库和图形库,可以自动地将包含数值计算和图形的Matlab语言的源程序转换为C/C++的源代码(Windows 或Window NT下的32位应用程序)。这些代码根据需要既可以当作一个子模块嵌入大的应用程序,也可以作为一个独立的程序脱离Matlab环境单独运行。遗憾的是目前国内介绍Matlab的资料较少,仅有的少数资料也局限于介绍Matlab的数学计算和程序设计,如一些工具箱函数的使用。其实,Matlab 最重要的应用是用来实现一些复杂的算法和动态系统的仿真,这些应用都离不开Matlab的C Compiler。可以说Matlab的C Compiler是Matlab工程应用的核心。下面详细介绍Matlab的C编译器的安装的软、硬件环境要求和安装过程,并通过例子介绍其应用。 一、Matlab的编译器的软、硬件要求和安装过程 硬件要求:Intel 486, Pentium, Pentium Pro or Pentium II 以上;16M内存(建议24M以上);Windows支持的显卡。 软件要求:①Windows95/Windows98/WindowsNT4.0;(实际Matlab的编译器可在Windows、Macintosh、Unix环境下运行,本文仅以Windows环境为例) ②Matlab5.0以上版本;③MicrosofVisual C/C++ version 4.2 or 5.0 /Borland C/C++ version 5.0, 5.02 ; 安装过程:在安装Matlab的过程中,Matlab的C编译器会作为安装的一个选项出现,选取C编译器继续安装过程,Matlab的C编译器即可自动安装。安装Matlab 及其C编译器后,还必须安装一个ANSI C/C++ Compiler。安装ANSI C/C++Compiler时一般应选完全安装,以免遗漏Matlab的C编译器所需的组件,且须记住其路径,以备正确配置有关选项使Matlab的C编译器和C/C++的编译器建立联系时使用。值得一提的是Matlab 安装后其配置是一个较为繁琐的过程,而且如果配置不当就不能正确的使用,须特别注意。当需要改变ANSI C/C++ Compiler时,重新运行mex -setup,使Matlab的编译器和新的ANSI C/C++ 编译器建立联接即可。 二、Matlab的C编译器的典型应用 实际的工程应用中,Matlab往往用来实现一些复杂的算法和运算,只有一些最底层的控制用C来编制。这样编程简洁,可使开发应用程度的周期大为缩短,难度大大降低。同时,由于Matlab的源文件(*.M)为文本文件,简单易读,转换后

Matlab和C混合编程的几种方法比较

Matlab和C混合编程的几种方法比较 杨允军整理并调试 第一部分概述 Matlab是Mathworks公司于1982年推出的一套高性能的数值计算和可视化软件,到2005年已发行到R14(Matlab 7.0),主流版本有4.0,5.3,6.1,6.5。它是一种面向科学计算和数值分析的软件,涵盖了通信、短阵运算、图像处理、金融分析、模糊控制、自动控制、信号处理、系统仿真、微分计算等方面。它提供了强大的科学运算、灵活的程序设计流程、高质量的数字图像处理等功能,突出的优点是强大的运算功能和近乎完美的绘图功能。 然而Matlab自身存在的一些不足使其在开发应用系统时受到局限,主要表现为以下几个方面: (1)Matlab语言是一种解释执行的脚本语言,其程序运行效率低,特别是在编制大型复杂的应用系统时达不到理想的效果。 (2)Matlab编写的M文件是文本文件,很容易被直接读取,无法保护开发者的劳动成果。 (3)Matlab编写的程序只能在Matlab的平台下运行,不具备跨平台的能力,可移植性差。 (4)开发应用系统的界面能力差,很难做出友好的应用界面。 以上几点是VC等高级编程语言所专长的,而VC等高级编程语言在工程计算、复杂的数学计算、数字图形处理方面以及特定的学科领域的计算处理上远远不及Matlab。因此将二者结合起来,各取所长,将能更好地满足实际应用中的需要。 为了实现混合编程,Matlab 5.0以后的版本自带了C语言编译器(Compiler),可以将M 文件转换为C—MEX或C/C ++程序。根据是否需要Matlab环境,一般将Matlab与VC ++混合编程分为两大类:Matlab在后台运行和可以脱离Matlab环境运行。归纳起来Matlab与C接口有如下几种方法: 1.Matlab引擎(Engineer)采用客户/服务器的计算方式,通过Windows的ActiveX通道和Matlab相结合。在具体的应用中,VC ++的程序作为前端客户机,通过调用Matlab Engineer在后台与Matlab服务器建立连接,实现动态通信。这种方法实现较为简单;不要求连接整个Matlab,只需要嵌入必要的Matlab Engineer库,可大大地节省系统资源,但这种Matlab在后台运行的效率低下。 2.Mideva(Matcom)是Mathtools公司推出的一种Matlab集成编译开发平台,提供对Matlab 程序文件(M文件)的解释执行和开发环境支持。经过简单设置后,Mideva可以将M源文件转换为C/C++,然后添加到MSVC、VB、C++ Builder等的工程中。自从Mathtools公司并入Mathworks公司以后,Matcom就停止了研发,最高版本为Matcom4.5。 3.利用Mideva直接生成EXE文件后,故C++中通过Shell调用,常见的外部函数有shellexec()或weinexec()。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和Matlab 之间不能交互,且通用性差,仅适用于VC中调用Matlab,实现图形显示的场合。 4.借用C++编译器将Matlab下的M文件转换成DLL(动态链接库),其他应用程序可直接调用该DLL。 5.在C或者C++程序中使用Matlab提供的C/C++ Math Library函数直接调用Matlab函数。 (没有尝试过) 6.按照Mideva的语法,在VC中直接书写Matlab语句实现Matlab与C的混合编程。

MATLAB调用C

MATLAB 与C/C++C/C++混合编程之 混合编程之MATLAB 调用C 程序通过把耗时长的函数用c 语言实现,并编译成mex 函数可以加快执行速度。Matlab 本身是不带c 语言的编译器的,所以要求你的机器上已经安装有VC,BC 或Watcom C 中的一种。如果你在安装Matlab 时已经设置过编译器,那么现在你应该就可以使用mex 命令来编译c 语言的程序了。如果当时没有选,就在Matlab 里键入mex -setup,下面只要根据提示一步步设置就可以了。需要注意的是,较低版本的在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的VC 装在路径C:\PROGRAM FILES\DEVSTUDIO 下,那在设置路径时就要写成:“C:\PROGRA~1”这样设置完之后,mex 就可以执行了。为了测试你的路径设置正确与否,把下面的程序存为hello.c。 /*hello.c*/ #include "mex.h" void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){mexPrintf("hello,world!\n"); } 假设你把hello.c 放在了C:\TEST\下,在Matlab 里用CD C:\TEST\将当前目录改为C:\TEST\(注意,仅将C:\TEST\加入搜索路径是没有用的)。现在敲: mex hello.c 如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:\TEST\加入了搜索路径,现在键入hello,程序会在屏幕上打出一行: hello,world! 看看C\TEST\目录下,你会发现多了一个文件:HELLO.DLL。这样,第一个mex 函数就算完成了。分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程mexFunction 构成。 void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])前面提到过,Matlab 的mex 函数有一定的接口规范,就是指这 nlhs:输出参数数目 plhs:指向输出参数的指针 nrhs:输入参数数目 例如,使用 [a,b]=test(c,d,e) 调用mex 函数test 时,传给test 的这四个参数分别是 2,plhs,3,prhs 其中: prhs[0]=c prhs[1]=d prhs[2]=e 当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a 和b,达到返回数据的目的。细心的你也许已经注意到,prhs[i]和plhs[i]都是指向类型mxArray 类型数据的指针。这个类型是在mex.h 中定义的,事实上,在Matlab 里大多数数据都是以这种类型存在。当然

从MATLAB到嵌入式C代码的实现

从MATLAB到嵌入式C代码的实现 从设想到硬件实现的鸿沟是许多从事嵌入式开发的 工程师们都熟悉的问题。鉴于MATLAB本身的语言特点、强大的函数库和灵活性,算法开发人员经常在算法的概念设计阶段使用它。 随着设计发展到嵌入式应用阶段,真实环境下的实际限制就需要考虑。这往往需要手工地把MATLAB指令翻译成c 代码。手工翻译就涉及将MATLAB中方便易行的矩阵计算用c重新实现,这最终导致了同样算法的不同语言版本。在这一阶段,用户需要在多次循环设计时面临验证不同版本的等效性这一额外负担。验证所花费的精力很快就超出开发人员的承受范围,导致设计不是过快固化就是偏离了最初的定义。 最近The MathWorks公司提供了解决该问题的工具。这个工具能够把一种已明确定义的MATLAB语言子集自动转化为嵌入式c代码,有效减少了MATLAB语言向c代码进行手工翻译的开发和验证成本。 在本篇文章中,我们首先回顾MATLAB在早期设计过程中一些有用的特点。接下来我们要检验从MATLAB“概念”代码人工编译到C代码的低效性,之后会介绍一种不同的工

作流程,即直接在MATLAB而不是使用c语言对嵌入式系统进行确切描述。 MATLAB和C代码特点比较 表1比较了MATLAB和c代码在前期开发中的特点。 把一段典型的MATLAB算法转化成嵌入式c代码,要涉及几个相关实现的要求: ?数据类型管理一在执行前必须定义数据类型。例如在图像处理中,一般用8位无符号整数表示像素值,在音频处理时,一般用16位符号整数表示采样值。而MATLAB中默认使用的64位双精度变量显然没有有效地利用内存。 ?内存静态分配-MATLAB在运行时无缝处理变量大小的动态变化。然而在嵌入式系统实际应用中,我们尽量避免动态内存分配,而是在使用之前给内存分配固定的大小和数据类型。 ?降低计算复杂性和内存占用空间,在把高层算法映射到有限内存和计算资源的硬件上,嵌入式软件设计者会耗费大量精力,同时要保证程序的有效运行。这是一个把设计算法转化成目标处理器中的指令集合和数据定义的过程。 ?支持定点在嵌入式软件或硬件上运行程序,需要整个算法全部严格定义成定点数据类型。

相关文档
最新文档