C语言与matlab接口
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程序

//
printf("For example: X = 1:5\n");
//
printf(">> ");
//
//
fgets(str, BUFSIZE, stdin);
//
//
/*
//
* Evaluate input with engEvalString
//
*/
//
engEvalString(ep, str);
// * will then recover the variable, and determine its type.
// */
//
// /*
// * Use engOutputBuffer to capture MATLAB output, so we can
// * echo it back. Ensure first that the buffer is 的详细代码
/* $Revision: 1.8.4.4 $ */
/* * engdemo.c * * A simple program to illustrate how to call MATLAB * Engine functions from a C program. * * Copyright 1984-2011 The MathWorks, Inc. * All rights reserved */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "engine.h" #define BUFSIZE 256
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中。
matlab外部接口编程创建c语言mex文件

第3章 创建C语言MEX文件
在执行simple.c程序时,命令行中必须给定合适的输出 参数,否则根据程序中的判断将给出错误的信息,该信息是 通过mexErrMsgTxt函数给出的,该函数的详细解释可以参阅 MATLAB的帮助文档,在3.5小节中,还会再次使用该函数来 控制程序的错误。
第3章 创建C语言MEX文件
3.2 MEX源文件的结构
3.2.1 源文件的基本结构
C语言MEX源文件是标准的C语言源文件,其程序的基本 语法完完全全是ANSI C的语法结构。所以,请读者注意,某 些C/C++编译器不仅仅支持标准C语言的语法,可能还支持一 些特殊的C语法结构,例如Microsoft Visual C/C++ 6.0的编译器 支持以“//”的形式添加程序注释,这些特殊的程序特性最好不 要出现在C语言MEX源文件中,以免影响了程序的可移植特性。
nlhs:表示输入参数的个数。
Plhs:mxArray类型的指针数组,表示MEX函数的输入参 数。
Nrhs:表示输出参数的个数。
Prhs:mxArray类型的指针数组,表示MEX函数的输出参 数。
第3章 创建C语言MEX文件
其实上述输入、输出参数的名称非常容易记忆,lhs代表 Left hand parameters,rhs代表right hand parameters,n 代表number,p代表pointer。这里的左手和右手如何划分呢? 例如在MATLAB中调用求伯特图的函数时,可以这样表示:
第3章 创建C语言MEX文件
例3-1的源文件第004行和005行为C语言MEX源文件的入口 函数部分。这两行代码是所有C语言MEX源文件必须包含的内容, 而且书写的内容也必须按照固定的格式,也就是说必须按照例 子中的书写方法来表示这两行代码: void mexFunction(int nlhs, mxArray *plhs[],
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++程序。
浅析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转化代码要简单和方便得多。
VisualC_与MATLAB程序的接口研究

3 2008204203收到,2008208206改回33 沈智芳,女,1974年生,讲师,研究方向:计算机科学。
文章编号:100325850(2008)1020066203V isual C ++与M AT LAB 程序的接口研究V isua l C ++and M AT LAB the Procedure I n terface Stud ies沈智芳 易从艳(咸宁职业技术学院 咸宁 437100)【摘 要】通过M A TLAB Engine ,A u tom ati on 服务器和M A TLAB 数学库和图形库三种方法分别实现在V isual C ++中调用M A TLAB 程序,并比较了它们各自的优缺点。
在实例中,运用M A TLAB Engine 方法做成一个动态链接库,满足了封装性的要求,实现了与V isual C ++的接口。
【关键词】V isual C ++,M A TLAB ,接口,动态链接库中图分类号:T P 311文献标识码:AABSTRACT T he m athem atics w arehouse and th ree k inds artw o rk w arehouse m ethod have called the M A TLAB p rogram by M A TLAB Engine ,A utom ati on sever and M A TLAB in com ing true respectively in C ++,and have comp red their respectiveexcellent sho rtcom ing is in examp le m iddle the m ethod w ieding M A TLAB Engine m akes up into one developm ent caenate w arehouse ,H ave satisfied the request packagine nature ,have realized the interface w ith visual C ++.KEYWOR D S V ISUAL C ++,M A TLAB ,interface ,developm ent catenate w arehouse M A TLAB 是M ath W o rk s 公司开发的著名数值计算、系统分析与仿真工具,含有500多个数学函数,可以进行数值计算、系统分析和模拟仿真,而且编程简洁、结构完整、可移植性强。
matlab与VC之间的通讯连接

1.首先配置vc++编译环境:tools---options
2.配置工程的lib文件:project—settings
3.修改mdl文件:
将AB的值输出到workspace
将simout和simout1的save format都改成array,设置完了不要忘了点击apply Simulation—configuration parameters
设置完了不要忘了点击apply,设置了initial state和final state 运行原来的mdl文件会出错,没关系,想要在matlab里运行,直接改回去就行了
4.程序代码说明:#include "engine.h"
示范程序,每次运行间隔1秒,第二秒从第一秒的最后状态开始运行,从0到8只运行循环9次因为simulink仿真每次都是在10秒之内,也可以试试让循环运行10次看看
时间间隔有点长,看了matlab里面的单独运行原始的mdl,运行时暂停workspa里的数据基本上总共运行了1000次左右,整个程序运行不到10秒,所以建议时间间隔为0.03秒,循环10/0.03≈340或者350次
5.程序界面说明:
点击button1,但是注意程序运行有点卡,程序源码里设置每次循环完事都会弹出一个消息框,只有点击了消息框的确定,程序才会继续运行,同时此次循环最后的A和B的值显示在AB对应的框里。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 的输入数据的指针。
图1显示了如何向MEX文件输入数据,通过接口函数调用计算程序完成运算过程,最后向MATLAB返回计算结果的过程。
二、使用MEX文件
上面所述的MEX文件的两个主要部分在使用中可以是独立的,也可以是组合在一起的。
不管是哪一种情况,MEX文件都必须包含头文件"mex.h",以便正常申明入口程序。
入口程序的名字必须是mexFunction而且必须包含这些参数:
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
在C语言的MEX文件中,参数nlhs和nrhs包含输出和输入变量的数目,借助于这两个参数,MEX文件被调用。
参数plhs和prhs是包含指向MEX文件输出和输
入变量的指针的向量,prhs是长度为nrhs的输入变量的指针数组,plhs是长度为nlhs的输出变量的指针数组。
比如从MATLAB命令窗口来调用一个MEX文件:x=fun(y,z);
则MATLAB编译器使用下面的变量来调用mexFunction:
nlhs=1
nrhs=2
plhs=(pointer)->/*unassigned*/
prhs=(pointer)->y
(pointer)->z
plhs指向只有一个元素的C语言数组,并且这个元素为空指针。
prhs指向含有两个元素的C语言数组,其中第一个元素指向mxArray型变量Y,第二个元素指向mxArray型变量Z。
这里,plhs指向空的数组是由于输出x在子程序执行前尚未产生,入口程序的作用就是创建输出数组并分配指针plhs[0]指向该数组。
如果plhs[0]没有赋值,MATLAB将给出输出变量没有赋值的警告信息
三、C语言程序MEX文件实例
MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。
下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。
C语言程序如下:#include "math.h" void timestwo(double y[], double x[]) { y[0]=2.0*x[0]; return; } 下面是与C语言程序功能相同的MEX文件:#include "mex.h" void timestwo(double y[], double x[]) { y[0]=2.0*x[0]; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *x, *y; int mrows, ncols; /*检查正确的参数数目*/ if(nrhs!=1){ mexErrMsgTxt("需要一个输入参数."); } else if(nlhs>1){ mexErrMsgTxt("输出参数太多."); } /*输入变量必须是非复数类型的标量*/ mrows=mxGetM(prhs[0]); ncols=mxGetN(prhs[0]); if(!mxIsDouble(prhs[0]) mxIsComplex(prhs[0]) !(mrows==1 && ncols==1)){ mexErrMsgTxt("输入变量必须是非复数类型的标量."); } /*为返回参数创建矩阵*/ plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL); /*分配输入输出参数的指针*/ x=mxGetPr(prhs[0]); y=mxGetPr(plhs[0]); /*调用timestwo子函数*/ timestwo(y, x); }
C语言是在编译的时候检查函数参数。
MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。
如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:
mex timestwo.c
这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。
Windows系统下,扩展名为dll。
此时,就可以象调用M函数一样调用timestwo了。
在MATLAB命令窗口中输入:
x=2;
y=timestwo(x);
就可以得到:
y=4;
四、小结
MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。
MATLAB 是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。
它的最大优点就是将人们从繁杂的程序中解放出来。
因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。
MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MA TLAB环境中输入输出数据、在MA TLAB中和其他程序建立客户/服务器关系等功能。