Matlab调用DLL以及matlab指针参数传递
- 格式:doc
- 大小:28.50 KB
- 文档页数:4
MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。
3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。
4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件5、使用步骤1,2验证MATLAB生成的代码二、具体实施过程描述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++调用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调用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参数传递(最新版)目录1.MATLAB 参数传递的概述2.MATLAB 参数传递的方式3.使用 MATLAB 参数传递的注意事项正文一、MATLAB 参数传递的概述MATLAB 是一种广泛应用于科学计算、数据分析、可视化等领域的编程语言。
在 MATLAB 中,函数之间通过参数传递数据,实现函数的功能。
参数传递是函数之间数据交流的一种方式,通过参数传递,我们可以实现函数的复杂功能,提高代码的复用性和可读性。
二、MATLAB 参数传递的方式MATLAB 参数传递的方式主要有以下两种:1.值传递值传递是 MATLAB 中最常用的参数传递方式。
当一个函数调用另一个函数时,会将实参的值传递给形参。
在值传递过程中,实参和形参是两个独立的变量,它们之间并不存在直接的联系。
因此,当函数执行完毕后,实参的值并不会发生改变。
2.引用传递引用传递是 MATLAB 中另一种参数传递方式。
当一个函数调用另一个函数时,会将实参的地址传递给形参。
在引用传递过程中,实参和形参共享同一个内存空间,因此,当函数执行完毕后,实参的值会发生改变。
三、使用 MATLAB 参数传递的注意事项在使用 MATLAB 参数传递时,需要注意以下几点:1.确定参数传递方式在使用参数传递时,需要根据实际需求确定使用值传递还是引用传递。
对于不需要修改实参值的情况,可以使用值传递;对于需要修改实参值的情况,可以使用引用传递。
2.避免参数名重复在编写函数时,应确保不同函数的参数名不同,避免出现参数名重复的情况。
如果出现参数名重复,可能导致函数调用失败。
3.注意参数的顺序在调用函数时,应确保参数的顺序与函数定义时的顺序一致。
如果参数顺序不一致,可能导致函数调用失败。
综上所述,MATLAB 参数传递是函数之间数据交流的一种方式,通过参数传递,我们可以实现函数的复杂功能,提高代码的复用性和可读性。
作者曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用。
以前做过matlab7与c++的混合编程:将matlab函数编译成dll给C++调用,从而加快开发的进度。
但是今天在matlab2008b下面又做了一遍,发现matlab又改了很多东西,诸如增加了面向对象的的扩展mwArray,于是做笔记如下。
(一)总体概念matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。
matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。
步骤如下:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll下面以一个很简单的加法函数为例,说明在VC6和matlab2008b下,怎么做混合编程(二)设置matlab编译器过程如下:1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。
2. 选择编译器,这里选择2,即VC63.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同样选择VC6(三)编译m文件首先,写出matlab函数,一个很简单的加法函数,如下:function [c] = MyAdd(a, b);c = a + b;保存为MyAdd.m然后,进行编译,命令如下:mcc -W cpplib:libMyAdd -T link:lib MyAdd其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。
VC++通过matlab生成的dll来调用matlab函数一matlab生成dll众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。
还好MathWorks已经为我们想到了,基本上现在市面上主流的Matlab版本都可以支持VC和Matlab的混合编程。
但是目前网上资料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的实现方法有所不同,因此笔者通过不断的尝试和研究,终于调试通了基于VS2008和Matlab R2011b的混合编程。
1 编写.m函数为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。
先在Matlab里面写一个M文件,代码如下:function b = MyFunc(a)b = a.*a;将M文件保存为MyFunc.m,保存在F:/test文件夹中。
然后在Matlab主窗口中将当前文件夹改为F:/test:cd F:/test;2 设置Matlab编译库为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mbuild –setup(注意‘–’前面是有空格的)然后出现Please choose your compiler for buildingstandalone MATLAB applications:Would you like mbuild to locate installedcompilers [y]/n?键入y后回车,出现Select a compiler:[1] Lcc-win32 C 2.4.1 inD:\PROGRA~1\MATLAB\R2010b\sys\lcc[2] Microsoft Visual C++ 2008 SP1 inD:\Program Files\Microsoft Visual Studio 9.0[0] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft VisualStudio 9.0Are these correct [y]/n?确定,键入y后回车,出现******************************************************************* *********Warning: Applications/components generated using Microsoft VisualStudio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used fordeployment.To redistribute your applications/components, be sure that thedeployment machine has these run-timelibraries.******************************************************************* *********Trying to update options file: C:\Users\张智宇\AppData\Roaming\MathWorks\MATLAB\R2010b\compopts.batFromtemplate: D:\PROGRA~1\MATLAB\R2010b\bin\win32\ mbuildopts\msvc90compp.batDone . . .如果出现以上说明,则证明Matlab编译器设置成功了。
Matlab中如何将(自定义)函数作为参数传递给另一个函数Matlab中如何将(自定义)函数作为参数传递给另一个函数假如我们编写了一个积分通用程序,想使它更具有通用性,那么可以把被积函数也作为一个参数。
在c/c++中,可以使用函数指针来实现上边的功能,在matlab中如何实现呢?使用函数句柄——这时类似于函数指针的一项功能。
假如我们现在已经编写了一个辛普森方法积分的函数如下,我们要把函数作为参数传给它(当然啦,matlab早已经提供给我们非常牛x 的积分函数了,这里只是个例子而已):function g=myintegrate(f,N,a,b)%integration using simpson methodn=N/2;h=(b-a)/N;x=a:h:b;fv=f(x);s=sum(fv(1:2:2*n-1))*4;s=s+sum(fv(2:2:2*n))*2;s=s+f(a)+f(b);s=s*h/3;g=s;现在要做的工作就是如何把上面的f函数换成我们想要的随便什么函数。
定义函数句柄:handle=@ functionname之后就可以把handle作为参数传递给上面的函数(或者其他需要使用函数作为参数的函数)了。
例如在0~pi/2上对sin(x)进行积分,可以如下输入:>>fh=@sin;>>myintegrate(fh,100,0,pi)ans =0.9947函数句柄可以指定为任意的matlab函数——当然也包括我们自定义的函数,比如我们在myfun.m文件中定义了如下函数:function f=myfun(x)f=x;那么,>>fh2=@myfun;>>myintegrate(fh2,100,0,1)ans =0.4967。
Matlab 调用Fortran Dll数组传递范例
1、Fortran代码
test.f90
SUBROUTINE add(outdata,indata)
!DEC$ ATTRIBUTES C,DLLEXPORT :: add
!伪注释说明test.dll文件中包含一个名为add的子例行程序,C即为按C 调用约定输出
IMPLICIT NONE
REAL outdata(2),indata(3)
outdata(1)=indata(1)-indata(3)
outdata(2)=indata(2)+indata(3)
ENDSUBROUTINE
2、.h代码
test.h
void add(float*, float*);
//该代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test_c.h。
其实,每一个dll文件可包含多个子例行程序,那么在书写头文件代码时,就需要对应书写多个void代码。
3、Matlab代码
test.m
clc; clear all;
loadlibrary('test.dll','test.h');
x=[0,0];indata=[1,2,3];
outdata=calllib('test', 'add', x,indata);
%调用test.dll文件里的add子例行程序
%x虽然对应Fortran里的输出(指针),但它并不返回值
%outdata才是返回的值,输出在输入前面(如果仅输出一个数组的话)unloadlibrary test。
软件英才网软件行业驰名招聘网站Vc调用matlab导出的dll,实现vc与matlab混合编程Vc调用matlab导出的dll,实现vc与matlab混合编程写这篇博客的目的就是想把前段时间的工作交接下,让后来人接手这个项目的人迅速的入门。
文章虽短,在项目初期可是搜刮了很多资料花了不少的时间。
为了与win7兼容,matlab应该安装2010a或2010b。
Matlab7导出的dll在win7下的vc2010中不兼容。
1:首先为matlab选择编译器在命名行窗口输入:mex -setup 按照提示选择vc2010 2:选择builder输入:mbuilder -setup 同样选择vc20103:将使用matlab写成的代码封装成函数,确认无错后开始生成dll。
在命令行输入:mcc -W cpplib:h_single -T link:lib h_single.m其中h_single是要导出的dll名称,h_single.m是matlab源文件。
不同版本的matlab生成dll的时间不一样,不知道我使用的matlab2012a为什么这么慢。
如果一切顺利,那么在.m文件目录下将会产生.lib,.dll,.h,.cpp,.ctf(matlab2010好像不再生成.ctf文件)等几个文件。
我们需要使用.lib,dll,.h文件。
dll生成后,剩下的就是在vc中调用了。
这跟使用其他dll是一软件英才网软件行业驰名招聘网站样的。
首先要包含dll头文件,除了要将本次生成的.lib文件填入:链接器-》输入内。
还需要加入mclmcr.lib 和mclmcrrt.lib。
最后将dll 文件放在可执行文件目录下。
matlab2010好像不再生成.ctf文件,因此不需要将ctf文件放在当前目录下,而在matlab7中却需要。
这些都只是准备工作,包含了头文件才能在vc内使用。
传入matlab函数的数据是有一定格式的。
因此需要将数据准备下,准备好之后传给matlab计算函数。
Matlab调用DLL
本来想把算法写成一个DLL的形式,这样既可以在控制软件中方便调用,又可以在Matlab中通过调用外部DLL的形式对算法进行仿真分析,所以需要了解Matlab调用外部DLL的方法,但是后来发现Matlab调用DLL只支持用C语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。
这里把Matlab调用DLL 的过程记录一下吧,以后有用到的时候再说。
在Matlab的Help中搜索"Calling Functions in Shared Libraries"即可看到关于此内容的帮助文档。
下面以一个简单的小例子演示Matlab调用DLL的过程:
1、编译器准备
在Matlab的命令窗口输入:mex -setup
选择你的编译器,我的是:
[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0
2、编写你自己的DLL
在Visual Studio 2008中新建一个Win32的Dll工程,不妨设名字为MatlabDllTest,编辑MatlabDllTest.cpp:
#include "MatlabDllTest.h"
double add(double x, double y)
{
return (x+y);
}
编辑MatlabDllTest.h:
#ifndef MATLABDLLTEST_H
#define MATLABDLLTEST_H
#ifdef __cplusplus
extern"C"
{
#endif
__declspec(dllexport) double add(double x, double y);
#ifdef __cplusplus
}
#endif
#endif
3、加载DLL:把编译连接之后产生的MatlabDllTest.dll和MatlabDllTest.h 文件拷贝到Matlab的当前工作目录下,输入
loadlibrary('MatlabDllTest','MatlabDllTest.h');
(一定要有这步,如果dll不成功,会显示错误原因)
4、查看DLL中导出的函数
libfunctions MatlabDllTest -full
-full选项会列出导出函数的详细输入和输出参数,这是输出信息如下:Functions in library MatlabDllTest:
double add(double, double)
5、调用函数
calllib('MatlabDllTest', 'add', 1.3, 4.6)
此时就会输出正确的结果
ans =
5.9000
总结:这个例子比较简单,只是为了演示整个过程,如果你是真的用到了Matlab来调用外部DLL的这种方式的话,就要注意你的DLL工程要符合Matlab 的要求啦,详细信息请自己查看Matlab的帮助文件,我就不罗嗦了。
Matlab与指针
指针是一种比较难以驾驭的工具。
像是老郭这样的编程菜鸟使用指针,稍有不慎轻则内存泄漏,重则直接蓝屏,真是杯具。
还好老郭喜欢的Java
语言一开始就杜绝了指针的使用。
Matlab也杜绝了指针,所以大家在网上只能搜到零零星星的介绍。
有一些万不得已非要使用指针的情况,譬如变长数组:老郭有100个矩阵,要分别求他们的奇异值分解,但是这100个矩阵大小不一样,怎么样编写循环呢?这就要用指针了。
注意matlab拒绝将指针跟双精度数字混为一谈,所以如果用a来存储这100个矩阵,就要事先清空a,命令是
clear a
接下来,写循环命令储存矩阵:
a(i)=libpointer('doublePtrPtr',rand(6));
循环的那些for神马的,此处略去。
这里'doublePtrPtr'是数据格式,double就是double,一维数组用doublePtr,三维用doublePtrPtrPtr,以此类推。
rand(6)是矩阵,下一个循环单位可以写rand(4)都可以。
这是储存的步骤,读取的步骤是:
get(a(2),'Value')
就返回我们刚才存进去的第2个矩阵。
'Value'是浮云,放在那里,不解释。
值得注意的是Matlab的这个机制本来是设计用于跟C等等语言做交互的。
我们这里滥用一下。
如果您想了解更多,查阅Matlab手册就行。