Matlab调用DLL以及matlab指针参数传递

合集下载

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

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和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调用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参数传递

matlab参数传递

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调用

将matlab函数编译成dll供Cpp调用

作者曾经实现过将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函数的名字。

C通过matlab生成的dll来链接matlab的具体步骤

C通过matlab生成的dll来链接matlab的具体步骤

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中如何将(自定义)函数作为参数传递给另一个函数

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环境下调用通用DLL的方法及应用

Matlab环境下调用通用DLL的方法及应用

2 相关函数介绍
在 M 代码中调用 DLL 主要通过新增的 8 个功能函数 ,下面
146
计算机应用与软件
2007 年
可交由 M atlab自动完成 。也即 ,可以按 M atlab 习惯方式定义变 量、 赋值 ,然后直接传递给库函数 。注 : 表 1 和表 2 中的 [ size ]代 表数据位数 ,如 8、 16 和 32。 但是对于高级数据类型 , 建议采用类型匹配函数将 M atlab 变量转换为与 C数据类型匹配的变量 ,然后再传递给 DLL 中的 库函数 。被库函数多次使用的变量更应如此 , 否则 M atlab 将多 次对其进行不必要的类型转换 ,耗费额外的内存空间和时间 。
stop ( Tim er_1) ;
); set( fig , ′ deletefcn ′ ,″
calllib ( ′ pm ′ ,′ ClosePmacDevice′ , Crd) ;
); unloadlibrary( ′ pm ′ end;
calllib ( ′ pm ′ ,′ PmacDPRRealTim eEx′ , Crd, 5, 0, OFF) ;
第 24 卷第 10 期 2007 年 10 月
计算机应用与软件 Computer App lications and Softw are
Vol124 No. 10 Oct . 2007
M a tlab环境下调用通用 DLL 的方法及应用
胡 进 姚 纯 苏 敏
(苏州大学机电工程学院 江苏 苏州 215006)
case ′ close′ ,
% 退出 % 停止定时器 % 改退出函数为空 ,避免死循环 % 关闭“ 实时更新 ”
可在 M 代码对其作如下调用 :

Matlab 调用Fortran Dll数组传递范例

Matlab 调用Fortran Dll数组传递范例

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

软件英才网软件行业驰名招聘网站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---函数结构与参数传递

MATLAB---函数结构与参数传递

关于nargin,nargout,varargin,varargout
nargin:输入参数的个数,主要用于两个方面:①判断输入参数的个数,如果输入参数个数不对,可以警告或其他处理;②根据参数个数的不同可以做不同的处理。如:
if nargin == 0
error;
elseif nargin == 1
cwit:
关于function_handle
function_handle在matlab环境下还是可以用的,但是不能支持编译,也就是说无法脱离matlab环境安全运行。在构建程序时,一定要考虑到扩展性,有些在某些条件下属于技术缺陷的方法,尽量不要用
====================================================================
cwit:
R14的Compiler 4,应该不叫编译吧。所以fcuntion_handle,eval这些问题不存在。
所以R14的路应该是另外一条道路,前面没有声明,我的理解主要是基于Matlab 6.1,这个版本的compiler比较好用。
if programmestarted==0
k=@aa;
save subfunction k
return
end
不过这样又增加了不少无谓的代码。
=======================================================================
function test_Uicontrol_Callback( h ) ;
handles = guidata( h ) ;
........................................

matlab参数传递

matlab参数传递

matlab参数传递在MATLAB中,参数传递主要有两种方式:通过函数输入输出变量(input-output)和全局变量(global)。

通过函数输入输出变量这是最常用的一种参数传递方式。

在MATLAB中,函数可以接收输入参数(input arguments),然后生成输出参数(output arguments)。

这些参数需要在函数声明和定义中进行明确。

例如:matlabfunction [y] = myFunction(x)y = x^2; % 计算x的平方end在这个例子中,x是输入参数,y是输出参数。

调用这个函数时,需要将参数传递给x:matlabresult = myFunction(5); % result将被赋值为25 全局变量全局变量可以在MATLAB的任何地方访问,包括函数和脚本。

要使一个变量成为全局变量,你需要在函数或脚本的开始处使用global关键字声明它。

例如:matlabglobal x;function y = myFunction()x = 5; % 修改全局变量x的值y = x^2; % 计算x的平方end在这个例子中,x是一个全局变量,可以在任何函数或脚本中访问和修改。

注意,使用全局变量可以简化代码,但也可能导致代码更难理解和维护。

因此,通常只在确实需要时才使用全局变量。

以下是两个MATLAB中参数传递的例子:例子1:传递数组假设我们有一个数组A,我们想通过函数来修改这个数组。

我们可以将这个数组作为输入参数传递给函数: matlabA = [1, 2, 3]; % 定义一个数组Afunction modifyArray(inputArray)inputArray(2) = 0; % 将数组的第二个元素设置为0endmodifyArray(A); % 调用函数,修改数组A在这个例子中,我们将数组A作为输入参数传递给modifyArray函数,然后函数修改了数组的第二个元素。

Matlab环境下调用通用DLL的方法及应用

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调用DLL以及matlab指针参数传递

Matlab调用DLL以及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.02、编写你自己的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 __cplusplusextern"C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3、加载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平台下调用EPANET的DLL

如何在MATLAB平台下调用EPANET的DLL

以下是代码,但注意INP未给出,运行时,只需将INP,有此内容的M文件以及EPANET源文件中.h和.dll放入即可。

我的MATLAB版本是2012的。

.m文件的内容%计算压力影响系数矩阵clc;clear all;close all;pressure_new=[];P_impactmatrix=[];basedemand_new=[];errcode=loadlibrary('epanet2.dll','epanet2.h');%加载EPANET文件errcode=calllib('epanet2','ENopen','fengxian.inp','fengxian.rpt','');%打开inp文件nodenum=0;%nodenum是总节点数目,可以赋予任意值,可以赋予任意值[errcode,nodenum]=calllib('epanet2','ENgetcount',0,nodenum);%获取总节点数目,注意获取数值的方式,两边要有相同的参数nodenum,也可以不同%0代表获取总节点数目的代码,左边的nodenum为返回值的存储变量,右边nodenum为初始值。

tanknum=0;%tanknum是水源节点数目,可以赋予任意值,但要获取水源节点数目必须初始化[errcode,tanknum]=calllib('epanet2','ENgetcount',1,tanknum);%获取水源点数目,方式与上面的相同,1代表获取水源节点数目的代码junctionnum=nodenum - tanknum;%junctionnum是连接节点数目,注意连接节点数目等于总节点数减去水源节点数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%errcode=calllib('epanet2','ENopenH');%打开水力分析系统errcode=calllib('epanet2','ENinitH',0);%初始化贮水池水位,管道状态和设置以及模拟时间,0表示不存储二进制水力结果time=0;%初始化工况时间,可以是任意值number=0;%number为水力步长进行到的阶段数pressure=0;tstep=1;%初始化水力分析的步数,可以是任意非零值while (tstep && ~errcode)[errcode,time]=calllib('epanet2','ENrunH',time);%执行在time时刻的水力分析number=time/3600;if (number==11)%获取第11步水力分析的水力数据for i=1:junctionnum[errcode,pressure]=calllib('epanet2','ENgetnodevalue',i,11,pressure);pressurevalue(i,1)=pressure;endend[errcode,tstep]=calllib('epanet2','ENnextH',tstep);enderrcode=calllib('epanet2','ENcloseH');%关闭水力分析系统,释放内存pressurevalue; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%basedemand=0;%basedemand是节点属性值,可以赋予任意值,但要获取节点属性值必须初始化pressurenew=0;tstep=1;time=0;number=0;for i=1:junctionnumerrcode=calllib('epanet2','ENopenH');errcode=calllib('epanet2','ENinitH',0);[errcode,basedemand]=calllib('epanet2','ENgetnodevalue',i,1,basedemand);%获取节点属性值,i 代表节点索引,1代表所要获取的节点属性值的代码%1表示所要获取的节点属性值为节点基本需水量,nodevalue是初始节点属性值basedemand_new(i,1)=basedemand*(1+0.3);%改变节点i的基本需水量,从而改变工况errcode=calllib('epanet2','ENsetnodevalue',i,1,basedemand_new(i,1));%把新的节点基本需水量赋予节点iwhile (tstep && ~errcode)[errcode,time]=calllib('epanet2','ENrunH',time);%执行在time时刻的水力分析number=time/3600;if (number==11)for j=1:junctionnum[errcode,pressurenew]=calllib('epanet2','ENgetnodevalue',j,11,pressurenew);pressure_new(j,i)=pressurenew;if (pressure_new(i,i) - pressurevalue(i,1))==0P_impactmatrix(j,i)=0;elseP_impactmatrix(j,i)=abs(pressure_new(j,i) - pressurevalue(j,1))/abs(pressure_new(i,i) - pressurevalue(i,1));endendend[errcode,tstep]=calllib('epanet2','ENnextH',tstep);endtstep=1;errcode=calllib('epanet2','ENsetnodevalue',i,1,basedemand);%注意每一次循环后要把改变后的节点基本需水量改回原来的节点基本需水量errcode=calllib('epanet2','ENcloseH');end% P_impactmatrix;%输出压力影响系数矩阵errcode=calllib('epanet2','ENclose');%关闭tookit系统unloadlibrary('epanet2');。

matlab调用fortran 生成的dll文件

matlab调用fortran 生成的dll文件

混合编程之Matlab 调用Fortran1.测试平台Window 10 64位系统Matlab 2017a 64位Simply Fortran v2.42.Matlab 调用Fortran 之DLL实现2.1.生成DLL文件步骤1:在Simply Fortran v2.4上,新建一个Shared Library(DLL)项目,项目名随意。

步骤2:由于在64位的Matlab上调用DLL,因此我们须将项目的DLL文件也生成为64位,否则Matlab将会提示错误“不是有效的Win32应用程序” 。

注意Target Name的dll文件名须符合为Matlab变量命名法则。

另外,数值之间的传递须有相同的数值类型,否则将会运行出错。

这里先提一句,我们生成的DLL文件可被调用,一般按C调用约定,因此,Fortran的数值类型须与C的数值类型匹配。

在Fortran中常用的数据参数类型有:REAL:表示浮点数据类型,即小数,等价于C的float;INTEGER:表示整数类型,相当于C的int数据类型;DOUBLE PRECISION:表示双精度数据类型,相当于C的double数据类型。

在本例中,我们均采用double数据类型,为了方便,可如下设置:步骤3:书写DLL代码subroutine test(c,a,b)!输出变量必须位于输入变量之前,即c须位于a,b之前,否则在后续Matlab 调用中会错误(笔者认为仅与伪注释!DEC$ A TTRIBUTES REFERENCE有关)!DEC$ A TTRIBUTES C,DLLEXPORT::test!DEC$ A TTRIBUTES REFERENCE ::c !返回值,传地址!上一行伪注释语句说明的是test_f.dll文件中包含一个名为test的子例行程序,C即为按C调用约定输出real::a,b,cc=a+bend subroutine步骤4:生成DLL直接Build project,即可生成test_f.dll文件。

matlab函数调用及数据传递(转载)

matlab函数调用及数据传递(转载)

matlab函数调用及数据传递(转载)函数挪用在一个m文件中,可以界说多个函数,但是文件名必定要与第一个函数(主函数)一概,该文件中其他函数则为本文件的私有函数,外部不行访问(可以经历参数挪用的要领访问,下面会形容)。

比如在一个步骤中,创建一个fig后,会天生这样一个m文件:function varargout =febirdfun(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @febirdfun_OpeningFcn, ...'gui_OutputFcn', @febirdfun_OutputFcn, ...'gui_LayoutFcn', [], ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end剖析一下这个主函数:结果gui_State是一个机关,指定了figure打开和输出函数,开始gui_CallBack为空,倘使输入参数个数不为0,接下来将输入第一个参数通报给gui_State.callback。

接下来用交给gui_mainfcn函数治理,gui_mainfcn 按照gui_State和传入参数来确定是执子函数,仍旧打开fig 文件和运行OpeningFcn和OutputFcn。

matlab调用dll实例

matlab调用dll实例

matlab调用dll实例% 用loadlibrary函数,根据epanet2.h中的函数定义,加载epanet2.dllloadlibrary('c:\epanet2.dll','c:\epanet2.h');% 查看epanet2.dll支持的函数接口libfunctions epanet2 -full% [int32, string, string, string] ENopen(string, string, string)% int32 ENsolveH% [int32, singlePtr] ENgetnodevalue(int32, int32, singlePtr)a1='epanet2.inp';a2='epanet2.rpt';a3='';a_1=libpointer('stringPtr',a1);a_2=libpointer('stringPtr',a2);a_3=libpointer('stringPtr',a3);[d,a_1,a_2,a_3]=calllib('epanet2','ENopen',a1,a2,a3);calllib('epanet2','ENsolveH');c1=12;c2=11;demand=0;c3=demand;c_3=libpointer('singlePtr',c3);[t,c_3]=calllib('epanet2','ENgetnodevalue',c1,c2,c_3)calllib('epanet2','ENclose')unloadlibrary('epanet2')ENopen是打开文件函数,ENsolveH是水力计算函数,ENgetnodevalue是得到某个节点的value值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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手册就行。

相关文档
最新文档