当前位置:文档之家› C语言环境中调用Matlab程序指南

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

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

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

甄梓宁

znzhen@https://www.doczj.com/doc/2312840624.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的转换过程:

double aval=1, bval=2;

mxArray *a=mxCreateDoubleMatrix(1,1,mxREAL);

mxArray *b=mxCreateDoubleMatrix(1,1,mxREAL);

mxSetPr(a,&aval);

mxSetPr(b,&bval);

于是可以往Matlab里输入了:(双引号内是在Matlab里的变量名称)

engPutVariable(ep,"a",a);

engPutVariable(ep,"b",b);

运行add.m:

engEvalString (ep, ”s=add(a,b)”);

编译运行后可以在监控窗口中查看s,确认是3无误。接下来就是怎样把s从Matlab读入C中的问题了,也很方便:

mxArray *s=engGetVariable(ep,"s");

显示一下:

printf("s=%f",*mxGetPr(s));

最后不要忘记关闭Matlab:

engClose(ep);

用到的几个mxArray也需要释放,在此不述,具体请见第三章。

到此,调用Matlab引擎的全过程就结束了。不管m文件的函数形式有多复杂,都万变不离其宗,改变的只有变量与mxArray相互转换那一部分,具体请见第三章。

另外,Matlab还提供了将监控窗口中的显示存入某buffer的函数。可以如下设置:

char buffer[1000];

engOutputBuffer(ep,buffer,1000);

这样,所有显示都会存入buffer中,这对调试很有帮助。如果想取消这个功能,则:engOutputBuffer(ep,NULL,0);

最后还可以将监控窗口关闭或重新打开:

engSetVisible(ep,false);

engSetVisible(ep,true);

以上便是调用Matlab引擎的全部内容。这种方法步骤简单,调试也方便,所以在一般场合下使用已经足够好了。

二、打包m文件至dll

打包m文件至dll相对于调用Matlab引擎,唯一也是最重要的一点好处是便于发布。

在一台没有安装Matlab的电脑中,利用最少的资源运行Matlab程序只有这种方法。

该方法根据dll的不同又可分为两类:一是打包成COM或.NET组件的dll,二是传统的dll。前者除了在WIN32、MFC中还可在.NET中运行。本文仅介绍较为简单的打包成传统dll的方法。

下面这个例子将自己编写的加法程序add.m及乘法程序multi.m打包至calc.dll并在C 程序中调用。add.m如第一章所示,multi.m如下所示。

function s = multi( a, b )

s = a*b;

第一步,设置Matlab中使用的C语言编译器:

mbuild –setup

弹出如下提示:

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n?

选y的话会列出Matlab默认的几个编译器及其默认路径。如果没有完全符合的话则重来选n,就会出现更多的选择:

Select a compiler:

[1] Borland C++Builder version 6.0

[2] Borland C++Builder version 5.0

[3] Borland C/C++ (free command line tools) version 5.5

[4] Lcc C version 2.4.1

[5] Microsoft Visual C/C++ version 8.0

[6] Microsoft Visual C/C++ version 7.1

[7] Microsoft Visual C/C++ version 6.0

[0] None

Compiler:

根据个人喜好输入相应编译器序号后,就会要求确认路径。若没有,则显示如下:

The default location for xxxxxxx compilers is C:\xxxxxxx, but that directory does not exist on this machine.

Use C:\xxxxxxx anyway [y]/n?

选n输入其应该在的路径即可。

第二步,在Matlab中将add.m及multi.m文件编译为calc.dll:

mcc -W lib:calc -T link:lib add.m multi.m

第一个选项-W的格式是“dll类型:生成的dll名称”,dll类型可以是C下的“lib”,C++下的“cpplib”,COM下的“com”以及.NET下的“dotnet”。

第二个选项-T是生成类型,可以是“link:exe”生成exe文件,以及我们所用的“link:lib”

生成dll文件。

正常运行后会生成一排文件,其中有用的是以下这几个:

mccExcludedFiles.log:编译中被排斥的项目列表。

