本来想把算法写成一个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)
此时就会输出正确的结果
总结:这个例子比较简单,只是为了演示整个过程,如果你是真的用到了Matlab来调用外部DLL的这种方式的话,就要注意你的DLL工程要符合Matlab的要求啦,详细信息请自己查看Matlab的帮助文件,我就不罗嗦了。
11
喜欢
转载列表:
转载
转载是分享博文的一种常用方式...
-
雪乡公子007
你好,我在vs2010中按照你的步骤运行,其中在loadlibrary这一步中出现错误‘MatlabDllTest.dll 不是有效的 Win32 应用程序’,还望指点一下。拜托了。
2014-3-30 14:48举报删除分享回复(0)
-
绝对零度
同请教类似楼上的问题……
我在VS2013中编译生成了MatlabDllTest.dll,但是在Matlab 2014a中loadlibrary时同样出现了错误“不是有效的Win32应用程序”。求助如何解决……
2014-9-11 21:34举报删除分享回复(1)
-
-
-
-
-
兔子72505
您好,为什么我的总是出现错误,不知道怎么办了
libfunctions('MatlabDllTest1', '-full')
没有 lib.MatlabDllTest1 类的方法。
matlab调用dll的小小启发
首先matlab是支持同C的混合编程滴~
我重点研究的是如何将C用在matlab中~
调用dll技术是也~
主要有两种方法~
一种,是MEX~
C函数可大体不变~
只需一点小小的修改~
也就是MEX固定滴一些语法~
倘若是想实现矩阵的转置吧,设为change.c~
一个输入,一个输出~
又是假设:a = magic(4)~
mex指令:mex change.c~
会生成change.mexw32~
mexw32就相当于dll,只是matlab版本问题罢了~
直接b = change(a),就可得到想要结果~
对了,为何要用MEX?~
当然,主要是为了提速,当遇到特别大的循环时~
另一种,matlab自带函数,调用动态链接库dll~
先用用VC或者eclipse生成dll~
都试了,也都可行~
主要讲一下我用的eclipse吧~
新建project——>Shared Library——>Empty Project——>MinGW GCC——>finish~
添加.c和.h文件,主要有一点要注意,就是.h中必须要有这么一句~
__declspec(dllexport) double add(double x, double y);~
只是为了假设.c中有add函数~
然后编译,就会生成dll~
假设就是add.dll,和add.h一起移到matlab相应工作目录~
只需这样使用:~
loadlibrary add.dll~
libfunctions('add'),这个是为了确定add是不是加载进去了~
然后调用:calllib('add','add',5,4)
结果就是9了~
前一个add是dll,后一个add是函数~
小结一下~
以上主要就是MATLAB如何调用动态链接库dll~