Matlab调用DLL以及matlab指针参数传递
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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手册就行。