matlab如何调用dll文件
网上下载的一个代码包,运行的时候提示“未定义与'uint8'类型的输入参数相对应的函数‘vgg’”。但是代码包里面有vgg.dll,vgg.cxx,vgg.mexglx这...
网上下载的一个代码包,运行的时候提示“未定义与 'uint8' 类型的输入参数相对应的函数‘vgg’”。但是代码包里面有vgg.dll,vgg.cxx,vgg.mexglx这三个文件。怎样才能用这三个文件生成vgg.m呢?
展开
展开全部
在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调用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的帮助文件。
展开全部
基于DLL形式VC调用MATLAB函数方法
如果在一MATLAB中或VC中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成DLL是一个很方便的方法,不需要重写了。今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。
1,MATLAB中编译DLL
在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:lib mtTestFun.m生成DLL,用这个命令生成的是C++形式的,即MATLAB数据类型可以用类;否则用其他的命令生成的C形式的,不能用类。并生成了相应的其他mtlibTestFun.h,mtlibTestFun.lib和mtlibTestFun.dll在内的一些文件
2,VC中引用MATLAB环境
需要引用的.h文件路径为MATLAB安装目录的Extern\Include,需要引用的.lib文件路径为MATLAB安装目录的Extern\Lib\Win32\Microsoft;引入附加库mclmcrrt.lib
3,VC中调用MATLAB函数
将刚才MATLAB编译生成的文件全拷到当前VC工程下,只将mtlibTestFun.h文件加入到当前工程,并在需要调用的文件中包含;引入附加库mtlibTestFun.lib。在VC初始化函数里用下面函数进行初始化
mclInitializeApplication(NULL,0);
mtlibTestFunInitialize();
在结束时用下面函数释放
mtlibTestFunTerminate();
mclTerminateApplication();
下面在需要的地方调用,假设是下面的形式
mtlibTestFun(int nargout, mwArray& y, const mwArray& I, const mwArray& th);
nargout是返回参数个数,这里是1,后面y反演向量则是传出参数,I和th则是传入参数辐射值和切高。
C++数据传入MATLAB函数时需要将其转化成mwArray类型
double* pI = new double[row*column];
pl = ...
mwArray mwI(row, column, mxDOUBLE_CLASS);
mwI.SetData(pI, row*column);
返回后还需要将mwArray转回C++类型数据
double* pY = new double[Yrow*Ycolumn];
mwY.GetData(pY, Yrow*Ycolumn);
当然,对于一维数组数据来说,这样调用是没有问题的,但是对于二维矩阵数据来说,上面的调用会发生数据传入和传出错误。因为C++与MATLAB数组存储顺序不一样,MATLAB是列优先与C++中的行优先不同。这个数据的转换也将在后续给出一些解决办法。
如果在一MATLAB中或VC中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成DLL是一个很方便的方法,不需要重写了。今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。
1,MATLAB中编译DLL
在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:lib mtTestFun.m生成DLL,用这个命令生成的是C++形式的,即MATLAB数据类型可以用类;否则用其他的命令生成的C形式的,不能用类。并生成了相应的其他mtlibTestFun.h,mtlibTestFun.lib和mtlibTestFun.dll在内的一些文件
2,VC中引用MATLAB环境
需要引用的.h文件路径为MATLAB安装目录的Extern\Include,需要引用的.lib文件路径为MATLAB安装目录的Extern\Lib\Win32\Microsoft;引入附加库mclmcrrt.lib
3,VC中调用MATLAB函数
将刚才MATLAB编译生成的文件全拷到当前VC工程下,只将mtlibTestFun.h文件加入到当前工程,并在需要调用的文件中包含;引入附加库mtlibTestFun.lib。在VC初始化函数里用下面函数进行初始化
mclInitializeApplication(NULL,0);
mtlibTestFunInitialize();
在结束时用下面函数释放
mtlibTestFunTerminate();
mclTerminateApplication();
下面在需要的地方调用,假设是下面的形式
mtlibTestFun(int nargout, mwArray& y, const mwArray& I, const mwArray& th);
nargout是返回参数个数,这里是1,后面y反演向量则是传出参数,I和th则是传入参数辐射值和切高。
C++数据传入MATLAB函数时需要将其转化成mwArray类型
double* pI = new double[row*column];
pl = ...
mwArray mwI(row, column, mxDOUBLE_CLASS);
mwI.SetData(pI, row*column);
返回后还需要将mwArray转回C++类型数据
double* pY = new double[Yrow*Ycolumn];
mwY.GetData(pY, Yrow*Ycolumn);
当然,对于一维数组数据来说,这样调用是没有问题的,但是对于二维矩阵数据来说,上面的调用会发生数据传入和传出错误。因为C++与MATLAB数组存储顺序不一样,MATLAB是列优先与C++中的行优先不同。这个数据的转换也将在后续给出一些解决办法。
追问
我下载的代码里面有vgg.dll,vgg.cxx,vgg.mexglx这三个文件,我想要得到vgg.m文件
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询