matlab与c语言的接口
C语言与matlab接口
C语言与matlab接口MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。
而C语言功能丰富,使用灵活方便,目标程序效率高。
既有高级语言的优点,又有低级语言的特点。
因此,C语言是目前应用最广的编程语言。
虽然MATLAB是一个完整的、功能齐全的编程环境,但在某些情况下,与外部环境的数据和程序的交互是非常必须而且有益的。
众所周知,MATLAB是用M语言编程,不能在M文件中直接调用C语言程序。
可以通过MATLAB提供的应用编程接口(API)来实现与外部的接口,在MATLAB 环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。
MATLAB中调用C语言程序,必须通过MEX文件来实现。
一、C语言的MEX文件的结构C语言的MEX文件是一种动态连接子程序,可以象调用M文件一样调用它。
MEX文件主要有以下几方面的应用:(1)在MATLAB中,M文件的计算速度特别是循环迭代的速度远比C语言慢,因此可以把要求大量循环迭代的部分用C语言编写为MEX文件,提高计算速度。
(2)已经开发的C语言程序,则不必将其转化为M文件而重复劳动,通过添加入口程序mexFunction,可以由MA TLAB调用。
(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。
C语言的MEX文件的源程序由两个非常明显部分组成:(1)计算程序,即在MEX文件中完成计算功能的程序代码,计算程序可以是普通的C语言程序,按照C语言规则编写即可(2)入口程序,将计算程序与MATLAB连接的入口函数mexFunction。
入口程序mexFunction相对要复杂一些,函数中有四个参数nlhs、plhs、nrhs和prhs。
这里nlhs是输出数据的个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)的输出数据的指针,nrhs是输入数据的个数,prhs是指向mxArray 的输入数据的指针。
c语言实现matlab std函数
c语言实现matlab std函数摘要:1.引言2.C 语言与MATLAB 的概述3.MATLAB std 函数的实现方法4.实例:使用C 语言实现MATLAB std 函数5.总结正文:【引言】在科学技术的发展中,编程语言发挥着越来越重要的作用。
C 语言和MATLAB 作为两种广泛应用的编程语言,分别在底层硬件控制和科学计算领域有着举足轻重的地位。
有时,我们需要将两者结合使用,实现一些特定的功能。
本文将介绍如何使用C 语言实现MATLAB std 函数。
【C 语言与MATLAB 的概述】C 语言是一种通用的编程语言,具有高性能和灵活性。
它被广泛应用于操作系统、嵌入式系统、硬件驱动等领域。
MATLAB(Matrix Laboratory)是一款商业数学软件,主要用于数据分析、可视化和算法开发。
它拥有丰富的函数库和强大的矩阵计算能力,在工程和科研领域具有广泛的应用。
【MATLAB std 函数的实现方法】要实现MATLAB std 函数,首先需要了解MATLAB 的函数调用机制。
MATLAB 中的函数分为两类:内置函数和自定义函数。
内置函数由MATLAB直接提供,而自定义函数则需要用户自己编写。
MATLAB 通过函数句柄(function handle)来调用自定义函数。
函数句柄是一个指向函数入口的指针,可以通过函数名获取。
实现MATLAB std 函数的步骤如下:1.编写C 语言代码,实现所需的功能。
2.使用MATLAB 的C 语言接口(MATLAB Compiler)将C 语言代码编译成MATLAB 可调用的函数。
3.在MATLAB 中使用函数句柄调用编译后的C 语言函数。
【实例:使用C 语言实现MATLAB std 函数】为了演示如何实现MATLAB std 函数,我们以一个简单的例子为例。
假设我们要实现一个名为“my_function”的函数,该函数接受一个整数参数n,并计算n 的阶乘。
在MATLAB 中,我们可以这样调用该函数:```matlabresult = my_function(5);```首先,我们需要编写C 语言代码实现该功能:```c#include "matlab_std.h"// MATLAB 函数入口void my_function(int n) {// 计算n 的阶乘int result = 1;for (int i = 1; i <= n; i++) {result *= i;}// 返回结果MATLAB_return_double(&result);}```接下来,我们需要使用MATLAB Compiler 将C 语言代码编译成MATLAB 可调用的函数。
Matlab与VC的接口设计
第2 7卷 第 5 期
20 0 6年 5月
湖南科技学院学报
J u a o n n Un v r i fS i n e a d E g n e i g o r l fHu a i e st o c e c n n i e rn n y
VO .7NO5 1 . 2 M a .0 6 y2 0
M t a b与 V l a C的接 口设计
韦美雁
( 湖南科技 学院 信息 与计算机科学 系,湖南 永州 45 0 ) 2 0 6
摘 要: 简述了Maa 与 V tb l C实现相互通信的意义, 着重介绍了Maa 与 V tb l C相互调用的方式, 并对在 V 调用Maa C中 tb l
meP it ‘ hsi my f s p o rm! ; x r f ' i s r r ga ” n (T i t )
程序 代码 以实现具体 的通信功能 ,
)
二
Maa t b调用 VC的接 口 l
meF n t n函数中参数 的具体说明 :nh 为整型 ,用 x u co i ls 来说明函数的输 出参数个数 ;ls ph 为一指向 mx ry结构体 Ar a
作用则是提供 c 十 F r a 语言与 Mal + 或 ot n r t b的交互操作 .m a Ux
一
自动控制、 信号处理、 图像处理等若干个领域的计算和图形
处理 功能 。 以矩阵作 为基 本数据结构 , 它 因而非常适合大规
模 的数值计算 。但 Ma a tb是解释性语 言 ,对命令是边解释 l
边 执行 的, 因而其执行的速度比较慢 , 特别是进行循环计算
时。 如果执行多次嵌套, 则其执行速度会更慢。 c + 而 + 是编
Matlab与VB、VC高级语言的接口方法
展开介绍了 !"#$"% 与 =>K =: 进行接口的常用的几种方法 K 即中间文件传递法、 动态连接库 LMM、 动 态数据交换 LLN、引擎应用程序、OP#8QBR 自动化服务技术和 !"#P(7 等方法,最后对其效果进行了 小结 0 关 键 词: !"#$"% 软件;接口技术;动态数据交换; OP#8QBR 自动化服务;引擎 文献标识码 T O 中图分类号: 1S ;,,0 ,
!"#$"% 是 !"#&’()*+ 公司于 ,-./ 年推出的 一套高性能的数值计算软件 0 它集数值分析、矩 阵运算、 信号处理和图形显示于一体, 构成了一个 方便、界面友好的用户环境 0 它还包括了 1(($%(2 3 工具箱 4 的各类问题的求解工具,可用来求解特 定学科的问题 0 具有可扩展性、易学易用性和高 效性 0 由于 !"#$"% 具有如此之多的特点,在欧美 高等院校, 自动控 !"#$"% 已成为应用于线性代数、 制理论、 数理统计、 数字信号处理、 时间序列分析、 动态系统仿真等高级课程的基本教学工具;在研 究单位、 工业部门, !"#$"% 也被广泛用于研究和解 决各种工程问题 0 然而 !"#$"% 自身所存在的某些 缺点限制了它进一步应用的范围 0 3 , 4 !"#$"% 是一种解释性语言, 因此它的实时 效率是相当差的 0 例如在一个电机控制系统项目 中,采用 !"#$"% 语言编写的仿真程序,在工业用 控制机 3 奔腾 555 4 上需要 /6 789, 而同样的算法, 用 : 语言实现,仅需 ;6 多秒 0 由此可见,!"#$"% 的 语言执行效率是比较低的 0 3 / 4 !"#$"% 程序不能脱离其环境运行, 因此它 不能被用于开发商用软件 0 3 ; 4 !"#$"% 程序可以被直接看到程序的源代 码, 因而不利于算法和数据的保密性 0 3 < 4 不能实现端口操作和实时控制 0 在工程应用中, 一般用 =:, =>, : ? ? >@8$AB) 等高级语言编写应用程序, 实现交互界面、 数据采 集和端口操作等,但这些高级语言在数值处理分 析和算法工具等方面,其效率却又远远低于 !"#C !"#C $"% 语言 0 在准确方便地绘制数据图形方面,
matlab与c++接口
我在课题中涉及到了部分MATLAB与C++的接口知识,在这里总结出来,算是抛砖引玉吧。
其中错误以及偏颇的地方,尚请各位大侠以及高手多多指教,谢谢!(一)接口种类用C++(或者C)语言操作MATLAB,有三种途径:·MEX文件在MATLAB中可调用的C或Fortran语言程序称为MEX文件。
MATLAB可以直接把MEX 文件视为它的内建函数进行调用。
MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。
MEX文件主要有以下用途:对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。
对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。
·MAT文件应用程序MA T文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入、从MATLAB导出数据的数据文件格式。
MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据。
而且,它还提供了一种途径来向其它单机MATLAB应用导入或者导出数据。
为了简化在MATLAB环境之外对MAT文件的使用,MATLAB给出了一个操作例程库,通过它,我们可以使用C/C++或者Fortran程序读写MAT文件。
·引擎应用程序MATLAB提供了一系列的例程使得别的程序可以调用MATLAB,从而把MATLAB用作一个计算引擎。
MATLAB引擎程序指的是那些通过管道(在UNIX系统中)或者ActiveX(在Windows 系统中)与独立MATLAB进程进行通信的C/C++或者Fortran程序。
MATLAB同样提供了一个函数库来启动或者结束MATLAB进程、与MATLAB交换数据以及发送MATLAB命令。
(二)MEX文件1、一个MEX的例子#include "mex.h"/** tim estwo.c - exam ple found in API guide** Computational function that takes a scalar and doubles it.** This is a MEX-file for MATLAB.* Copyright (c) 1984-1998 The MathWorks, Inc.*//* $Revision: 1.5 $ *//* 本MEX文件的目的是实现timestwo的功能void tim estwo(double y[], double x[])是你的C++函数*/void tim estwo(double y[], double x[]){y[0] = 2.0*x[0];}/*下面这个mexFunction的目的是使MATLAB知道如何调用这个timestwo函数*/void m exFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )/* nlhs是MATLAB命令行方式下输出参数的个数;*plhs[]是MATLAB命令行方式下的输出参数;nrhs是MATLAB命令行方式下输入参数的个数;*prhs[]是MATLAB命令行方式下的输入参数;*/{double *x,*y;int m rows,ncols;/* Check for proper number of argum ents. */if(nrhs!=1) {m exErrMsgTxt("One input required.");} else if(nlhs>1) {m exErrMsgTxt("Too m any output arguments");}/* 在MATLAB命令行方式下,本MEX文件的调用格式是y=timestwo(x) 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一开始就检查nrhs是否=1以及nlhs是否>1(因为MATLAB有一个缺省输出参数ans,所以nlhs可以=0 */输出参数ans,所以nlhs可以=0 *//* The input must be a noncom plex scalar double.*/m rows = mxGetM(prhs[0]); /* 获得输入矩阵的行数*/ncols = mxGet N(prhs[0]); /* 获得输入矩阵的列数*/if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||!(mrows==1 && ncols==1) ) {m exErrMsgTxt("Input must be a noncom plex scalar double.");} /* 判断输入矩阵是否是double类,以及它是否只包括单个元素*//* 为输出创佳一个矩阵,显然这个矩阵也应该是1x1的*/plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);/* 获得指向输入/输出矩阵数据的指针*/x = mxGetPr(prhs[0]);y = mxGetPr(plhs[0]);/* 调用C++函数timestwo(y,x) */tim estwo(y,x);}把上面这个文件用MEX编译后,MATLAB命令行下调用的实例x = 2;y = timestwo(x)y =y =42、MEX文件的编程规则(1)编制自己的C++算法程序(2)紧跟着定义mexFunction函数,mexFunction的定义法唯一:它只能是如下形式:void m exFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )其名称和参数类型不许有任何改变,在mexFunciton函数中可以调用你刚定义好的C++程序。
Matlab与VC通用接口程序的实现
邮局订阅号:82-946360元/年技术创新软件时空《PLC 技术应用200例》您的论文得到两院院士关注Matlab 与VC 通用接口程序的实现General Interface Device Between Matlab and VC(华侨大学)彭长青尚荣艳PENG Chang-qing SHANG Rong-yan摘要:Matlab 编程效率极高,但执行效率非常低;Visual C 开发功能强大,执行速度快,但编程繁琐。
Matcom 可以实现Matlab 和VC 的完美结合。
本文探讨了基于Matcom4.5的VC 与Matlab 接口程序的实现问题,从建立文档方式和建立文本框方式两种角度,详细介绍了将CPP 代码插入VC 的框架,即建立Matlab 和VC 的通用接口程序的方法。
该方法实现了Matlab 与VC 程序的混合编制,具有一定的实用价值。
关键词:Matlab ;VC ;Matcom4.5;接口程序中图分类号:TP311.1文献标识码AAbstract:Matlab programming is extremely efficient,but its execution efficiency is very low.Visual C can develop powerfully and ex -ecute fast,but its programming is very tedious.Matcom can achieve the perfect combination of Matlab and VC.The paper empha -sizes the realization of the interface program between Matlab and VC based on Matcom4.5.The framework to insert CPP code into VC is introduced in detail by establishing a document and establishing a text toolbar,which is the method to establish a general in -terface device between Matlab and VC.The method achieves the mixed programming technology for Matlab and VC and has certain value in practice.Key words:Matlab;VC;Matcom4.5;Interface Device文章编号:1008-0570(2010)09-3-0105-031引言Matlab 是MathWorks 公司推出的一套功能非常强大的商业数学软件,广泛应用到信号处理、语音处理、数据采集、数值运算、图像处理、电子仿真、金融分析等工业领域。
浅析VC与matlab接口编程(一)
浅析VC与matlab接口编程(一)作者:孙科除了使用MATCOM之外,matlab与vc的混合编程还有其他的几种方法:1 通过matlab engine方式。
此种方法需要在机器上安装matlab软件,而且执行效率低,因此在实际应用中不常采用这种方法,在软件开发中也不可行,比较适合个人使用或做演示用。
2 直接调用matlab的c/c++数学函数库。
vc中可以直接使用matlab提供的c/c++数学函数,此方法需要对c/c++语言非常熟悉。
3 用matlab自带的matlab compiler.此种方法有很多限制:(1)不能转换脚本m文件,只能转换m函数;(2)不能使用matlab对象;(3)不能用input或者eval操作matlab空间变量;(4)不能动态的命名变量,然后用load或者save命令来操作,不能对使用load指令装载普通文本文件的m文件操作;(5)不能处理具有嵌套调用其他m文件的m文件;(6)不能使用matlab内联函数(7)不能对使用了java接口的matlab代码文件使用4 使用matlab的combuild工具:该方法简单,通用性强,几乎可以使用matlab的任何函数,因此在程序较大,调用函数较多时使用起来效果很好,此方法也是mathworks公司推荐的使用方法;5 使用matcom工具。
相比其他方法而言,有下列优点:(1)转换过程简单,容易实现;(2)可以方便的生成dll和exe文件;(3)不仅可以转换独立的脚本文件,也可以转换嵌套的脚本文件;(4)设置环境后,可以使用matlab工具箱函数;其缺点是:(1)对struct等类的支持有缺陷;(2)部分绘图语句无法实现或得不到准确的图像,尤其是三维图像。
在不涉及到三维作图以及m文件不大的情况下,使用效果很好。
Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。
相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。
MATLAB与VC++接口技术的实现方法
6科技资讯科技资讯S I N &T NOLOGY I NFORM TI ON2008N O .01SC I ENC E &TEC HN OLO GY I NFO RM ATI O NI T 技术M AT LAB 是M a t h W or ks 公司推出的一套功能非常强大的商业数学软件,从信号处理、语音处理、数据采集、数值运算、图像处理、到电子仿真、金融分析等等,几乎在各个工业领域,他都已经得到了广泛应用,同时也取得了巨大的成功。
M AT LAB 是一种编程效率极高的编程语言,解决同样的数值计算问题,使用M ATL AB 要比使用BASI C,F ORT RAN,C 等语言编程效率要高几倍[1]。
但是,由于M ATL AB 是用一种脚本语言,他的解释是逐行执行的,程序中所有的变量都是用M xAr r a y 来实现的,所以为了保证通用性,它的执行效率非常低,这就是我们常常看到的:在开发一些复杂的算法时,通常会发现程序执行得特别慢,虽然M a t hwor ks 公司已经在竭力提高m 脚本文件(scr i pt f i l es)的运算速度,但目前为止效果仍然不能和实现同样功能的可执行程序相比。
而且m 脚本文件是不能脱离M AT LAB 这个应用程序环境,这就大大制约了程序的可移植性和通用性[2]。
同时,由于M ATL AB 的m 文件是ASC Ⅱ文件,任何人都可以打开显示代码并对其进行修改,不利于隐藏算法和保护开发者的劳动成果。
V i sua l C ++自从诞生以来一直就是W i n-dows 环境下开发应用软件的主流平台,因为Vi s ua l C++与W i ndows 操作系统同出自M i cr osof t 公司,它具有得天独厚的优势。
V i -s ua l C++集成了功能强大的编辑器、编译器、链接器、调试器、A ppW i zar d ,C l ass W i zar d,AppSt udi o 等多种多样的可视化编程工具,可以很容易的实现菜单、工具条等,具有很强大的图形界面编程能力,用它写出来的界面友好、而且最后可以生成脱离V i sual C++环境而独立运行的应用程序。
VC与Matlab的接口技术
VC与Matlab的接口技术1、Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。
其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。
但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。
Matlab引擎是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,将Matlab作为一个操作引擎使用,使其在后台运行。
一般Matlab 引擎采用客户机/ 服务器(Client/ Sever) 计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享。
一般情况下,客户机是运行前端软件的PC机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行的机器。
由于客户机和服务器共同承担处理负载,使系统总体性能大为提高。
在实际应用过程中,把VC的C语言或C + + 语言的程序作为前端客户机程序,它从Matlab 引擎接收数据信息,并与引擎传递命令的数据信息。
表1是几种常用的Matlab引擎调用函数。
2、通过Matlab引擎用户可以完成以下任务:首先,可以将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中的大量的数学计算函数,完成复杂的计算任务;其次,可以为一个特定的任务构建一个完整的系统,前台的用户界面用高级语言编写,后台的计算任务由Matlab引擎来完成;最后,用户不但可以在本地计算机上调用Matlab引擎,而且还可以通过网络调用其它计算机上的Matlab引擎,这样可以很好的实现资源的共享和作业的分工合作。
VC与MATLAB接口编程方法与实现
VC++与MATLAB接口编程方法与实现摘要本文简介了VC++和MATLAB特点,探讨了MATLAB与VC++接口编程的三种方法,并详细论述了MCC和COM组件接口编程的方法和实现过程。
研究表明:采用VC++和MATLAB 接口编程方法降低了编程难度,较好地发挥了两者各自的优势。
关键词 MATLAB;VC++;MCC;COM;接口编程MATLAB是美国MathWorks公司研制开发的一种科学计算软件,它将高性能的数值计算、符号计算和可视化集成在一起,并提供了大量的内置函数以及功能丰富的工具箱,使用方便,编程效率高。
然而,MATLAB是一种解释性语言,运行效率低,不适合作为通用的编程平台。
VC++是Microsoft公司推出的一个基于Windows平台的可视化的集成开发环境,在运行速度、功能性以及应用程序界面开发方面功能强大,但在数值计算和图形绘制方面,VC++并不具备太多优势。
因此,采用MATLAB进行核心程序的开发,用VC++制作出友好的程序界面,然后将两者结合起来,可以较大地提高编程效率。
1 VC++与MATLAB接口方法概述1.1 MATLAB引擎方式MATLAB引擎采用客户机/服务器(Client/Server) 的方式,提供了一组MATAB API函数,通过调用这些函数实现以用程序进程之间的数据传递。
在运用中,让VC++程序作为前端客户机,它向MATLAB引擎传递命令和数据,并从MATLAB 引擎接受数据信息,实现动态通讯。
1.2 MATLAB编译器(MCC)MCC是MATLAB中经过优化的编译器。
使用MCC,用户可以将MATLAB数学库、图形库和界面的MATLAB程序转化为独立于MATLAB的EXE应用程序和DLL动态连接库,在VC中编写程序界面并加载调用动态连接库,实现两者之间的连接。
1.3 COM组件组件对象模型(简称MCR)是以组件为发布单元的对象模型。
它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。
MATLAB 与 C 语言的接口
MA TLAB 到C 语言程序的转换可以由两种途径完成,其一是MA TLAB 自己提供的C 语言翻译程序mcc, 另一种是原第3 方公司MathTools 开发的MA TCOM。
后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MA TLAB 6.0 (Release 12) 中。
依本人的观点,二者都不完善,有大量的MA TLAB 函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MA TLAB 程序翻译成 C 语言程序很晦涩。
翻译后的 C 程序几乎不适合手动去维护,更谈不上升级了。
有几个不兼容的地方是不能令人容忍的,例如eval() 函数在C 翻译下是不兼容的,最新的MA TLAB 6 才刚刚敢说已经部分兼容了,但离真正的兼容还有很长的路要走,有很多艰难的技术困难需要克服,短时间内不可能有突破性的进展。
另一个大的问题是,众所周知,MATLAB 新的控制系统工具箱中定义了大量的LTI 类,MATLAB 5 开始也允许使用类与对象的概念,这已经向―面向对象‖的编程走了一大步,但MA TLAB 到C 的翻译明显都不支持―对象‖的数据类型,所以在控制系统分析与设计(当然还有其他的领域) 中这样的转换几乎没有什么实际意义,所以不要将这样的转换太理想化。
从转换的程序速度来看,因为mcc 和MATCOM 都沿用了MATLAB 的程序运算机制,所以不可能大幅度地提高程序运行速度。
相反地,如果将MATLAB 程序中明显的瓶颈部分用 C 语言按照MEX 格式编写,则可以大大加快速度。
在《科学运算语言MA TLAB 5.3 程序设计及应用》一书中以例子做过探讨,MCC 可以比快50%, 而MEX 的形式可能快上百倍。
〖举例〗分形问题:从初始点(x0,y0) 出发,按下面的公式生成新的点(x1,y1)其中gi 为(0,1) 区间均匀分布的随机数。
5第五章 VC与matlab接口
利用编译器将m文件转换成对应的C\C++文件,并在VC中调用
首先要保证编译器设置正确,编译器的设置可以参考前面两节的内容。 如果以前已经进行了配置就不需要这一步。 1、在MATLAB中编写如下函数: function [x]=gjfcz(A,b) %A=[-1.5 1 2; 4 2 3 ; -3 2 8] %b=[3;5;6] x=A\b 保存名为gjfcz.m,该函数的功能为求解线形方程组。 2、在MATLAB的命令窗口输入以下命令:mcc -m gjfcz.m 该命令用来生成对应的C文件和可执行程序。在MATLAB工作目录下(一 般是MATLAB\work)将会生成如下文件:gjfcz.exe,gjfcz.c,gjfcz.h, gjfcz_main.c,其中gjfcz.c,gjfcz.h是我们需要的文件。
5.将第四步拷贝的四个文件加入到VC工程中:工程->添加工 程->文件,选择刚才拷贝到Example2目录下的四个文件。完成 后如图
22
5、在ExamleDlg.cpp中加入如下代码: #include "matlib.h" #include "Test1.h" 6、在void CExamleDlg::OnButton1()中分别添加一个初始化类 库调用函数”initM(MATCOM_VERSION)”和一个结束类库调用 函数”exitM()”
14
Matcom 简介
这是个第三方控件,很小(8M多),原本属于mathtool公司,后 来被Mathworks公司合并了,使用该工具可以将m脚本文 件和m函数转化成相同功能的C\C++文件,相比其它方法 使用matcom具有如下优点: 1. 转换过程简单(由matcom工具自动实现),容易实现; 2. 可以方便的生成动态链接库文件(dll)和可执行文件(exe); 3. 不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件; 4. 设置环境后,可以使用Matlab的工具箱函数; 但matcom也有以下不足: 1. 对struct等类的支持有缺陷,对class数据类型; 2. 部分绘图语句无法实现或得不到准确图象,尤其是三维图 象;
Matlab与C_C_的接口及其在仿真中的应用
文章编号:1671-637Ò(2002)04-0040-05Matlab 与C /C ++的接口及其在仿真中的应用周正人, 张凤霞, 赵振宇(中国航空工业洛阳电光设备研究所,河南洛阳 471009)摘 要: 介绍了如何利用Matlab 与C /C ++的接口将现有的C 程序代码导入到Matlab 中使用,以及将Matlab 的m 文件导出到VC 中,从而可以利用Matlab 和VC 的各自优势进行仿真软件的开发。
这能够大大提高开发效率。
关 键 词: Matlab; 接口; m 文件; 仿真中图分类号: TP 31; TP 39 文献标识码: BMatlab C /C ++interface and itsapplication in simulationZHOU Zheng-ren, ZHANG Feng-xia, ZHAO Zhen-yu(Luoyang I nstitute of E lectro -optical Equipment , Luoyang 471009, China )Abstract : This paper introduces how to import current C codes to Matlab and export Matlab m files to VC by the Matlab C/C++interface.In this way,simulation software can be developed with the integrated superiority of Matlab and VC ,and the developing efficiency can be increased .Key Wor ds : Matlab ; interface ; m file ; simulation0 引言Matlab 是个功能完善的自包容程序设计和数据处理集成环境,在科学运算、数据处理、系统分析、控制系统和科学绘图领域,使用Matlab 具有非常明显的优势。
MATLAB与C语言的接口研究
功能:获得某个阵列的实数部分的第一个数据 参数说明:*array_ptr 输入阵列指针 返回值:函数返回一个双精度类型的数据,相当于 C 语言中的标量。通过此函数,用户 可以获得某个阵列的实数部分的第一个数据 (2) double * mxGetPr(const mxArray * array_ptr)
4
图 2.3
设置 Include files
同理,选择 Show directories for -> Library files,添加路径: D:\MATLAB6p5\extern\lib\win32 D:\MATLAB6p5\extern\lib\win32\microsoft\msvc60 至此,设置完成了。
2
2.1 MATLAB C/C++编译器的设置
编译环境设置
ቤተ መጻሕፍቲ ባይዱ
正所谓“工欲善其事必先利其器”,在开始学习前需先分别对 MATLAB 和 VC 的工 作环境进行设置[6]。本文使用的软件是 MATLAB6.5 与 VC++6.0,它们的安装目录分别 是 D:\MATLAB6p5 和 D:\Program Files\Microsoft Visual Studio。 (1) 运行 MATLAB 软件,运行 mex –setup 命令(注意 mex 后有一个空格) >> mex –setup MATLAB 系统会显示如下内容: Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers [y]/n? (2) 输入 y,显示如下内容: Would you like mex to locate installed compilers [y]/n? y Select a compiler: [1] Lcc C version 2.4 in D:\MATLAB6P5\sys\lcc [2] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio [0] None Compiler: (3) 选择 VC++6.0,输入 2,显示如下内容: Compiler: 2 Please verify your choices: Compiler: Microsoft Visual C/C++ 6.0 Location: D:\Program Files\Microsoft Visual Studio Are these correct?([y]/n): (4) 确认 VC 编译器路径,输入 y,显示配置成功的信息: Are these correct?([y]/n): y The default options file: "C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R13\mexopts.bat"
MATLAB与C语言接口
MATLAB与C语言接口目录摘要 (1)第一章绪论 (2)1.1 MATLAB与C语言接口编程的好处 (2)1.1.1提高效率,突破瓶颈 (2)1.1.2继承宝贵财富 (2)1.1.3优势互补 (2)1.1.4编译器功能 (3)1.2 本文特点和框架 (3)第二章编译器 (3)2.1 MEX文件的编译--MEX指令 (3)2.2 建立MEX环境 (5)2.2.1 Lcc编译器MATLAB环境配置 (5)2.2.2 VC++编译器MATLAB环境配置 (7)2.3用MATLAB插件在VC环境中编写编译链接C MEX函数 (7)2.31 MATLAB插件在MSVC环境中的配置 (7)2.3.2 C MEX函数的编写编译链接过程示例 (10)2.4编译器的其他功能 (14)第三章MATLAB对C语言的调用――MEX文件 (15)3.1关与MEX文件 (15)3.1.1 MEX文件的帮助信息 (15)3.1.2 mex库函数和mx库函数 (16)3.1.3mxArray结构体 (16)3.2MEX文件的组成和参数 (16)3.3编写C MEX函数的基本流程 (16)3.4MEX文件的例子 (20)3.4.1 Fibonacci数列—MEX文件对C文件的调用 (20)3.4.2气泡法排序 (21)3.4.3 MATLAB的自带程序—yprime (23)3.4.4MATLAB的另一自带示例程序-- mexeval.c (25)第四章C对MATLAB的调用--MATLAB计算引擎 (26)4.1关于引擎函数和引擎库 (26)4.2引擎函数调用格式 (26)4.3 C程序调用引擎函数示例 (26)4.3.1 一个简单的引擎函数 (26)4.3.2 MATLAB自带的C示例程序 (28)第五章数据交互-MAT文件 (31)5.1关于MAT文件和MAT库函数 (31)5.2 MAT文件的组成 (31)5.3 MAT文件的编译 (32)5.4 MAT文件的例子 (32)5.4.1一个存储C程序结果MAT文件的创建函数 (32)5.4.2创建C MAT 文件的例子 (34)5.4.3读取MAT文件的例子 (38)第六章结束语 (42)附录1 MEX命令参数 (43)附录2 Mx库函数 (43)附录3 mex函数库 (47)附录4 C 引擎库函数 (47)附录5 C MAT-File 库函数 (48)参考文献 (49)致谢 (50)摘要MATLAB是一个功能完善的程序设计和数据处理的软件,是一个完全独立的系统. MATLAB系统也是一个扩充的系统,MATLAB提供了接口:对用其他编程语言书写的外部程序,需要与外部程序共享的数据,等等。
MATLAB与C语言接口
3. Matlab 中使用 中使用C 1、安装C语言编译器 mex -setup 2、编译MEX文件 例如:mex yprime.c 会生成yprime.dll 调用 yprime(1,1:2:7)
4. C语言 语言MEX文件构成 语言 文件构成 1.入口子程序 void mexFunction( int nlhs, //输出参数数目 mxArray *plhs[], //输出参数指针数组 int nrhs, //输入参数数目 const mxArray*prhs[] //输入参数 ) //指针数组 2.计算功能子程序
2. VC++中使用 中使用Matlab 中使用
1. 在VC的包含文件目录中加入: (Matlab目录)\ extern\include 2. 在VC的库文件目录中加入: (Matlab)\extern\lib\win32\microsoft\msvc71 3.在C:\ProgramFiles\MATLAB704 3. C:\ProgramFiles\MATLAB704 \extern\lib\win32\microsoft\msvc71 目录中找到四个库文件libmex.lib、libmat.lib、 libeng.lib、libmx.lib加入到VC程序的Project中
第十章 与C语言接口
1. C中调用 中调用Matlab 中调用 在C语言或C++中可以调用Matlab的各种功 能,包括各种语句、调用M文件或使用工具箱 函数。 这就为我们在使用各种C或C++语言编程时 使用各种Matlab内的成熟算法提供了方便。 C或C++中调用Matlab的方法和例子请查看 目录: \Program Files\MATLAB704\extern
Matlab与C语言程序的编程接口
MATLAB的应用程序接口主要方法有三种:通过MAT文件实现 与其它编程环境的数据交换;通过MEX文件实现在MATLAB环境中 调用其它语言编写的程序:通过MATLAB引擎实现在其它编程环境 中使用MAlrIAB的计算功能。
1.MAT文件 MAT文件是MATIAB使用的一种特有的二进制数据文件。MAT 文件可以包含一个或者多个MA’ItAB变量。在MAT文件中不仅保存 各变量数据本身,而且同时保存变量名以及数据类型等。所以在 MATLAB中载人某个MAT文件后.可以在当前MA,11AB工作空间完 全再现当初保存该MAT文件时的那些变量。这是其他文件格式所不 能的。同样,用户也可以使用MAT文件从MATLAB环境中导出数据。 MAT文件提供了一种更简便的机制在不同操作平台之间移动 MATLAB数据。 C/C++程序中有两种方式可以读取MAT文件数据。一种是利用 MATLAB提供的有关MAT文件的编程接口函数。MATLAB的库函数 中包含了MAT文件接口函数库,其中有各种对MAT文件进行读写的 函数,都是以mat开头的函数。 另外一种在C/C++程序中读写MAT文件的方法是根据MAT文 件结构,以二进制格式在C/C++中读入文件内容,然后解析文件内容, 从而获得文件中保存的MATLAB数据。因为MAT文件格式是公开
科技信息
OIT论坛0
Matlab与C_C_语言接口的方法.pdf
第20卷第4期佳木斯大学学报(自然科学版)Vol.20No.4 2002年12月Journa l of J i am usi Un iversity(Na tura l Sc ience Ed ition)D ec.2002文章编号:1008-1402(200204)-0428-05M atlab与C C++语言接口的方法①王洪东, 樊廷栋, 闫振林(黑龙江省理工学校,黑龙江佳木斯154002)摘 要: 通过M atlab与C C++语言的混合编程,将M atlab的代码编译成V C可识别的代码,并成为可独立执行的动态链接库,从而实现了在V C中直接书写M atlab语言,驱动M atlab运行,该方法可以提高M atlab的速度和安全.关键词: M atlab;接口;V C;C语言中图分类号: T P312 文献标识码: A0 引 言作为一种汇编语言和可视化工具,M A TLAB具有较强的功能,它可以解决工程设计的许多问题. M A TLAB具有使用方便、功能较强、界面友好、开放性强等特点,因而深受用户欢迎.近年来,随着M A TLAB版本的不断升级,它所包含的应用工具箱的功能越来越强大,已经由最初的偏重于自动控制领域向信号处理、图像处理以及工程问题等领域不断发展,并很快成为应用学科中的计算机辅助分析、仿真、教学等不可缺少的基础软件.[1]1 M atlab介绍M atlab是当今世界上使用最广泛的数学软件,它具有较强的数值计算、数据处理、系统分析、图形显示、甚至一个完整的数学平台符号运算.在这个平台上,只需寥寥数语就可以完成十分复杂的功能,大大提高了工程分析与计算的效率.另外由于M atlab的广泛使用,出现了为各领域专门使用的工具箱(即在某一研究领域常用数学工具的函数包),这些工具箱的出现更加促进了M atlab的流行.M atlab的最大特点是其基本数据单位是矩阵,矩阵是M atlab的核心,M atlab中所有的数据都是以矩阵形式存储的,而且每个元素都被看成复数.M atlab提供了矩阵运算,使得用户可以以多种形式快速地操作数据.此外,M atlab还提供了类似其它计算机编程语言的编程特征,它的指令表达形式和数学、工程中常用的形式十分相似.M atlab的另一个特点是编译语言紧凑、库函数非常丰富.M atlab经过多年的发展,目前已经开发了一系列的产品,包括M atlab的“主包”和几十个可选的“工具包”(Too lbox),主包中有几百个核心函数.工具包可分为两类:功能性工具包和学科性工具包.功能性工具包主要用来扩充M atlab的符号计算功能、图形处理功能、文字处理等.而学科性工具包是指那些专业性比较强的工具包,通常只适用于某些特定的专业,如控制工具包(Con tro l Too lbox)、信号处理工具包(Signal P rocessing Too lbox)、通信工具包(Comm un icati on Too lbox)等.这些工具包使用户不用再编写自己学科范围内的基础程序,避开了非常复杂而又繁索的子程序编写.[2]M atlab的第三个特点是具有强大的图形功能.利用M atlab可以很方便的实现计算结果的可视化,而且可以很方便地修改和编缉图形界面,使用起来非常方便.这一点是其他用于科学计算的编程语言,例如C语言、FOR TRAN语言等所无法比拟的.此外,M atlab还具有程序缩写方便、程序的可移植性好、开放性①收稿日期:2002-09-10作者简介:王洪东(1968-),男,黑龙江伊春人,黑龙江省理工学校讲师.等特点.2 M A TLAB 与V C ++或C 的混合编程M A TLAB 提供了C C ++数学库,其中的V C ++数学库和C ++数学库功能很强,使用它可以用类M atlab 的语法编写C ++程序,十分方便.虽然速度上仍然比普通的C C ++程序慢,但由此换来的高开发效率和可靠性往往是值得的.在V C 的集成开发环境里使用M atlab ,可以利用M atlab 的数学库将M atlab 的程序编译为编译器所能识别的源代码嵌入V C 的环境.熟悉M atlab C 或C ++数学库的人也可用C 或C ++的语法在V C 环境里直接编写程序.不过,M atlab 的数学库在开发时似乎倾向于编译独立的可执行程序,把V C 只作为一个编译和连接的工具,而没有过多地考虑在V C 的集成环境下进行开发,这给混合编程带来了很大的不便.为了解决此问题,经过多次实践,总结出下列接口方法.使M atlab 能在V C 的集成环境中进行开发,需求调试环境为M atlab 5.3和V C ++6.0开发平台,并且假定M atlab 安装在c : m atlab ex tern include 目录下.2.1 将M atlab 的代码编译为V C 编译器能识别的代码用M atlab 内部的编译器M CC 将M atlab 工具箱中的函数转换成C 编译器或C ++编译器所能识别的源代码,即将.m 文件转换成.cpp 文件和它的头文件(.h 文件).转换之后,可将.cpp 文件和.h 文件加到V C 的工程项目中和工程项目一起编译即可.也可以用M CC 编译器编译为stand -alone 程序,使其独立运行.下面介绍将M CC 生成的C ++程序嵌入到V C 时,应对V C 编译环境所作的处理.1) 设置项目编译选项 首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单: P ro ject ->Settings ->C c++ 1. Catego ry :P rep rocesso r P rep rocesso r defin iti on s : 添加:M SV C ,I BM PC ,M S W I ND 2. Catego ry :P recom p iled H eaders 选择:A u tom atic u se of p recom p iled headers T h rough header :stdafx .h2) 设置项目连接选项 首先要把M atlab 的几个函数定义文件(3def )生成相应的库文件(3.lib ): libmm file .def libm cc .def libm atlb .def libm x .def libm at .def 它们位于目录c : m atlab ex tern include 用V C 下的DO S 命令lib 导出库文件: libmm file .lib libm cc .lib libm atlb .lib libm x .lib libm at .lib 将它们放入你的项目连接选项: P ro ject ->Settings ->L ink Catego ry :Inpu t O b ject lib rary m odu les : 添加:libm atpm .lib libmm file .lib libm cc .lib libm atlb .lib libm x .lib libm at .lib3) 设置编译环境 Too ls ->Op ti on s ->D irecto ries Includee files 添加:924第4期 王洪东等:M atlab 与C C ++语言接口的方法034 佳木斯大学学报(自然科学版) 2002年 C: m atlab ex tern includee C: m atlab ex tern includee cpp L ib rary files添加: C: m atlab ex tern lib C: m atlab ex tern lib4) 编写程序M CC命令生成的CPP文件和自己手工编写的CPP文件,其项目设置是完全相同的,程序语法原则上也是一样的,只是M CC生成的CPP文件有大量用于解释的代码.(1).添加自己编写的程序模块用下面的文件头:#Include"stdafx..h"#Include"m atlab.hpp"然后,按照C++M ath lib文档要求的格式书写程序.(2).嵌入m cc生成的文件在M atlab下用下面格式的命令生成cpp文件,假定要编译的函数名为Functi on N am e:m cc-t-L Cpp Functi on N am e得到:Functi on N am e.hpp,Functi on N am e.cpp将Functi on N am e.hpp加入项目,不做任何改动.最后进行编译就可以了.2.2 将M atlab的函数编译为可独立执行的动态链接库用M atcom(M I D EVA)或M CC将M atlab工具箱中的函数编译为DLL文件,然后放在工程项目的同一个路径下或系统下.这样一来,工程项目就可以直接调用该函数.这种方法的好处是M atlab所编译的函数不需要和V C的代码一起编译.适合做一些自定义的函数来扩展V C所编的应用程序的功能.对于编译为DLL文件的方法,在M atcom环境里的文件菜单直接给出了编译为动态链接库的菜单项.只要点击该命令,系统会自动给出1个对话框,要求给出要编译的M atcom文件(或M atlab文件)的路径.也可以在M atlab环境里用命令:m cc-x Functi on N am e(假定所要编译的M atlab或M atcom函数的名称为(Functi on_N am e),该命令会启动M CC编译器,将函数自动编译为动态链接库函数.2.3 V C中直接书写类M atlab和M atcom语言1) 在V C的程序里直接书写类M atcom语句[3] 按照m atcom的语法,在V C中直接书写类m atcom语句(与m atcom很相似).例如: vo id testcom(vo id) { In it M(M A TCOM V ER S I ON); 初始化M atcom进程 M m x,s,c; 定义变量,M m为M atcom的矩阵类 X=co lon(0,0,0,01.10); 类似fo r循环语句 S=sin(x); 正弦函数 C=co s(x); 余弦函数 P lo t((CL(x),c,x,s,)); 画出正弦和余弦函数 Ex it M(); 退出M atcom进程 }testcom 这个函数是在V C 的源程序里直接书写M atcom 语句,其中所有的变量x ,s ,c 都是一个序列数,而不是一个单独的值.在过程开始时必须初始化M atcom 进程,即In it M (M atcom V ER S I ON );当书写完M atcom 语句结束过程时,需要退出M atcom 进程,如程序中的ex it M ().其中的co lon ()函数和p lo t()函数都是M atcom 下的函数.co lon (0.0,0.01,10)类似一个fo r (x =0.0;x <10;x =x +0.01)的循环语句.M atcom 优于M atlab 的主要地方是M atcom 支持图形,即支持P lo t ()函数和其他图形函数在V C 中直接应用.2) 在V C 里直接书写类M atlab 语句 vo id testlab (vo id ){ mwA rray a ,b ,u ; 定义矩阵变量 a (2,2)=-0.7497,1,-0.2027,0; 对矩阵变量赋值 b (2,1)=-04.1841,-6.5049; 对矩阵变量赋值 u =1; 对矩阵变量赋值 mwA rray x (mwA rray ::UNA SS IGN ED ); 初始化变量X (L T ITR )GetP roc A ddress (handler DLL ,"ltitr "); 获得ltitr 函数的操作地址 x =ltitr (a ,b ,u ); 调用ltitr 函数 ofstream ou tfile ("lab .tx t );建立文件lab .tx t ou tfile <<; 将结果x 输出到lab .tx t 文件中保存}在teatlab 这个函数中,用V C 可以识别的V C ++数学库中的mwA rray 类来定义数组变量,而且赋值得方式和普通的V C 数组变量不同.在普通的V C 语句中是a (2,2)个数值,即仅代表1个2行2列的数组的第2行第2列上的1个值,而在以上V C 例子中类似的M atlab 语句中的a (2,2)则代表2行2列的所有4个值.而且类M atlab 语句不支持图形.2.4 内部驱动M atlab 运行首先用M atlab 的内部引擎在中激活M atlab ;然后,把要执行的数据和过程写在M atlab 的工作区,由M atlab 来完成运算.下面是在V C 中调用M atlab 的引擎时需要对V C 环境的设置.1) 生成几个静态库文件在目录c : m atlab ex tern include 下找这几个文件:libeng .def ,libm x .def ,libm at .def在DO S 行命令下用V C 的命令生成3个库文件;把生成的3个库文件:libeng .lib ,libm x .lib ,libm at .lib 把生成的3个L I B 文件加入L I N K 项.2) 设置编译选项在里面选:在B u ild >Settings >C C++>P recom p iled H eaders 里面选:A u tom atic u se of p recom p iled haders ,th rough header :stdafx .h3) 编写程序并加入你的P ro ject程序可以.C 或.CPP 文件.在程序的开头一定要包含头engine .h 文件.4) 调用M atlab 接口函数,写包含有engine .h 驱动功能的模块[4]在CPP 文件里直接调用M atlab 的接口函数来激活M atlab ,然后将要执行的数据和函数写入M atlab 的工作区即可.134第4期 王洪东等:M atlab 与C C ++语言接口的方法234 佳木斯大学学报(自然科学版) 2002年例如:Engine3engOp en(con st char3starc m d); 驱动M atlab的接口函数In t engPu tA rray(Engine3ep,con st m xA rray3m p); 将变量写入M atlab工作区In t engEvalString(Engine3ep,con st char3string); 将要执行的功能函数以字符串的形式写入工作区.In t engC lo se(E lo se(Engine3ep); 关闭M atlab引擎,退出M atlab所有的接口函数都在engine.h头文件中声明.接口函数的使用方法可以查阅M A TLAB A pp licati on P rogram I帮助系统,也可以n terface帮助系统,也可参考M atlab自带的例子:c: m atlab ex tern exam p les eng_m at engw indem o.c5) 设置其他编译连接选项Too ls->Op ti on->D irecto riesInclude files添加:c: m atlab b in这样编译就可通过了.在AU TO EXEC.BA T的PA TH加上c: m atlab b in,程序就可以执行了.3 结 语上面提出的方法成功地实现了M atlab与C语言这间的接口,使得C语言可以自由地调用M atlab强大数学处理函数.该方法不仅解决了M atlab由于是行解释(即一句一句执行)方式带来速度慢的缺陷,更为重要的是在用户自己开发的系统中,避免了编写一复杂又繁琐的子程序,且完全脱离了M atlab系统,当代码被编译成可执行程序后,大大提高了程序的安全保护性,该方法的缺陷是它不能实现所有的M atlab 函数的调用,尤其是M atlab中丰富的图形函数不能被调用.参考文献:[1] D uane H ansel m an B ruce L ittlefield.精通M A TLAB综合辅导与指南[M].西安:西安交通大校出版社,1998.1.[2] 李海涛,邓樱编著.M A TLAB6.1基础及应用技巧[M].北京:国防工业出版社2002.3.[3] 刘朝英等.M A TLAB在模糊控制系统仿真中的应用[J].计算机仿真2001(4).[4] 谭浩强著.C程序设计(第二版)[M].北京:清华大学出版社1999.12.THE INTERFACE BET W EEN M AT LAB AND C C++W A N G H ong-d ong, FA N T ing-d ong, YA N Z hen-lin(Sc ience and Eng i neer i ng School of He iL ongj i ang Prov i nce,He ilongj i ang J i amusi154002,Chi na) ABSTRACT: T h rough the m ix p rogram of M atlab and C C++,the code of M atlab can be recogn ized by V C,w h ich becom es indep enden t execu tive of dynam ic link lib rary to drive M atlab.T hen, M atlab language can be directly w ritten in V C.T h is m ethod increases bo th speed and safety of M atlab.KEY WOR D S: M atlab;In terface;V C;C。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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) 区间均匀分布的随机数。
要求从
(x1,y1) 再生成(x2,y2),... ,直至生成1,000,000 个点(有点夸张,但
太少了用MATLAB 测时间不准)。
可以下
MATLAB 的载用M- 函数写的程序、用Mex_C。