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

合集下载
  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手册就行。

相关文档
最新文档