calc.h和calc.lib:C程序编写时需要。

calc.dll和calc.ctf:C程序执行时需要。

在mccExcludedFiles.log中有两类被排斥的项目。一类是Excluded by M-file compilabilty rules,这类排斥是由于m文件使用的Matlab Toolbox函数中调用了被排斥的函数导致的。一种解决办法是将需要的Toolbox函数进行简化,尽量只使用最基本的Matlab函数。

另一类是Excluded because they ship with the MCR,这类排斥没有影响,无视即可。

第三步,在C程序中调用calc.dll中的函数:

首先将calc.h、calc.lib、calc.dll、calc.ctf四个文件拷贝至C程序同一目录中,并在程序中包含calc.h以及在链接的附加依赖项中添加calc.lib。

随后,可以在calc.h文件中找到我们需要使用的几个函数:

calcInitialize():calc.dll初始化程序。

calcTerminate():关闭calc.dll

mlfAdd(int nargout, mxArray** s, mxArray* a, mxArray* b):调用calc.dll中的加法程序。

mlfMulti(int nargout, mxArray** s, mxArray* a, mxArray* b):调用calc.dll中的乘法程序。

另外,初始化的时候还可以改用calcInitializeWithHandlers设置消息处理函数,这在本章最后详细说明。下面是调用加法程序的C程序:(所需头文件,引用库等见第五章)

//calc.dll初始化

calcInitialize();

//a=1, b=2转换为mxArray格式

double aval=1, bval=2;

mxArray *a=mxCreateDoubleMatrix(1,1,mxREAL);

mxArray *b=mxCreateDoubleMatrix(1,1,mxREAL);

mxSetPr(a,&aval);

mxSetPr(b,&bval);

//调用calc.dll中的加法程序

mxArray *s=NULL;

mlfAdd(1,&s,a,b);

//显示结果

printf("s=%f",*mxGetPr(s));

//释放mxArray

mxDestroyArray(a);

mxDestroyArray(b);

mxDestroyArray(s);

//关闭calc.dll

calcTerminate();

整个调用过程跟调用Matlab引擎非常类似,在程序开头运行dll初始化程序很重要,在编程时容易忽略掉这一步导致出错。另外,在调用加法的函数mlfAdd中,第一个参量是输出的个数,而输出都需要取mxArray*的地址,也就是mxArray**。关于mxArray的结构,会在第三章详细说明。

以上便是m文件打包至dll并调用的全过程。

接下来,介绍一下消息处理函数。前面已经提到,采用打包dll方法调用Matlab函数会导致调试麻烦,因此一个好的消息处理函数是必不可少的。而前面采用的dll初始化程序calcInitialize()是不使用消息处理函数的,下面我们将使用calcInitializeWithHandlers函数设置消息处理函数。

calcInitializeWithHandlers函数有两个输入参量:一个是error_handler,一个是print_ handler。前者是由Matlab中error函数触发的,说明调用函数彻底失败了;后者由除了前者以外的一切显示输出触发。这两个函数的参量列表是由mclOutputHandlerFcn定义的,格式如下:

typedef int (*mclOutputHandlerFcn)(const char *s)

一般,print_handler可以根据需要编写,而error_handler则最好弹出对话框提示错误。参考程序如下:(需要注意的是消息处理函数必须为静态的)

static int error_handler(const char *msg)

{

printf("Error: %s\n", msg);

return 0;

}

相应的,dll的初始化改为:

calcInitializeWithHandlers(error_handler,NULL);

最后,讨论一下对Matlab程序的修改生效问题。当调用Matlab的C程序编写完成并生成exe、lib或dll后,突然发现Matlab程序哪里需要修改的时候,如果还要从一开始到最后再重新生成一遍,就实在太不人性化了,所以接下来说说修改生效的方法。

调用Matlab引擎的话,非常好办。因为相当于往精简版的Matlab中输命令行,所以只要修改相应的m文件就立即生效。而打包dll的话,只需进行前文中的第二步,将.dll 和.ctf两个文件拷至C程序的同一目录下即可。

