MATLAB和C语言混合编程

MATLAB和C语言混合编程
MATLAB和C语言混合编程

MATLAB和C语言混合编程

1 、mcc4.0 编译环境设置

在桌面上右键单击“我的电脑”图标出现以下菜单

单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示

在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量matlab 值为C:\MATLAB7 即matlab7.0 的安装路径,如下图所示

在环境变量path 中加入C:\MATLAB7\bin\win32 ,如下图所示

按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置

Matlab7.0 编译器设置

(1) mex 命令设置

(a) 运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;

(b) 命令窗口出现如下提示:

Please choose your compiler for building external interface (MEX) files:

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

此时键入”y”,按回车;

(c) 命令窗口出现如下提示:

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 version 6.0 in C:\Program Files\Microsoft Visual Studio

[2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

此时键入”3”,按回车;选择Microsoft Visual C++6.0 的编译器

(d) 命令窗口出现如下提示:

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0

Location: C:\Program Files\Microsoft Visual Studio

Are these correct?([y]/n):

此时键入”y”,按回车;确认选择Microsoft Visual C++6.0 的编译器

(2) mbuild 命令设置

(a) 运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命

令后,按回车键,安装Matlab 编译器;

(b) 命令窗口出现如下提示:

Please choose your compiler for building standalone MATLAB applications:

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

此时键入”y”,按回车;

(c) 命令窗口出现如下提示:

[1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

此时键入”2”,按回车;选择Microsoft Visual C++6.0 的编译器

(d) 命令窗口出现如下提示:

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0

Location: C:\Program Files\Microsoft Visual Studio

Are these correct?([y]/n):

此时键入”y”,按回车,确认选择Microsoft Visual C++6.0 的编译器,编译器设置完成。

3 、编写Matlab 函数

函数文件sum_prod.m ,内容如下:

function [sum,prod] = sum_prod(p1,p2)

sum = p1+p2; % p1 与p2 的和

prod = p1.*p2; % p1 与p2 的点乘

该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成VC++ 环境可用的代码的方法。

4 、将Matlab 函数转成DLL 函数

在Matlab7.0 的Command Window 下输入命令:

命令1 :mcc -W lib:libsum_prod -T link:lib sum_prod.m %26ndash;v

命令2 :mcc -W cpplib:libsum_prod -T link:lib sum_prod.m %26ndash;v

生成动态链接库DLL ,编译完成后,Matlab 生成一些文件,其中

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

这些文件是我们后面需要用到的。

特别注意:命令1 生成的DLL 函数接口的数据类型是mxArray ,命令2 生成的DLL 函数接口的数据类型是mwArray 。

5 、VC++6.0 工程的创建与设置

(1) 建立一个名为Test 的C++ 控制台工程,在工程中添加一个名为Test.cpp 文件

(2) 对VC ++6.0 ,进行以下设置

单击菜单Tools ,出现如下菜单

单击Options…菜单项,出现Options 对话框,选择Directories 标签,在include files 里面加入:

C:\MATLAB7\EXTERN\INCLUDE

如下图所示

在Library files 里面加入:

C:\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT\MSVC60

如下图所示

(3) 对该工程,进行以下设置

单击菜单Project ,出现如下菜单

单击Setting…菜单项,出现Project Setting 对话框,选择Link 标签,在Object/library modules: 下面的文本框内容的后面加入mclmcrrt.lib libsum_prod.lib ,如下图所示

6 、代码编辑及DLL 调用

(1) 将前面生成的四个文件:

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

复制到VC 工程所在目录。

(2) 在VC ++6.0 环境中,单击菜单Project ,选择Add to Project 菜单项,再单击Files…子菜单项,出现如下图对话框,

将libsum_prod.h 加入到当前工程中。

(3) 当用命令1 生成的DLL 函数时,在工程文件Test.cpp 中添加以下代码:#include "iostream.h" // 输入输出头文件

#include "mclmcr.h" // mxArray 类型声明

#include "libsum_prod.h" // DLL 头文件

void display(const mxArray* in, const char* name);

int main()

{

// 初始化程序

if( ! mclInitializeApplication(NULL,0) )

{

fprintf(stderr, "Could not initialize the application.\n");

exit(1);

}

// 初始化库

if (! libsum_prodInitialize() )

{

fprintf(stderr,"Could not initialize the library.\n");

exit(1);

}

// 声明DLL 函数输入输出mxArray 对象mxArray *X,*Y;

mxArray *SUM=NULL,*PROD=NULL;

// 给输入mxArray 对象分配内存

X = mxCreateDoubleMatrix(2,3,mxREAL);

Y = mxCreateDoubleMatrix(2,3,mxREAL);

double x[] = {1,2,3,4,5,6};

double y[] = {7,8,9,10,11,12};

// 给输入mxArray 对象赋值

memcpy(mxGetPr(X),x,6*sizeof(double));

memcpy(mxGetPr(Y),y,6*sizeof(double));

// 调用DLL 函数,注意输入与输出的接口是不同的mlfSum_prod(2,%26amp;SUM,%26amp;PROD,X,Y) ;

// 显示mxArray 对象

display(SUM,"SUM");

display(PROD,"PROD");

// 释放输入输出mxArray 对象所占用的内存

// 注意输出对象的内存是在调用DLL 函数过程中分配的mxDestroyArray(X);

mxDestroyArray(Y);

mxDestroyArray(SUM);

mxDestroyArray(PROD);

// 关闭库和程序

libsum_prodTerminate() ;

mclTerminateApplication() ;

return 0;

}

// 显示矩阵函数

void display(const mxArray* in, const char* name)

{

int i,j,r,c;

double *data;

data = mxGetPr(in);

r = mxGetM(in);

c = mxGetN(in);

printf("%s = \n",name);

for(i=0;i%26lt;r;i++)

{

printf("\t");

for(j=0;j%26lt;c;j++)

printf("% 4.2f \t",data[j*r+i]);

printf("\n");

}

printf("\n");

}

该C++ 程序运算结果如下图所示

(4) 当用命令2 生成的DLL 函数时,在工程文件Test.cpp 中添加以下代码:#include "iostream.h" // 输入输出头文件

#include "mclmcr.h" // mwArray 类型声明

#include "libsum_prod.h" // DLL 头文件

void display(const double* data, const int r, const int c, const char* name); int main()

{

// 初始化程序

if( ! mclInitializeApplication(NULL,0) )

{

fprintf(stderr, "Could not initialize the application.\n");

exit(1);

}

// 初始化库

if (! libsum_prodInitialize() )

{

fprintf(stderr,"Could not initialize the library.\n");

exit(1);

}

// 声明DLL 函数输入输出mwArray 对象

mwArray X(2,3,mxDOUBLE_CLASS);

mwArray Y(2,3,mxDOUBLE_CLASS);

mwArray SUM,PROD;

double x[] = {1,2,3,4,5,6};

double y[] = {7,8,9,10,11,12};

double *sum,*prod;

sum = new double[6];

prod = new double[6];

// 给输入mwArray 对象赋值

X.SetData(x,6);

Y.SetData(y,6);

// 调用DLL 函数

sum_prod(2,SUM,PROD,X,Y) ;

// 取出输出数据

SUM.GetData(sum,6);

PROD.GetData(prod,6);

// 显示mwArray 对象

// std::cout %26lt;%26lt; "SUM = " %26lt;%26lt; std::endl %26lt;%26lt; SUM %26lt;%26lt; std::endl;;

// std::cout %26lt;%26lt; "PROD = " %26lt;%26lt; std::endl %26lt;%26lt; PROD %26lt;%26lt; std::endl;;

display(sum,2,3,"SUM");

display(prod,2,3,"PROD");

delete sum;

delete prod;

// 关闭库和程序

libsum_prodTerminate() ;

mclTerminateApplication() ;

return 0;

}

// 显示矩阵函数

void display(const double* data, const int r, const int c, const char* name) {

int i,j;

printf("%s = \n",name);

for(i=0;i%26lt;r;i++)

{

printf("\t");

for(j=0;j%26lt;c;j++)

printf("% 4.2f \t",data[j*r+i]);

printf("\n");

}

printf("\n");

}

该C++ 程序运算结果如下图所示

特别说明:

在C\C++ 环境中二维数组是“行向量”,如果将下面定义的变量x 看成二维数组的话double x[] = {1,2,3,4,5,6};

那么x 应该是的矩阵,即

x = [1,2,3;

4,5,6];

但是,如果将数组首地址x 初始化mxArray 和mwArray 类时,数组x 在mxArray 和mwArray 类中是按“列向量”的形式排列的,即

X = [1,3,5;

2,4,6];

同理,这里

Y = [7,9,11;

8,10,12];

因此才能得到上图的结果

本文来自: 高校自动化网(https://www.360docs.net/doc/fd8469281.html,) 详细出处参考(转载请保留本链接):https://www.360docs.net/doc/fd8469281.html,/html/matlab/11363_4.html

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语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南 甄梓宁 znzhen@https://www.360docs.net/doc/fd8469281.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.360docs.net/doc/fd8469281.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函数(混合编程)

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

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" /*

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是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的混合编程。

手把手教你C_调用MATLAB函数

【转载】手把手教你用C#调用MATLAB函数 编译环境:Microsoft Visual Studio2008 版本9.0.21022.8RTM https://www.360docs.net/doc/fd8469281.html, Framework 版本 3.5 已安装的版本:Professional Microsoft Visual Basic200891986-031-5000002-60050 Microsoft Visual Basic2008 Microsoft Visual C#200891986-031-5000002-60050 Microsoft Visual C#2008 Microsoft Visual C++200891986-031-5000002-60050 Microsoft Visual C++2008 Microsoft Visual Studio2008Tools for Office91986-031-5000002-60050 Microsoft Visual Studio2008Tools for Office Microsoft Visual Web Developer200891986-031-5000002-60050 Microsoft Visual Web Developer2008 Crystal Reports AAJ6G-K0MSA4K-680002Z Crystal Reports Basic for Visual Studio2008 Matlab2008b 首先需要做的工作是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-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]None Compiler: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%选择n Please enter the location of your compiler:[C:\Program Files\Microsoft Visual Studio9.0] D:\Program Files\Microsoft Visual Studio9.0%选择您自己的当前安装路径

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在运行时无缝处理变量大小的动态变化。然而在嵌入式系统实际应用中,我们尽量避免动态内存分配,而是在使用之前给内存分配固定的大小和数据类型。 ?降低计算复杂性和内存占用空间,在把高层算法映射到有限内存和计算资源的硬件上,嵌入式软件设计者会耗费大量精力,同时要保证程序的有效运行。这是一个把设计算法转化成目标处理器中的指令集合和数据定义的过程。 ?支持定点在嵌入式软件或硬件上运行程序,需要整个算法全部严格定义成定点数据类型。

MATLAB到C的转换

第五部分:算法的C语言转化 算法优化 基于前面的算法处理 Matlab算法处理, 结果虽然准确,但不能智能实 现。故尝试将算法转成C语言 移植到硬件上去运行。 如右图所示的函数,是使用Script脚本创建的一个函数。将之前的复杂的算法反复对生成的语言进行了优化 复杂的算法反复对比生成的C语言进行了优化。 输入是X矩阵,用到C语言里可以用一个数组来实现。

Matlab 到C 的转化(1) M tl b 文件夹下的文件lt t t 文件是用来验证Matlab 源文件准备 Matlab 文件夹下的文件,result.txt 文件是用来验证,matlab 函数优化后的运算结果是否准确而设置的。

Matlab C的转化(2) 到的转化 输入mex -setup 输入y 选择1,因为keil可使用这种模式的c 确认

Matlab到C的转化(3) coder弹出如图的对话框,输入个工程名字,同在命令窗口输入“coder”弹出如图的对话框输入一个工程名字同时确认路径是否与源文件在同一文件夹下(尽是为了查看方便)。 然后在MATLAB的右侧显示matlab Coder C/C++窗口。

Matlab到C的转化(4) 在设置的工程下面添 加要转换的.m源文件

Matlab到C的转化(5) 对源文件的输入进行设置 。因为.m的源文件中X是 一个一维矩阵,但到C里 我将输入给函数进行FFT 运算的数组长度256,所以 我在此将其定死。 同时要注意MATLAB里默 认的是DOUBLE类型的数 据,关于DOUBLE型的数 据在STM32里运行是很困 难的,对此我把这里的数 据类型定义为single型, 生成C语言是float型的变 量。

MATLAB和C语言混合编程

MATLAB和C语言混合编程 1 、mcc4.0 编译环境设置 在桌面上右键单击“我的电脑”图标出现以下菜单 单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示 在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量matlab 值为C:\MATLAB7 即matlab7.0 的安装路径,如下图所示

在环境变量path 中加入C:\MATLAB7\bin\win32 ,如下图所示 按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置 Matlab7.0 编译器设置 (1) mex 命令设置

(a) 运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器; (b) 命令窗口出现如下提示: Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers [y]/n? 此时键入”y”,按回车; (c) 命令窗口出现如下提示: 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 version 6.0 in C:\Program Files\Microsoft Visual Studio [2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc [3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio [0] None 此时键入”3”,按回车;选择Microsoft Visual C++6.0 的编译器 (d) 命令窗口出现如下提示: Please verify your choices: Compiler: Microsoft Visual C/C++ 6.0 Location: C:\Program Files\Microsoft Visual Studio Are these correct?([y]/n): 此时键入”y”,按回车;确认选择Microsoft Visual C++6.0 的编译器 (2) mbuild 命令设置 (a) 运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命

相关主题
相关文档
最新文档