如何用matlab生成dll文件

作者&投稿:智柯 (若有异议请与网页底部的电邮联系)
如何调用matlab生成的dll文件进行编程~

通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件!
一、使用matlab将.m转成dll文件
1、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。
2、在命令行中输入mbuild -setup
这里的选项和上面类似,依次选择环境确定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add表示生成的dll文件名,后面的add.m顾名思义是.m文件名。生成后会多出8个文件,有用的是add.ctfadd.dll add.lib add.h4个文件,据说新版的Matlab不会生成.ctf文件。
二、VC6.0中调用生成的dll文件
上面生成的dll文件,我们可以借助VC6.0的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助.h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:
1、add.m文件
function [a,b]=add(x,y)
a=2*x+y;
b=3*y;
end


注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;
2、add.h文件
截取其中一段关键代码如下:
extern void add(int nargout, mwArray& a, mwArray& b
, const mwArray& x, const mwArray& y);


实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!
3、C++中调用dll文件
(1)新建空工程,将上面提及的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
比如我的是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!
(4)工程属性-》连接-》输入-》附加依赖项
输入:add.lib mclmcrrt.lib mclmcr.lib,第一个是生成的。或者在预处理中加入下面代码
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "add.lib")


4、C++代码
#include
#include "add.h"
using namespace std;
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl;
return -1;
}

mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);

a(1,1)=20;
b(1,1)=30;

mwArray x(1,1,mxDOUBLE_CLASS);
mwArray y(1,1,mxDOUBLE_CLASS);

//输出参数个数,输出参数,输入参数。
add(2,x,y,a,b);

double *i=new double;
double *j=new double ;

x.GetData(i,1);
y.GetData(j,1);

cout<<"x="<<*i<<" y="<<*j<<endl;
getchar();
return 0;
}


注意:addInitialize()一定要!

在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编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件!
一、使用matlab将.m转成dll文件
1、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。
2、在命令行中输入mbuild -setup
这里的选项和上面类似,依次选择环境确定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add表示生成的dll文件名,后面的add.m顾名思义是.m文件名。生成后会多出8个文件,有用的是add.ctfadd.dll add.lib add.h4个文件,据说新版的Matlab不会生成.ctf文件。
二、VC6.0中调用生成的dll文件
上面生成的dll文件,我们可以借助VC6.0的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助.h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:
1、add.m文件
function [a,b]=add(x,y)
a=2*x+y;
b=3*y;
end

注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;
2、add.h文件
截取其中一段关键代码如下:
extern void add(int nargout, mwArray& a, mwArray& b
, const mwArray& x, const mwArray& y);

实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!
3、C++中调用dll文件
(1)新建空工程,将上面提及的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
比如我的是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!
(4)工程属性-》连接-》输入-》附加依赖项
输入:add.lib mclmcrrt.lib mclmcr.lib,第一个是生成的。或者在预处理中加入下面代码
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "add.lib")

4、C++代码
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl;
return -1;
}

mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);

a(1,1)=20;
b(1,1)=30;

mwArray x(1,1,mxDOUBLE_CLASS);
mwArray y(1,1,mxDOUBLE_CLASS);

//输出参数个数,输出参数,输入参数。
add(2,x,y,a,b);

double *i=new double;
double *j=new double ;

x.GetData(i,1);
y.GetData(j,1);

cout<<"x="<<*i<<" y="<<*j<<endl;
getchar();
return 0;
}

注意:addInitialize()一定要!


用matlab怎么生成列向量?
matlab生成列向量的方法如下:1、直接输入:行向量:a=[1,2,3,4,5]列向量:a=[1;2;3;4;5]2、用“:”生成向量:a=J:K 生成的行向量是a=[J,J+1,…,K]a=J:D:K 生成行向量a=[J,J+D,…,J+m*D],m=fix((K-J)\/D)3、函数linspace 用来生成数据按等差形式排列的行向量:x=l...

用MATLAB随机生成法生成一个3~8以内的3阶整数矩阵?
可以使用MATLAB中的randi函数生成3~8以内的随机整数,然后使用reshape函数将其变形成3阶矩阵。具体代码如下:生成3~8以内的随机整数A = randi([3,8],1,9);将A变形成3阶矩阵A = reshape(A,3,3);解释一下上面的代码:randi函数用于生成3~8之间的随机整数,[3,8]表示生成的随机数范围,1表示生...

利用matlab(或其他任何方式)生成100个随机数,并编制C语言程序进行从小到...
1. 打开并读取`random_numbers.txt`文件中的100个随机数。2. 使用冒泡排序算法对随机数进行排序。3. 打印排序后的结果。该程序假定`random_numbers.txt`文件已经通过Matlab代码生成并填充了随机数。请确保这个文件位于C程序相同的目录中,或者在fopen函数中提供正确的路径。请在本地环境中编译并运行C程序...