当然,假如Matlab函数的参量列表都要修改的话,不论哪种方法都要重新生成一遍。

三、mxArray与mat文件读写

mxArray是Matlab基本变量类型,mat是Matlab基本数据文件类型,因此放在一起介绍。

1、mxArray概述

mxArray可以说是万能数据类型,它可以存整型矩阵、布尔型矩阵、浮点数矩阵、复数矩阵、字符矩阵、结构矩阵、Sparse矩阵以及Cell矩阵。但是它的结构却非常简单:首先是矩阵的基本信息,如矩阵类型、维数、各维的长度、矩阵元素是否复数等,然后是指向数据区的指针。数据区根据矩阵类型的不同最多可以有四块,而每块都是一个一维的数组,也就是说不管矩阵是几维的,其数据都根据Matlab制定的映射规则存放在了一维数组中。下面是各类型矩阵的创建、赋值与取值函数列表,具体用法请参看Matlab 帮助。

mxArray使用示例可以参见第二章的程序,其调用了mxCreateDoubleMatrix、mxSetPr、mxGetPr三个函数。

下面是关于使用mxArray的一些说明。因为很长很详细,所以可以跳过。

关于矩阵类型:根据矩阵元素类型可将矩阵分为两类,一类是直接存放值的矩阵,如Double、Logical等等;另一类是如Cell、Struct等存放矩阵指针*mxArray的矩阵。对于一个Cell矩阵,其每个元素可以是任意类型矩阵,甚至可以是Cell矩阵本身,不过这并不会导致循环。

关于矩阵维数:在创建矩阵时可以根据需要选择以“Scalar”结尾的标量(0维)创建函数,以“Matrix”结尾的矩阵(0~2维)创建函数,以及以“Array”结尾的数组(0~N 维)创建函数。要注意的是,在存放double型数据时,Double和Sparse类型矩阵最多只能支持2维,大于2维则使用Numeric矩阵。同样,存放bool型数据时,SparseLogical 最多2维,大于2维则使用Logical矩阵。

关于复数数据:存放int或double型的各类矩阵中可以选择数据是否为复数。一般是在创建函数的最后一个参量上输入“mxREAL”代表实数,“mxCOMPLEX”代表复数。

关于数据区:赋值函数其本质是改变指向数据区的指针。前面已经提到最多有四块数据区,分别是“Data”或“Pr”代表实数数据,“ImagData”或“Pi”代表虚数数据,而主

要用于存放大型稀疏矩阵的Sparse或SparseLogical数据区中还有“Ir”和“Jc”两块描述元素位置。其中Data/ImagData可以是任意类型数据,而Pr/Pi只能是double型。

关于数据存放顺序:因为是将矩阵的所有数据

用一维数组存放,所以在初始化一维数组的时

候首先需要知道其每个数据对应于矩阵中的

哪个位置。右图是Matlab对存放顺序的说明。

每一页中的行是第一维,列是第二维,而页数

是第三维,数组以图中的字母顺序排列。当然,

Matlab提供了mxCalcSingleSubscript函数可以

获得矩阵中任意位置的序号。

最后,是一些比较用的上的函数:

●mxIsxxxxxxx/mxGetClassName

前者判断是否是某类型矩阵,后者返回矩阵的类型至字符串。

●mxGetNumberOfElements

获取矩阵的元素总数。

●mxDestroyArray

创建的mxArray用完后利用此函数释放。

2、mat文件读写函数

Matlab提供的mat读写函数非常人性化,下面以一个具体例子说明。在这个例子中首先将一个矩阵写入data.mat文件再读出显示。

首先写一个2x3的整型矩阵A:

int Aval[6]={1,2,3,4,5,6};

mxArray *A=mxCreateNumericMatrix(2,3,mxINT32_CLASS,mxREAL); mxSetData(A,Aval);

以写入方式打开mat文件:

MATFile *mfp=matOpen(".\\data.mat","w");

