MATLAB调用C++DLL
MATLAB调用C程序、调试和LDPC译码过程详解
MATLAB调用C程序、调试和LDPC译码过程详解MATLAB是一个很好用的工具。
利用MATLAB脚本进行科学计算也特别方便快捷。
但是代码存在较多循环时,MATLAB运行速度极慢。
如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行,可以考虑将循环较多的功能采用C编写,MATLAB调用。
本文将概述这一过程。
虽然本文以LDPC译码算法为例,但不懂该算法不影响本文阅读。
1. 起因最开始用MATLAB写的LDPC译码算法中,其中一个版本是这里,里面有三重循环,运行速度极慢。
后来考虑了MATLAB的向量化操作,通过算法的合理划分以及内置函数调用,成功将三重循环修改为1层,具体这一版本的代码可见这里。
通过这一手段,函数的运行速度提高了几倍乃至几十倍。
虽然这一方法下运行速度依旧比不过MATLAB工具箱中的comm.LDPCDecoder,远比不上利用GPU的comm.gpu.LDPCDecoder,但胜在可明确算法并具有一定扩展性。
起初也注意到可以通过MATLAB调用C程序来加速程序运行,但向量化后的代码凑活能用,加上有时也可调用更为强大的内置函数,这一想法一直没有付诸实践。
这几天想好好整理一下代码,遂萌发了写一个C版本译码算法的想法。
代码现在的状态是“能用”,这里把相关经验总结分析在此。
2. MATLAB调用C程序这一部分的内容在刘晓辉的matlab调用C程序中已经有较为详细的介绍了,想要正确调用C程序,关键概括为2点。
机器上装有MATLAB编译器,可通过在MATLAB命令行窗口输入mex -setup进行具体设置。
有一个正确的接口子程序mexFunction完成MATLAB和C程序之间的数据转换和程序调用这里给出我写得mexFunction(注意这个代码写得不好,没有任何判断,没有健壮性……)void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){ double* llr = (double*)mxGetPr(prhs[0]);int* rownum = mxGetPr(prhs[1]);int* colnum = mxGetPr(prhs[2]);int* trans = mxGetPr(prhs[3]);double* state = mxGetPr(prhs[4]);plhs[0]= mxCreateDoubleMatrix(1,state[1],mxREAL);double* r =mxGetPr(plhs[0]);ldpcDec(r ,llr,rownum,colnum,trans,state);}mexFunction的规范在刘晓辉的matlab调用C程序一文中已有提及,即nlhs:输出参数数目plhs:指向输出参数的指针nrhs:输入参数数目prhs:指向输入参数的指针例如,在matlab命令行中使用[a,b]=test(c,d,e)调用mex函数test时,传给test的这四个参数分别是2,plhs,3,prhs其中:prhs[0]=cprhs[1]=dprhs[2]=e由此可以解释上述mexFunction,而命令plhs[0]= mxCreateDoubleMatrix(1,state[1],mxREAL)则定义了一大小为1 ×state[1]的矩阵,做为函数的返回值。
MATLAB编译并调用C、C++程序
会在 test.cpp 的旁边生成 test.mexw32 文件,这个文件可以供 MATLAB
调用实现 test.cpp 中的 C、C++函数的功能。
在 MATLAB 中调用 C、C++程序:
将 MATLAB 的工作目录切换至上面已编译好的 test.mexw32 所在的目
}
dbX = mxGetScalar( prhs[ 0 ] ); dbY = mxGetScalar( prhs[ 1 ] );
/* Create matrix for the return argument. */ plhs[0] = mxCreateDoubleMatrix( mrows, ncols, mxREAL ); plhs[1] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );
mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if ( mxIsComplex(prhs[0]) ||
!(mrows == 1 && ncols == 1)) {
mexErrMsgTxt("The First input must be a noncomplex scalar double precision.");
/* Assign pointers to each input and output. */ pdbA = mxGetPr( plhs[0] ); pdbG = mxGetPr( plhs[1] );
Desc2Pol( dbX, dbY, pdbA, pdbG ); }
Matlab函数制作Dll后C二次开发封装DLL(VS2013)
Matlab函数制作Dll后C⼆次开发封装DLL(VS2013)前⾔:Matlab算法丰富,直接可以拿来使⽤,但是⼜不熟悉m语⾔或者要求效率⾼的代码,内部函数封装Dll后C⼆次处理封装dll⼀、Matlab⽣成DLL备注:配置环境变量(很重要,否则编译会出现“找不到libmx.dll⽂件”):D:\Install\MatLab\bin\win64;(路径参考,实际安装位置,默认软件⾃动设置环境变量)在matlab命令⾏输⼊mex -setup,按提⽰选择合适的选项。
在matlab命令⾏输⼊mbuild -setup,按提⽰选择合适的选项。
以上配置只需进⾏⼀次就可以了,不必每写⼀个程序都重复⼀遍。
1、命令⾏输⼊deploytool可弹出对话框,选择“Library Complier”2、“TYPE”选择制作的库(C++ Shared Library),“EXPORTED FUNCTIONS”中选择需要转化成动态链接库的Matlab.m⽂件,添加完成后在Library Name编辑框中输⼊你想给Dll⽂件命名的名称。
然后点击下⾯Package即可完成转化。
注:⽣成的dll拷贝到另⼀台电脑需要对应版本的MATLAB Runtime组件(MCR)。
⼆、VS2013 C⼆次封装DLL1、点击“新建项⽬”创建“Win32控制台应⽤程序”2、选择DLL,空项⽬3、点击源⽂件,创建⼀个main.c⽂件4、点击⼯程属性页,“配置管理器”可创建64位平台DLL(根据需要)。
5、配置VS2013属性表(Matlab库依赖,调⽤matlab引擎)项⽬属性 - 配置属性 - VC++⽬录 -包含⽬录:D:\Install\MatLab\extern\include;(路径参考)库⽬录:D:\Install\MatLab\extern\lib\win64\microsoft;(路径参考)项⽬属性 - 配置属性 -链接器 - 输⼊ - 附加依赖项:libmx.lib;libmat.lib;libeng.lib;mclmcr.lib;mclmcrrt.lib;libmex.lib或者也可通过#pragma comment( lib, "mclmcrrt.lib" )指令在C⽂件中附加依赖项。
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语言程序代码
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函数是一样的了。
(完整版)matlab和c++调用DLL方法
(完整版)matlab和c++调用DLL方法Matlab和C++调用DLL方法Matlab可以调用外部DLL,如用C或C++写的DLL。
本文分三个部分介绍Matlab和C++调用DLL方法。
一、C++写dll方法二、C++调用dll三、Matlab调用dll一、C++写DLL方法在CPP文件中和普通CPP没什么区别,在H文件中加上需要导出的函数名,格式如下:extern "C" int __declspec(dllexport)add(int x, int y);蓝色部分是函数返回的类型,红色部分是要导出的函数,就这么简单。
下面是两个整数相加的代码:main.h:extern "C" int __declspec(dllexport)add(int x, int y);main.cpp:#include "main.h"int add(int x, int y){return x + y;}编译即可得到dll文件,我的工程名叫mydll,因此得到的是mydll.dll二、C++调用DLL方法将DLL文件拷入到源文件夹中,在CPP代码中引入windows.h 文件,否则有些方法找不到,用指针来接受参数。
装载DLL,用函数名,卸载DLL。
代码如下:#include#includeusing namespace std;int main(void){typedef double(*padd)(double a,double b);double r;HINSTANCE hDLL;padd add;hDLL=LoadLibrary("mydll.dll");add=(padd)GetProcAddress(hDLL,"add");r=add(5.3,8.6);cout<<r<<endl;< bdsfid="98" p=""></r<<endl;<>FreeLibrary(hDLL);return 0;}三、Matlab调用DLL通常matlab调用DLL有两种方法,一种是用mex文件,另一种是用matlab的函数。
Matlab调用VC生成的dll的具体步骤
Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)1创建项目: Win32->Win32项目,名称:MyDLL2新建头文件testdll.h,并编写相关程序注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。
具体程序如下#ifndef MATLABDLLTEST_H#define MATLABDLLTEST_H#ifdef __cplusplusextern "C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3新建源文件testdll.cpp,并编写相关程序具体程序如下所示:#include "stdafx.h"#include "testdll.h"double add(double x, double y){return (x+y);}4新建模块定义文件mydll.def,并编写相关程序二、Matlab调用生成的dll1、编译器准备1)在Matlab的命令窗口输入:mex -setup2)选择你的编译器,我的是:[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.02、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数具体程序clc;clear all;close all;addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件libfunctionsview lib %执行此命令后会生成如下窗口calllib('lib', 'add', 1.0,2.0)%只有出现上述窗口才能使用此命令参考链接:1、/s/blog_70b3b3a701015e98.html(此文忘记加模块定义文件mydll.def,而且在Matlab读取路径是的指令也是错误的,参考本文的指令就能跑通)2、/g710710/article/details/7255744(此链接的文章是VS生成dll的方法,但如果想用Matlab调用生成的dll在编写头文件时一定要用上文的编写指令,而不这篇链接里的指令,因为链接里的指令是生成C++的指令,而Matlab只识别C的写法)。
MATLAB Compiler 是MATLAB自带的一个编译器
MATLAB Compiler是MATLAB自带的一个编译器,它能将m文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。
MATLAB 6.5使用的编译器包括了MATLAB的C\C++数学库函数以及图形库。
动态链接库(dll)是编写软件中常用的一种技术,MATLAB 提供了将M文件编制成dll文件的方法,本文就介绍如何在MATLAB6.5中将m 文件z转化成dll文件,然后在VC中调用该dll文件。
1、必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需、要使用mex-setup和mbuild-setup两个命令对编译器进行配置,如果以前已经进行了配置就不需要这一步。
2、设置头文件和库文件的路径,可以参考精通VC与MATLAB联合编程<六>,配置完成如图1和图2:图1图2读者根据MATLAB安装实际情况输入头文件和库文件的路径。
3、在MATLAB打开文本编辑器(File->New->M-file)写一个简单的m函数:function y=huatu_test()x=-10:0.1:10;y=sin(x);plot(x,y,'*')文件保存为huatu_test.m。
4、在MATLAB命令窗口用如下命令生成dll文件和调用dll所需要的文件:mcc-t-W libhg:dlltest-T link:lib-h libmmfile.mlib huatu_test.m生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录\work,找到dlltest.h、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。
5、在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为"测试"的button按钮。
将dlltest.h、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project->Add To Project->Files选择拷贝到当前目录下的三个文件,将文件引入工程。
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。
3、使用MatlabSimulink模型编译成c++文件。
4、VC2010集成MatlabSimulink生成的c++代码,验证在VC2010环境下能正常运行。
5、VC2010将生成的程序编译成.dll文件,以便于VB调用6、使用步骤1,2验证MatlabSimulink生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。
在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口1.2开始创建DLL第一步:在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。
max.h头文件中的代码为:1. #ifndef _MAX_H2. #define _MAX_H_3. __declspec(dllexport) int __stdcall fmax(int a,int b);4. #endif代码说明:__declspec(dllexport) 的作用是指定导出该函数为DLL函数;__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。
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) 区间均匀分布的随机数。
如何在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文件。
c++调用matlab函数
一、问题描述有关在C++程序中使用MATLAB编译产生的动态链接库DLL,看了好多帖子,感觉描述的不尽详细,调试过程费了好多劲,现在用文字和图片的形式记录一下自己学习的过程。
MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。
这里以调用C++接口的DLL中的函数为例来介绍。
在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。
所以问题归结为如何在C++程序中使用mwArray。
在这个例子中,输入输出都是矩阵,至于标量,可以作为矩阵的一行或一列传递。
二、实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。
为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。
三、实现环境:Windows xp 2002 sp3Matlab 2008b 安装路径:D:\Program Files\MATLAB\R2008bVs 2008 sp1 安装路径:D:\Program Files\Microsoft Visual Studio 9.0四、配置matlab生成dll文件:1.在matlab 中选择C++编译器>> mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?nSelect 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] NoneCompiler: 6The 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? nPlease enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0Please verify your choices:Compiler: Microsoft Visual C++ 2008Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? Y******************************************************************* *********Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.******************************************************************* *********Trying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone . . .>>2.编写m文件编写myadd2.m文件(如下),保存在D:\My Documents\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~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=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文件。
C#调用MATLAB生成的dll
C#调用Matlab生成的dll1.1操作环境操作系统●Win7(32位)必需软件:●Matlab R2015a●Visual Studio2012(包含Visual C#和Visual C++)●Net Framework4.0以上1.2操作步骤首先Matlab的打包工具,把Matlab函数打包为dll文件。
然后在C#中,引用生成的dll 文件,并在程序中调用dll中的函数。
下面分步骤介绍:1.2.1路径设定在F盘新建一个名为Matlab的文件夹;启动Matlab.exe,在命令窗口输入pathtool,会弹出如下对话框。
点击【Add Folder】,选择刚才的文件夹即可。
关闭对话框后,在命令窗口输入userpath(‘F:\Matlab’)。
按回车设定完毕。
1.2.2M文件创建在Matlab中新建一个M文件,写入如下函数代码,保存为F:\Matlab\gougu.m。
function w=gougu(a,b)w=a*a+b*bend1.2.3打包生成dll在Matlab命令窗口输入deploytool,弹出如下选项,选择“Library Compiler”出现打包程序窗口界面:在窗口中进行如下选择:Type:.Net AssemblyExplored Functions:选择刚才做好的gougu.m文件Packaging Options:勾选上面的复选框,取消勾选下面的复选框。
填写Library Information各项最后,点击窗口右上角的Package按钮,一直等待到提示打包完成。
打包结束后,会在文件夹中看到生成了的dll文件,路径为“F:\Matlab\gougu\for_redistribution_files_only\gougu.dll”。
1.2.4C#调用dll在Visual Studio2012中,新建一个C#控制台程序或者WinForm应用程序,本例创建的是窗体应用程序,在默认窗体上放入一个标准按钮button1。
Matlab环境下调用通用DLL的方法及应用
Matlab环境下调用通用DLL的方法及应用
胡进;姚纯;苏敏
【期刊名称】《计算机应用与软件》
【年(卷),期】2007(24)10
【摘要】介绍了一种在Matlab运行环境下直接调用通用DLL的方法.首先阐述了具体实现步骤,然后指出其适用场合,并给出了开发实例--针对开放式数控系统的加工监视软件开发.最后,总结了该方法与其它混合编程方法相比的优缺点.
【总页数】3页(P145-146,180)
【作者】胡进;姚纯;苏敏
【作者单位】苏州大学机电工程学院,江苏,苏州,215006;苏州大学机电工程学院,江苏,苏州,215006;苏州大学机电工程学院,江苏,苏州,215006
【正文语种】中文
【中图分类】TP3
【相关文献】
1.MatLab环境下调用HTK的连续语音识别方法 [J], 李理;王冬霞
2.在MATLAB环境中调用DLL对硬件资源访问的方法 [J], 饶和昌;赵英俊
3.B/S结构下DLL调用的分析与应用 [J], 张嘉惠;崔超艳
4.DLL在Visual Basic程序调用MATLAB库函数中的应用 [J], 李小文;屠宇;梁慧冰
5.在VB开发环境中调用由MATLAB函数转化的DLL [J], 冯旭
因版权原因,仅展示原文概要,查看原文内容请购买。
matlab与C混合编程步骤详解
1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。
Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。
必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。
步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。
1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。
1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。
CC++下调用matlab函数操作说明
CC++下调⽤matlab函数操作说明1.matlab的安装连接:/s/1qXuF7aO安装32位版本的matlab(在⽬录下bin⽂件夹中有两个⽂件夹,选择win32⽂件夹下的setup进⾏安装)2.matlab mex编译器配置安装完matlab之后,需要设定对应的c++编译器才能编译.m⽂件⽣成可供c++调⽤的库⽂件。
打开matlab,在命令⾏输⼊:mex -setup,选择已安装的vc编译器我的matlab版本是R2010b,选择的是[2] Microsoft Visual C++ 2008 Express,然后⼀直选择y直到看到Done然后继续在命令⾏中输⼊:mbuild -setup ,按照上述类似的⽅式设置编译器假设存在⼀个Add.m的⽂件需要编译成库⽂件,Add.m⽂件function C=Add(A,B)C=A+B;end使⽤命令编译:mcc -W cpplib:libAdd -T link:lib Add.m成功编译会在Add.m的路径下⽣成⼀些⽂件:如果出现错误,可能是编译器配置错误,依次输⼊⼀下两⾏命令查看配置⽂件:>> cd(prefdir)>> edit compopts.batset VSINSTALLDIR= 这⾥如果是空值,需要将电脑中安装的VC路径写到这⾥3.创建c++程序调⽤matlab函数将前⾯⽣成的libAdd.dll"、"libAdd.h"和"libAdd.lib"三个⽂件拷贝到新建的vc⼯程中,并配置⼯程属性,添加matlab安装⽬录下extern中include⽂件夹,我的是D:\matlab\extern\include然后配置库⽬录:添加D:\matlab\extern\lib\win32\microsoft这⾥需要注意的是,该路径下有" mclmcrrt.lib"⽂件,是我们需要的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB调用C++动态库的方法
声明:本人知识水平有限,文档中难免有错,望谅解!
一、方法步骤
1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库
(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。
2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),
其实,这个文件起转换作用。
也就是说,你用MATLAB调用C++动态库就必须通过
这个文件去调用,而这个文件就是由.cpp文件生成的。
这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:输出参数个数
plhs:输出参数列表
nrhs:输入参数个数
prhs:输入参数列表
不过函数名可以随便取的。
在这个函数中你就可以去调用C++动态库的函数了。
记住头文件:”mex.h”……
注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。
3、使用mex命令编译XXX.cpp。
如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64
文件。
这个文件的文件名就将是你要调用的函数名;
4、现在就可以写脚本调用这个函数了。
二、案例
1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数
double Demo_Add( double x, double y); //功能:将两个数相加并返回
这些大家都知道,不用我说了吧。
2、在MATLAB中写一个c++文件Test.cpp:
#include "mex.h"
#include "Demo.h"
#pragma comment(lib,"Demo.lib")
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
if( nrhs != 2) //判断输入参数的个数
{
mexErrMsgTxt("输入参数个数不对!");
}
//得到传入的第一个参数,并转换了double类型
double p1 = *((double*)mxGetPr(prhs[0]));
//得到传入的第二个参数,并转换了double类型
double p2 = *((double*)mxGetPr(prhs[1]));
//创建一个1*1的实时double类型的矩阵
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
//得到输出的第一个参数的指针
double *output = (double*)mxGetPr(plhs[0]);
//调用Demo.dll定义的函数实现功能,并将返回值给输出参数
*output = DEMO_Add(p1, p2);
}
3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32
或者Test.mexw64.
5、那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.
我现在就写一个脚本文件First.m:
clc
clear
tic
x = 1.6;
y = 2.7;
Test_add = Test(x, y)
toc
6、run这个脚本.MATLAB调用C++动态库就成功了….
Author : Li Jun
Date :2012-03-26。