如何用matlab生成随机数函数
使用matlab里面的rand函数可以生成随机数函数。rand函数的用法 :(1)命令:rand(N),rand(M,N)等 (2)对于rand(N),通过help rand得到的解释是:R = rand(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard uniform distribution on the open interval(0,1...

如何用matlab 产生 均值为0,方差为5的高斯噪声
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声.1.WGN:产生高斯白噪声 y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度.y = wgn(m,n,p,imp) 以欧姆(Ohm)...

如何用Matlab实现区域生长?
Matlab程序举例如下:(程序使用时候,regiongrow一定要先定义,这个我不用交吧?)i=imread('eight.tif');figure(1);imshow(i);i=doulbe(i);[m,n]=size(i);[y1,x1]=getpts;x1=round(x1);y1=round(y1);seed=[x1,y1];th_mean=40;yout=regiongrow(i,seed,th_mean);figure(2);imshow(...

如何用matlab 生成这样的图?
a=0:1:255;b=255:-1:0;c=255*ones(1,256);d=zeros(1,256);red=[c,b,d,a];green=[a,c,b,d];blue=[d,d,a,c];t(1,:,1)=uint8(red);t(1,:,2)=uint8(green);t(1,:,3)=uint8(blue);for i=1:300 t(i,:,:)=t(1,:,:);end imshow(t)你图上的色条不是...

matlab怎么生成正态分布随机数
第一步我们首先需要知道matlab中可以使用randn函数生成正态分布随机数,在命令行窗口中输入“help randn”,可以看到randn函数的使用方法,如下图所示:第二步输入randn(5),生成一个均值为0,方差和标准差为1的5行5列正态分布随机数矩阵,如下图所示:第三步输入randn(3,4),可以生成一个3行4列的...

谁知道如何用matlab生成m序列,不用simulink。。。急求程序。。。谢谢...
1.m序列 clear p=5 np=(2^p-1)x=[1 0 1 0 0 0 1]for i=10:2*(np+1)x(i)=xor(x(i-4),x(i-9))end xi=x\/np plot(xi)2.逆m序列 clear p=5 np=(2^p-1)x=[1 0 1 0 0 0 1]for i=10:2*(np+1)x(i)=xor(x(i-4),x(i-9))end plot(x)s=[]for i...

如何用matlab生成一个函数序列
Matlab随机数生成函数 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽玛分布的随机数生成器 geornd 几何分布的随机数生成器 hygernd 超几何分布的随机数生成器 lognrnd 对数正态分布...

矿区19428122725: 如何用matlab生成dll文件 -
五狡马来: 通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言.如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll...

矿区19428122725: 如何将MATLAB程序编译产生DLL -
五狡马来: 把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用.为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论.下面是这个例子用到的m代码.它定义了一个名为...

矿区19428122725: 怎样用matlab生成vs可调用的dll形式的com组件 -
五狡马来: 1.在matlab中生成dll 在m文件中实现如下功能:获得N个魔方矩阵的秩.m文件的内容如下:function r = mrank(n) r = zeros(n,1); for k=1:n r(k) = rank(magic(k)); end 将上述内容保存为:mrank.m 在matlab的command 窗口键入:>> mcc -B ...

矿区19428122725: 如何vs2010调用matlab 2010生成dll -
五狡马来: 首先matlab要安装64位的,一般在64位系统下默认安装64位. 在Matlab中运行mbuild -setup,选择64位的编译器.这个要配合vs2010的安装进行,vs2010中需要有64的编译器. 首先,写一个很简单的加法函数: function [c] =Add(a, b); c = a + ...

矿区19428122725: 如何在matlab中生成dll文件供labview调用 -
五狡马来: matlab下生成的dll实际上还是com控件,可以自动生成注册文件,运行即可注册.我实际使用了,发现存在2个问题: 1、速度很慢; 2、数组类型不工作;只可以在参数为数字时候正确. 2006a版本以前可以输入comtool,即可. 在2006a版本以后,就是输入:dotnettool,然后弹出一个对话框的生成东西,只要简单的配置,就可以了,或者在matlab的帮助文件里面输入dotnettool.

矿区19428122725: matlab软件怎么调用dll格式的文件? -
五狡马来: 基于DLL形式VC调用MATLAB函数方法 如果在一MATLAB中或VC中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成DLL是一个很方便的方法,不需要重写了.今天把基于DLL形式VC调用MATLAB函数的主要过程写下,...

矿区19428122725: matlab神经网络工具箱编译成dll -
五狡马来: matlab编译动态连接库需要你有mcc,你的安装序列号必须能包括这个功能,这是前提.之后,两种方法,一种使用mcc -t myfile.m 可以生成c/c++代码,然后使用其他编译器编译成dll文件.第二种方法,使用mcc -l myfile.m,直接生成dll文件.然后,这时候你可以看看神经网络工具箱里面都有些什么东西,可以尝试一下直接编译nntool.m,使用mcc -l nntool.m,应该就可以直接编译.我觉得这样可以.如果不行,那么你可能得把你需要的函数都找出来,复制到一个文件下面,然后再用mcc进行编译.

矿区19428122725: 怎么把matlab的M文件转化成.dll形式 -
五狡马来: 安装函数库,在matlab\toolbox\compiler\deploy\win32目录下的mcrinstaller.exe文件

矿区19428122725: matlab R2014a如何生成dll -
五狡马来: 试试deploytool工具箱

矿区19428122725: matlab dll文件怎么直接用 -
五狡马来: 在Matlab的Help中搜索"Calling Functions in Shared Libraries"即可看到关于此内容的帮助文档.下面以一个简单的小例子演示Matlab调用DLL的过程:1、编译器准备 在Matlab的命令窗口输入:mex -setup 选择你的编译器,我的是:[2] ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网