如果该文件需要在Matlab6或Matlab6.5版本下打开时,参量”w”应该改为”wL”。接下来将矩阵A写入文件:

matPutVariable(mfp,"A",A);

关闭mat文件并释放A:

matClose(mfp);

mxDestroyArray(A);

上面是写入mat文件的完整过程。现在我们以读取方式打开mat文件:

mfp=matOpen(".\\data.mat","r");

获取矩阵至B:

mxArray *B=matGetVariable(mfp,"A");

显示一下第一行第三列数据:

int subs[2]={0,2};

printf("val=%d",

((int*)mxGetData(B))[mxCalcSingleSubscript(B,2,subs)]);

最后关闭mat文件并释放B不述。

在不知道mat文件的内容的情况下,可以使用matGetNextVariable函数一个个获取文件内的变量及相应变量名。而另外两个函数matGetVariableInfo和matGetNextVariableInfo 返回的mxArray不包括数据区,只有矩阵的基本信息。

另外,利用matDeleteVariable函数可以删除文件中的变量。

四、关于MCR

MCR主要是为没装Matlab的客户端设计的,在上面可以运行基于Matlab的程序,可以说MCR对于Matlab就相当于.NET Framework对于Visual Studio 2005的作用。另外其体积只有100M,安装起来非常方便。其过程分三步:

1、安装包的生成

在Matlab中输入:

buildmcr (路径名, 文件名)

则在该路径产生一zip文件,在发布的文件中包含该zip文件即可。

2、拷贝至客户端

在客户端安装时,将发布文件中的zip文件解压至任意目录,记其解压后的根目录为MCRPath。

3、修改环境变量

在系统环境变量”Path”中添加”MCRPath\runtime\win32”。

五、C语言环境下的设置

首先是在C语言环境的设置中“包含文件”一项添加“Matlab或MCR根目录\extern\ include\”,以及在“库文件”一项中添加“Matlab或MCR根目录\extern\lib\win32\ microsoft\”。

随后再根据程序中使用的基于Matlab的函数确定需要包含的头文件以及在链接设置的附加依赖项中添加的库文件。我们使用的函数共有四类,如下表所示:

其中以”mex”开头的mex相关函数用于在Matlab下调用C程序,在此也一并列出,仅供参考。

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"

MATLAB与C语言的异同

MATLAB与C语言的异同 MATLAB是一种科学计算软件,也是当今最优秀的科技应用软件之一,专门以矩阵的形式处理数据。它以强大的科学计算和可视化功能,简单易用、开放式可扩展环境,特别是所附带的三十多种面向不同领域的工具箱支持,使得它在许多科学领域成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。它作为一种计算工具和科技资源,可以扩大科学研究的范围,提高工程生产的效率,缩短开发周期,加快探索步伐,激发创作灵感。 作为一种计算机语言,一种用于科学工程计算的高效率的高级语言,MATLAB具有其他高级语言难以比拟的一些优点:编写简单、编程效率高、易学易懂。与其他语言相比,MATLAB 的语法更简单,更贴近人的思维模式。因此,MA TLAB语言也被通俗地称为“演算纸式”的科学计算语言。在控制、通信、信号处理及科学计算等领域中,MA TLAB都被广泛地应用,已经被认可为能够有效提高工作效率、改善设计手段的工具软件。 而C语言是一种面向问题的程序设计语言,也是目前国际上流行的一种结构化的程序设计语言,语言处理程序采用的是编译程序。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,深受广大程序设计者的欢迎。 在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。同时,它也是是数值计算的高级语言。 C语言具有如下特点: 1. 简洁紧凑、灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来, C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。 2. 运算符丰富 C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 3. 数据结构丰富 C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。 4. C语言是结构式语言 结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以

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.doczj.com/doc/2312840624.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数据输入和输出 C语言转换

数据输入和输出 一、概述 MATLAB可读和写的文件格式: 文件格式文件内容扩展名读、写文件的函数MATLAB 保存的MA TLAB工作区.mat load,save 文本Text 任意textscan,textread 限定文本任意dlmread,dlmwrite 逗号分隔的数值.csv csvread,csvwrite XML XML-格式文本t .xml xmlread,xmlwrite Audio NeXT/SUN sound .au auread,auwrite Microsoft WA VE sound .mav mavread,mavwrite Movie Audio/video .avi aviread Scientific data Data in Common Data Format .cdf cdfread,cdfwrite Flexible Image Transport system data .fits fitsread Data in Hierarchical Data Format .hdf hdfread Spreadsheet Excel worksheet .xls xlsread,xlswrite Lotus 123 worksheet .wk1 wk1read,wk1write Graphics TIFF/PNG/HDF/BMP/JPEG image GIF/PCX/XWD/Cursor/Icon image .tiff .png .hdf .bmp .jpeg .gif .pcx .xwd .cur .ico imread,imwrite 二、使用输入向导(Import Wizard) 从菜单File->Import Data打开Import Wizard;或者命令窗口输入函数uiimport。 从剪贴板开始Import Wizard:Edit->Paste to workspace。 三、保存和加载MAT文件 MAT文件是双精度、二进制、MATLAB格式的文件。 输出到MA T文件:save filename [var1 var2 …] [str*];可以通过[var1 var2 …]选择性保存变量;也可以使用通配符“*”。 查看MAT文件中的变量:whos –file 文件名。 存放结构数组的某个字段:加上“-struct”选项。 在已经存在的MAT文件上添加数据:-append选项。 禁止压缩和Unicode字符编码文件,在save语句中加入“-v6”或者File->Preferences-> General->MA T-Files->MAT-File save options->Ensure backward compatibility(-v6)。save语句默认为数据压缩。 选择输出格式:“-ascii”、“-tabs”、“-double”“-v4”。 从MA T文件输入数据:load函数。 四、输入文本数据 各种输入函数的数据定界符: csvread 仅逗号dlmread 任何字符(可指定)fscanf 任何字符load 仅空格 textread 任何字符textscan 任何字符详见:doc 函数名。 textscan和textread性能比较:前者有更好的性能,特别是读大文件时;使用前者首先要

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

Matlab以MEX方式“调用”C源代码 阅读() 评论() 发表时间:2008年09月26日 00:46 本文地址:https://www.doczj.com/doc/2312840624.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函数(混合编程)

第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.doczj.com/doc/2312840624.html,module。第二个文件必须要哦,否则可能会

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引擎进行画图

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及 库函数节点的方法 Labview调用C语言的方法 CIN(Code InterfaceNode)节点是LabVIEW中用来调用C/C++代码的功能节点。它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。 由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。另外,CIN比图形化语言可获得更高的执行效率。 注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。 如果要使用CIN节点,你必须安装了C编译器。在Windows下,CIN支持以下编译器: Microsoft Visual C++ Symantec C CIN节点必须调用.lsb文件。.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。 下面我们通过一个Step byStep的实例来看如何在LabVIEW中实现CIN节点调用,本例所用外部编译器为MicrosoftVisual C++6.0。 第一步:在程序框图放置一个空CIN节点; CIN节点位于FunctionsPalette的Connectivity->Libraries& Executables->Code InterfaceNode。 第二步:创建CIN节点的输入输出端口;

c语言使用matlab生成的滤波头文件

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。 这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。 设计定型之后,要做些调整。 以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧 第一步: 点击菜单中的Edit->Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I, II 不行) 一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。 这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。 如果不是的话,点击Convert to second order sections。 这时,滤波器的结构(structure)应该显示为Direct Form I,second order sections 第二步: 选择quantize filter,精度选择single precision floating point (单精度浮点) 之所以不用定点是因为噪声太大,也不容易稳定。 点击菜单中的Targets -> generate c header ,选择export as:single precision floating point (单精度浮点) 填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h 保存好的文件如下: //一大堆注释 //然后: /* General type conversion for MATLAB generated C-code */ #include "tmwtypes.h" /*

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)为文本文件,简单易读,转换后

相关主题
文本预览
相关文档 最新文档