matlab调用dll实例
MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明
MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。
3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。
4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件5、使用步骤1,2验证MATLAB生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。
在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口1.2开始创建DLL第一步:在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。
max.h头文件中的代码为:1. #ifndef _MAX_H2. #define _MAX_H_3. __declspec(dllexport) int __stdcall fmax(int a,int b);4. #endif代码说明:__declspec(dllexport) 的作用是指定导出该函数为DLL函数;__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。
关于vb,vc调用matlab的m.文件生成的dll.文件
Matlab函数转换为VB可用的DLLMatlab函数转换为VB可用的DLL段晓君摘要:一种利用Matcom将Matlab函数转换为VB中可用的动态链接库的方法,操作简单易行。
关键词:Matlab函数动态链接库DLL M-文件VB语言1 Matlab简介Matlab是MathWorks公司开发的一种工程计算语言。
它是一个交互系统,在Matlab 中的基本数据元素是一个不要求维数的复矩阵。
用Matlab可解决很多工程计算问题,特别是涉及到矩阵和矢量形式的问题。
Matlab是一个高度集成的语言环境,在它的界面下可以编写程序、运行程序并可进行跟踪调试。
对于广大的工程技术人员和科学研究人员来说,Matlab不失为一种很好的工具。
Matlab也有局限性,一般它不能脱离Matlab集成环境工作;而且编写界面的功能比较弱。
Matcom是一个从Matlab到C++的编译器,它可以节省用户的运算时间和内存要求。
MathTools公司利用Matcom技术编写了Mideva工具软件,它可以借用C++编译器将Matlab下的M-文件转换为可被Visual Basic、Excel以及Delphi调用的DLL 动态链接库或者是独立的可执行文件。
本文就M-文件到DLL的转换以及在VB中调用这一类DLL 的2个问题做了一些探讨。
文中针对Matlab5.0、VC5.0、VB5.0、Matcom4.0或相应的更高版本的软件进行了讨论。
2 M-文件到DLL的转换要将一个m-文件编译成DLL,需进行如下操作:启动运行Matcom4的Mideva,点击菜单File/Compile to dll,选择要转换的m-文件(该文件应该是能够作为函数被其它集成环境调用的m-文件,假设文件名为yourfile.m)。
值得注意的是,Mideva对M-文件有一定的要求,即该文件必须是1个函数,如果要编译没有输入也没有输出的脚本文件,可以先在Matlab中将它编辑成无输入无输出的函数,再按照上述操作进行转换。
在MATLAB环境中调用DLL对硬件资源访问的方法
Ab t a t MAT AB i a h g - e o ma c c e t i n n i e rn o u ig s f r i t n u r a a c lt n sr c : L s ih p r r n e s in i c a d e gn e g c mp t ot e w t a sr g n me c l lu a i f f i n wa h o i c o a d a ay i c p b l i s b t t a i t c e s h a d r e k I e MAT AB e vr n n i c c e st a d r n n l s a a i t , u s bl yt a c s e h r wa ei w a . n t s ie i i o t s h L n i me t r t c s h r wa e o d e a o r s u c sc n ge t cl ae t ev l a in o aa p o e sn n l o t m,b s d o i p r o ep o o ea x e s n o e o r e a r a l f i tt h a i t f t r c s ig a d ag r h ya i d o d i a e n t s u p s r p s n e tn i f h o
Matlab调用动态链接库
Matlab调⽤动态链接库matlab帮助⽂档⾥有详细⽂档Call Functions in shared Libaries什么是共享库共享库是⼀组函数的集合,在程序运⾏期间可以动态加载。
共享库中的函数可以⽤不同的语⾔实现,但只要这些函数提供了C语⾔接⼝,那Matlab就⽀持该共享库,⽽且Matlab ⽀持在不同平台下链接共享库。
平台共享库⽂件扩展名Micsoft Windows动态链接库⽂件.dllUNIX and Linus共享⽬标⽂件.soApple Macintosh动态共享⽂件.dylib共享库必须要提供⼀个头⽂件,⽤来声明共享库中的函数。
函数签名中明确了函数的名称,参数的个数和类型。
你还需要⼀个已安装好的matlab⽀持的C编译器。
matlab可以通过命令⾏接⼝调⽤外部共享库中的函数。
这个接⼝允许你将⼀个外部共享库加载到Matlab内存中,并调⽤共享库中的函数。
虽然matlab语⾔和C语⾔差异较⼤,但是通常你可以直接传递⼀个类型到C函数中,不需要做转换,因为matlab在后⾯已经帮你做好了这部分⼯作。
当你使⽤完了共享库,有个重点是你需要卸载共享库以释放内存。
加载和卸载共享库为了让matlab调⽤共享库中的函数,⾸先需要将共享库加载到内存中去,加载完之后,你可以获取库中的函数信息和直接在matlab中调⽤这些函数,当不再需要共享库时,还需要卸载共享库来维持内存使⽤情况。
加载共享库到matlab中,使⽤loadlibray函数,函数语法是:loadlibrary('shrlib','hfile')其中shrlib表⽰共享库⽂件的名称,hfile表⽰包含函数声明的头⽂件名称。
⽤unloadlibrary命令去卸载共享库并释放内存。
命令语法:unloadlibrary libname其中libname表⽰共享库名称。
查看共享库函数在命令⾏窗⼝中查看函数为了在命令⾏窗⼝中显⽰共享库中的函数信息,可以⽤libfunctions,例如,查看libmx共享库中有哪些可⽤的函数,可以输⼊如下命令:if not(libisloaded('libmx'))hfile = [matlabroot '\extern\include\matrix.h'];loadlibrary('libmx',hfile)endlibfunctions libmxmatlab命令⾏窗⼝中显⽰:MATLAB displays (in part):Functions in library libmx:mxAddField mxGetScalarmxArrayToString mxGetString_730mxCalcSingleSubscript_730 mxGetUserBitsmxCalloc mxIsCellmxCreateCellArray_730 mxIsCharmxCreateCellMatrix_730 mxIsClass. .. .. .如果想看具体的函数签名,在命令后加-full指令,这个选项能够显⽰matlab调⽤共享库中函数的语法,其中函数⽤的参数列表和返回类型均为matlab类型,⽽不是C版本的类型。
在VS2010中调用MATLAB生成的DLL
在VS2010中调用MATLAB生成的DLL最近需要制作一个C的插件,需要使用MATLAB代码,所以想通过C语言调用MATLAB的动态链接库实现。
以下实现过程参考了MATLAB的help~编译环境:MATLAB2014a、Visual Studio20101.首先,在MATLAB中新建一个.m文件,命名为dll_test.m并保存,内容如下:function c = dll_test(a) %#codegenc = sqrt(a);end2.使用codegen命令生成DLL:这里先简单介绍一下codegen命令:o codegen命令用于从MATLAB代码获取C/C++代码,常见的两种命令格式:o codegen options file file1_name args...filen_name argscodegen project_name其中第一种用于处理文件,第二种用于处理工程;参数args表示示例输入,并不进行真正的参数传递;参数files是生成C/C++时需要包含的文件(.c/.cpp/.h/.obj/.lib/.tmf);options规定了生成的目标代码类型(dll/exe/lib/mex),命令为-config:dll(其他类似),具体命令解析可以在MATLAB命令行输入help codegen查看;o将当前路径更改为.m文件的保存路径,然后在命令行中输入以下命令:o codegen -report -config:dll dll_test -args {0}其中-report可以产生一份生成状态的报告:生成成功后的文件或错误报告;生成错误的话,重选路径,注意args与参数{0}之间有空格,多个参数空格分隔;3.上一步成功之后在目录./codegen/dll/dll_test下可以看到生成的所有文件。
在VS2010下新建一个控制台工程,将之前生成的依赖文件dll_test.dll拷贝到工程目录下,并且添加一个c/c++文件到工程中,内容如下:4.#include "dll_test.h"5.#include "dll_test_initialize.h"6.#include "dll_test_terminate.h"7.#include <stdio.h>8.9.int main()10.{11.dll_test_initialize();12.printf("%f\n", dll_test(25));13.dll_test_terminate();14.//gerchar();15.return 0;}•VS默认配置是Win32 Debug模式,根据你之前生成的DLL,选择win32 Release还是x64 Release;•选中VS项目,右键->属性,选择C/C++ ->常规->附加包含目录,添加目录 ./codegen/dll/dll_test;选择链接器->常规->附加库目录,添加路径同上;选择链接器->输入->附加依赖项,将dll_test.lib加入;确定;•VS配置完成,完美运行~。
MATLAB调用C++DLL
MATLAB调用C++动态库的方法声明:本人知识水平有限,文档中难免有错,望谅解!一、方法步骤1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。
2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),其实,这个文件起转换作用。
也就是说,你用MATLAB调用C++动态库就必须通过这个文件去调用,而这个文件就是由.cpp文件生成的。
这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下:void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])nlhs:输出参数个数plhs:输出参数列表nrhs:输入参数个数prhs:输入参数列表不过函数名可以随便取的。
在这个函数中你就可以去调用C++动态库的函数了。
记住头文件:”mex.h”……注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。
3、使用mex命令编译XXX.cpp。
如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64文件。
这个文件的文件名就将是你要调用的函数名;4、现在就可以写脚本调用这个函数了。
二、案例1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数double Demo_Add( double x, double y); //功能:将两个数相加并返回这些大家都知道,不用我说了吧。
2、在MATLAB中写一个c++文件Test.cpp:#include "mex.h"#include "Demo.h"#pragma comment(lib,"Demo.lib")void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){if( nrhs != 2) //判断输入参数的个数{mexErrMsgTxt("输入参数个数不对!");}//得到传入的第一个参数,并转换了double类型double p1 = *((double*)mxGetPr(prhs[0]));//得到传入的第二个参数,并转换了double类型double p2 = *((double*)mxGetPr(prhs[1]));//创建一个1*1的实时double类型的矩阵plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);//得到输出的第一个参数的指针double *output = (double*)mxGetPr(plhs[0]);//调用Demo.dll定义的函数实现功能,并将返回值给输出参数*output = DEMO_Add(p1, p2);}3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32或者Test.mexw64.5、那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.我现在就写一个脚本文件First.m:clcclearticx = 1.6;y = 2.7;Test_add = Test(x, y)toc6、run这个脚本.MATLAB调用C++动态库就成功了….Author : Li JunDate :2012-03-26。
调用Matlab对矩阵做奇异值分解的程序源代码
调用Matlab对矩阵做奇异值分解的程序源代码为计算针对多目标节点集的相对连通系数需要对矩阵进行奇异值分解,为此可直接调用Matlab里的对应矩阵计算模块。
从VC++调用Matlab进行计算有两种方法:一种是通过Matlab引擎直接调用Matlab,另一种是将Matlab函数编译为dll在VC中使用。
这里采用第二种方法,通过Matlab引擎调用矩阵计算功能。
其实现代码如下。
void Connectivitys::svd_Matlab(void * destMatrixP){int i,j;double * vP=NULL,* sP=NULL;mxArray *Xin,*Vout,*Sout;Engine * ep;//显式加载Matlab动态链接库,定义其中的函数HINSTANCE hInst_libeng=LoadLibrary(“libeng.dll”);HINSTANCE hInst_libmat=LoadLibrary(“libmat.dll”);HINSTANCE hInst_libmx=LoadLibrary(“libmx.dll”);typedef Engine *(*_EngOpen)(const char *startcmd);_EngOpen engOpen=(_EngOpen)GetProcAddress(hInst_libeng,“engOpen”);typedef int(*_EngClose)(Engine*ep);_EngClose engClose=(_EngClose)GetProcAddress(hInst_libeng,“engClose”);typedef mxArray *(*_EngGetArray)(Engine *ep,const char *name);_EngGetArray engGetArray=(_EngGetArray)GetProcAddress(hInst_libeng,“engGetArray”);typedef int(*_EngPutArray)(Engine *ep,const mxArray *ap);_EngPutArray engPutArray=(_EngPutArray)GetProcAddress(hInst_libeng,“engPutArray”);typedef int(*_EngEvalString)(Engine *ep,const char *string);_EngEvalString engEvalString=(_EngEvalString)GetProcAddress(hInst_libeng,“engEvalString”);typedef mxArray *(*_MxCreateDoubleMatrix)(int m,int n,mxComplexity flag);_MxCreateDoubleMatrix mxCreateDoubleMatrix=(_MxCreateDoubleMatrix)GetProcAddress(hInst_libmx,“mxCreateDoubleMatrix”);typedef void(*_MxDestroyArray)(mxArray *pa);_MxDestroyArray mxDestroyArray=(_MxDestroyArray)GetProcAddress(hInst_libmx,“mxDestroyArray”);typedef void(*_MxSetName)(mxArray*pa,const char *s);_MxSetName mxSetName=(_MxSetName)GetProcAddress(hInst_libmx,“mxSetName”);typedef double *(*_MxGetPr)(const mxArray *pa);_MxGetPr mxGetPr=(_MxGetPr)GetProcAddress(hInst_libmx,“mxGetPr”);//调用MATLAB引擎if(!(ep=engOpen(NULL))){AfxMessageBox(_T(“Can’t start MATLAB engine”));exit(-1);}//将平均偏差矩阵载入MatlabXin=mxCreateDoubleMatrix(destNodesNum,totalNodeNum,mxREAL);mxSetName(Xin,“x”);memcpy((char *)mxGetPr(Xin),(char *)destMatrixP,destNodesNum*totalNodeNum*sizeof(double));free(destMatrixP);engPutArray(ep,Xin);//对平均偏差矩阵进行SVD分解engEvalString(ep,“[u,s,v]=svd(x);”);//获取SVD分解结果Sout=engGetArray(ep,“s”);sP=mxGetPr(Sout);Vout=engGetArray(ep,“v”);vP=mxGetPr(Vout);//利用SVD分解结果进行多尺度分析//求多目标节点集相对连通系数RCCfloat totalSum=0.0,vi=0.0;for(j=0;j<destNodesNum;j++)totalSum+=*(sP+(destNodesNum+1)*j);for(i=0;i<totalNodeNum;i++){MultiNodesRCC[i]=0.0;for(j=0;j<destNodesNum;j++){vi=*(vP+totalNodeNum*j+i);if(vi<0)vi=0-vi;MultiNodesRCC[i]+=(*(sP+(destNodesNum+1)*j)/totalSum)*vi;}}//关闭MATLAB引擎,释放分配的资源engClose(ep);mxDestroyArray(Xin);mxDestroyArray(Sout);mxDestroyArray(Vout);FreeLibrary(hInst_libeng);FreeLibrary(hInst_libmat);FreeLibrary(hInst_libmx);}-全文完-。
Matlab调用DLL以及matlab指针参数传递
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.02、编写你自己的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 __cplusplusextern"C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3、加载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++调用DLL方法
Matlab和C++调用DLL方法Matlab可以调用外部DLL,如用C或C++写的DLL。
本文分三个部分介绍Matlab和C++调用DLL方法。
一、C++写dll方法二、C++调用dll三、Matlab调用dll一、C++写DLL方法在CPP文件中和普通CPP没什么区别,在H文件中加上需要导出的函数名,格式如下:extern "C" int __declspec(dllexport)add(int x, int y);蓝色部分是函数返回的类型,红色部分是要导出的函数,就这么简单。
下面是两个整数相加的代码:main.h:extern "C" int __declspec(dllexport)add(int x, int y);main.cpp:#include "main.h"int add(int x, int y){return x + y;}编译即可得到dll文件,我的工程名叫mydll,因此得到的是mydll.dll二、C++调用DLL方法将DLL文件拷入到源文件夹中,在CPP代码中引入windows.h文件,否则有些方法找不到,用指针来接受参数。
装载DLL,用函数名,卸载DLL。
代码如下:#include <windows.h>#include <iostream>using namespace std;int main(void){typedef double(*padd)(double a,double b);double r;HINSTANCE hDLL;padd add;hDLL=LoadLibrary("mydll.dll");add=(padd)GetProcAddress(hDLL,"add");r=add(5.3,8.6);cout<<r<<endl;FreeLibrary(hDLL);return 0;}三、Matlab调用DLL通常matlab调用DLL有两种方法,一种是用mex文件,另一种是用matlab的函数。
利用matlab进行dll文件生成流程
dll文件生成流程
1、在Matlab 命令窗口输入命令dotnettool,弹出Matlab Builder窗口
图2 dotnettool的图形界面
2、在File菜单中,点击New Project,弹出New Project Settings窗口,在
Component name内,填入工程名(可任取),然后在Compiler options 内,选择Create a singleton MCR和Show Verbose output两选项。
点击OK,弹出Project Directory 窗口,点击Yes,返回Matlab Builder窗口。
(Project directory必须置于Matlab安装目录的work文件下)
图3 设置相关内容
图4 询问是否创建目录
3、在Matlab Builder窗口,点击M-Files,然后点击Add File,弹出Add File
to Project窗口,选择需要编译的M文件。
图5 选择编译文件界面
4、在Matlab Builder窗口,点击Build菜单中.NET Object,进行编译。
图6 编译过程
5、编译完成后,点击File菜单中Package Component,弹出Package Files窗
口,点击Creat,对当前工程中必要的文件打包。
图7 打包组件选项。
【转】在VS2008中联合使用Matlab编程的技巧一
【转】在VS2008中联合使⽤Matlab编程的技巧⼀在VS2008中联合使⽤Matlab编程的技巧⼀在VS中使⽤Matlab来处理矩阵主要有两种⽅法,⼀种是直接是VS中编程打开Matlab引擎,输⼊Matlab语句,另外⼀种就是将Matlab的m.⽂件编译⽣成dll⽂件,在VS中调⽤该dll⽂件。
⼀、在VS中调⽤matlab⽣成的dll⽂件该实例是基于VS2008和matlab2009a所实现的。
1、Matlab中的设置⾸先在Matlab⾥⾯新建⼀个M⽂件,主要代码为:function[M]=gray_model_test_sonar3(a)%function[M]=gray_model_test_sonar3(a1,a2,a3,a4)%a=[a1;a2;a3;a4];a1=[a(1);a(1)+a(2);a(1)+a(2)+a(3);a(1)+a(2)+a(3)+a(4)];B=[-0.5*(a1(1)+a1(2)),1;-0.5*(a1(3)+a1(2)),1;-0.5*(a1(4)+a1(3)),1;];B = double(B);F=[a(2);a(3);a(4)];C=B'*B;D=pinv(C);%求C的伪逆D = double(D);F = double(F);E=D*B'*F;G=(a(1)-E(2)/E(1))*exp(-4*E(1))+E(2)/E(1);T=(a(1)-E(2)/E(1))*exp(-3*E(1))+E(2)/E(1);M=G-T;end该段代码为使⽤灰⾊模型进⾏预测的基础代码,重点在于Matlab程序必须要包含着functiong和end之间。
将m⽂件保存为sonar3.m,保存在D:\test⽂件件中,然后在Matlab的command window中键⼊:cd D:\test ,在Matlab主窗⼝中将当前路径改为D:\test。
然后设置matlab编译库,以便能够⽣成动态dll⽂件供VS调⽤,在Matlab主窗⼝中键⼊:mbuild -setup会出现:Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?在这⾥我选择的n,得到显⽰:Select a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005 SP1[5] Microsoft Visual C++ 2008 Express[6] Microsoft Visual C++ 2008 SP1[0] NoneCompiler:The default location for Microsoft Visual C++ 2008 SP1 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? yPlease verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: C:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? y****************************************************************************Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.****************************************************************************Trying to update options file: C:\Users\Vivian\AppData\Roaming\MathWorks\MATLAB\R2009a\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2009a\bin\win32\mbuildopts\msvc90compp.batDone . . .当出现如上说明,就代表编译器设置完成,接下来使⽤.m⽂件⽣成.dll⽂件在Matlab中,.m⽂件⽣成.dll⽂件的指令如下:mcc -W cpplib:myadd -T link:lib add.m -C其中,myadd是需要⽣成的dll的⽂件名,即⽣成的⽂件名为myadd.dll,add.m是指明通过哪个.m⽂件⽣成dll⽂件的,myadd 和add可以不⼀样。
MATLAB(R2015b)和C#(VS2010)混合编程实例说明
1 平台我采用的平台:Matlab版本R2015b(32位)(备注:R2013b版本的工具包目前国内使用的破解版本,破解不完全,不支持混合编程,切记,其余版本不知道)。
Microsoft Visual Studio版本:2010(32位),这个软件版本没有太多要求。
2 MATLAB部分该部分主要是说明Matlab生成DLL调用文件。
2.1配置Matlab 的编译器1. 在MATLAB 的命令窗口中输入mbuild –setup 会弹出:(这是我已经配置好的)未配置的时候,会弹出在弹出的选择项中,使用默认的[y](直接回车就是选择默认值),让Matlab 自动搜索可用的编译器。
如果只安装了vs2010(如果未安装,请先安装),会弹出可选编译器为:选择 1 回车选择y 回车至此,配置完成。
2.2Matlab写算法这一部分不过多赘述,只以一个简单的示例进行说明。
算法1:矩阵与其转置矩阵相乘的代码function [result,m,n] = GetSelfMultiplyResult(list)% 计算矩阵与其转置矩阵的乘积% 测试返回多个结果result = list*list';[m,n] = size(result);End算法2:矩阵各元素平方运算function result = GetSelfSquareResult(list)% 计算矩阵各元素平方后的结果result = list.^2;end2.3Matlab生成dll文件1.应用程序里面找到Library Compiler应用程序。
2.进入Library Compiler工程应用界面3.配置如下1)选择目标类型(TYPE);2)添加需要打包的函数文件;3)重命名库名称。
(注:Class1 改的名字不能与Matlab 的函数名字一样)4.文件生成CalcMatResult.dll CalcMatResultNative.dll 两个dll文件,均可使用。
Matlab 调用Fortran Dll数组传递范例
Matlab 调用Fortran Dll数组传递范例
1、Fortran代码
test.f90
SUBROUTINE add(outdata,indata)
!DEC$ ATTRIBUTES C,DLLEXPORT :: add
!伪注释说明test.dll文件中包含一个名为add的子例行程序,C即为按C 调用约定输出
IMPLICIT NONE
REAL outdata(2),indata(3)
outdata(1)=indata(1)-indata(3)
outdata(2)=indata(2)+indata(3)
ENDSUBROUTINE
2、.h代码
test.h
void add(float*, float*);
//该代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test_c.h。
其实,每一个dll文件可包含多个子例行程序,那么在书写头文件代码时,就需要对应书写多个void代码。
3、Matlab代码
test.m
clc; clear all;
loadlibrary('test.dll','test.h');
x=[0,0];indata=[1,2,3];
outdata=calllib('test', 'add', x,indata);
%调用test.dll文件里的add子例行程序
%x虽然对应Fortran里的输出(指针),但它并不返回值
%outdata才是返回的值,输出在输入前面(如果仅输出一个数组的话)unloadlibrary test。
VS2015C++调用MATLAB2018b生成的dll并输出结构体
VS2015C++调⽤MATLAB2018b⽣成的dll并输出结构体1、输⼊字符串,输出字符串m⽂件内容function imginfo = dllTest2(MInterface)%UNTITLED 此处显⽰有关此函数的摘要% 此处显⽰详细说明imginfo = MInterface;end调⽤程序:mclmcrInitialize();const char* args[] = { "-nojvm" };const int count = sizeof(args) / sizeof(args[0]);if (!mclInitializeApplication(args, count)){return;}if (!dllTest2Initialize()){return;}mwArray nwOut;string pImg = "O3543.jpg";mwArray mImg(pImg.data());dllTest2(1, nwOut, mImg);string aa;aa = nwOut.ToString();dllTest2Terminate();//终⽌调⽤mclTerminateApplication();// terminate MCR2、输⼊结构体,输出结构体m⽂件:function imginfo = dllTest3(MInterface,ImgPath)%UNTITLED 此处显⽰有关此函数的摘要% 此处显⽰详细说明CropID=MInterface.CropID;PeriodID=MInterface.PeriodID; = CropID;imginfo.imageResolution = '3000,2000';imginfo.stageflag = PeriodID;end调⽤程序:mclmcrInitialize();const char* args[] = { "-nojvm" };const int count = sizeof(args) / sizeof(args[0]);if (!mclInitializeApplication(args, count)){return ;}if (!dllTest3Initialize()){return;}struct MyStruct//声明结构体{string pStationID;string pCropID;};MyStruct mys;mys.pStationID = "012345";mys.pCropID = "123";//声明wmArray结构体矩阵const int nFiields = 2;//结构体内的变量个数const char* fieldnames[2] = { "CropID","PeriodID"};//结构体内的变量名称(变量名需与m⽂件的变量名⼀致)mwArray nwStruct(1, 1, nFiields, fieldnames);//声明⼀个wmArray类型变量//wmArray赋值mwArray mStationID(mys.pStationID.data());nwStruct(fieldnames[0], 1, 1) = mStationID;mwArray mCropID(mys.pStationID.data());nwStruct(fieldnames[1], 1, 1) = mCropID;string pImg = "O3543.jpg";mwArray mImg(pImg.data());//输出mwArray 结构体矩阵const int nOutFields = 3;const char* Outfieldnames[3] = { "name","stageflag","imageResolution" };mwArray nwOut(1, 1, nOutFields, Outfieldnames);dllTest3(1, nwOut, nwStruct, mImg);//执⾏dllfor (int i = 0; i < 16;i++)//读取矩阵数据{mwArray ww = nwOut(Outfieldnames[i], 1, 1);string r;r = ww.ToString();}dllTest3Terminate();//终⽌调⽤mclTerminateApplication();// terminate MCR。
c++调用matlab函数
一、问题描述有关在C++程序中使用MATLAB编译产生的动态链接库DLL,看了好多帖子,感觉描述的不尽详细,调试过程费了好多劲,现在用文字和图片的形式记录一下自己学习的过程。
MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。
这里以调用C++接口的DLL中的函数为例来介绍。
在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。
所以问题归结为如何在C++程序中使用mwArray。
在这个例子中,输入输出都是矩阵,至于标量,可以作为矩阵的一行或一列传递。
二、实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。
为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。
三、实现环境:Windows xp 2002 sp3Matlab 2008b 安装路径:D:\Program Files\MATLAB\R2008bVs 2008 sp1 安装路径:D:\Program Files\Microsoft Visual Studio 9.0四、配置matlab生成dll文件:1.在matlab 中选择C++编译器>> mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?nSelect a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005[5] Microsoft Visual C++ 2005 Express Edition[6] Microsoft Visual C++ 2008[0] NoneCompiler: 6The default location for Microsoft Visual C++ 2008 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? nPlease enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0Please verify your choices:Compiler: Microsoft Visual C++ 2008Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? Y******************************************************************* *********Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.******************************************************************* *********Trying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone . . .>>2.编写m文件编写myadd2.m文件(如下),保存在D:\My Documents\MATLAB目录下;同时把该目录设置为matlab当前目录。
C#调用MATLAB生成的dll
C#调用Matlab生成的dll1.1操作环境操作系统●Win7(32位)必需软件:●Matlab R2015a●Visual Studio2012(包含Visual C#和Visual C++)●Net Framework4.0以上1.2操作步骤首先Matlab的打包工具,把Matlab函数打包为dll文件。
然后在C#中,引用生成的dll 文件,并在程序中调用dll中的函数。
下面分步骤介绍:1.2.1路径设定在F盘新建一个名为Matlab的文件夹;启动Matlab.exe,在命令窗口输入pathtool,会弹出如下对话框。
点击【Add Folder】,选择刚才的文件夹即可。
关闭对话框后,在命令窗口输入userpath(‘F:\Matlab’)。
按回车设定完毕。
1.2.2M文件创建在Matlab中新建一个M文件,写入如下函数代码,保存为F:\Matlab\gougu.m。
function w=gougu(a,b)w=a*a+b*bend1.2.3打包生成dll在Matlab命令窗口输入deploytool,弹出如下选项,选择“Library Compiler”出现打包程序窗口界面:在窗口中进行如下选择:Type:.Net AssemblyExplored Functions:选择刚才做好的gougu.m文件Packaging Options:勾选上面的复选框,取消勾选下面的复选框。
填写Library Information各项最后,点击窗口右上角的Package按钮,一直等待到提示打包完成。
打包结束后,会在文件夹中看到生成了的dll文件,路径为“F:\Matlab\gougu\for_redistribution_files_only\gougu.dll”。
1.2.4C#调用dll在Visual Studio2012中,新建一个C#控制台程序或者WinForm应用程序,本例创建的是窗体应用程序,在默认窗体上放入一个标准按钮button1。
在VB开发环境中调用由MATLAB函数转化的DLL
第25卷总第53期 西北民族大学学报(自然科学版)Vol.25,No.2 2004年6月 Journal of N orthw est U niversity for N ationalities(Natural Science)J une,2004在VB开发环境中调用由MA TLAB函数转化的DLL冯 旭(西北民族大学现代教育技术学院,甘肃兰州730030)[摘 要]VB是一个高效快速的软件开发平台,但在进行数值计算需要编写大量的代码,还需要反复调试以保证其可靠性和稳定性1通过编写DLL,只须少量代码,并且MA TLAB的算法是经过商业化的考验,比较可靠,省去了许多软件维护费用1特别是要编写一些复杂的算法,例如,大型稀疏矩阵、大型线形方程组的解法、微分方程及偏微分方程的解法等等,并在此基础上开发更复杂的算法,该方法的优越性将更加明显1[关键词]MA TLAB;MIDEVA;Matcom4;VB;DLL[中图分类号]TP311 [文献标识码]A [文章编号]1009-2102(2004)02-0065-03Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件,适合于科学和工程技术人员使用的计算语言,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境1它还包括了ToolBox(工具箱)的各类问题的求解工具,可用来求解特定学科的问题,其基本元素是一个为数不限的复矩阵,并完成了对矩阵运算效率的优化1MA TLAB采用M-语言进行编程,在程序执行过程中对M-文件进行解释,程序结构完整,但不能脱离其环境运行,因此它不能被用于开发商用软件1Visual Basic开发平台提供了开发Windows应用程序最迅速、最简洁的方法,特别在我国VB拥有非常广泛的用户群体1但VB的数值计算功能并不十分强大,往往一个简单的算法就需要很多代码完成,更何况复杂的矩阵运算,因此很多人由于这方面原因而放弃使用VB,造成不必要的资源浪费1为了使VB,最大限度地发挥MA TLAB功能,同时脱离MA TLAB这一庞大的运行环境,本文将介绍MA TLAB函数即M-文件如何转换到DLL以及如何在VB中调用这一类动态库1本文开发环境为MA TLAB6.0、M IDEVA4.5、Matcom4.2、VB6.011 VB与MA TLAB混合编程方式VB与MA TLAB结合在一起编程的方式主要有以下几种:(1)利用组件对象模型即COM规范,自动化Automation协议,通过引擎(Engine),采用客户机/服务器(Client/Server)模式进行通信1实际应用中,VB作为前端客户机通过引擎调用作为Automation服务器端的MA TLAB1但这种方式需要MA TLAB在后台实时运行,不能生成独立运行的应用软件包,因此,在软件开发中很少使用1(2)利用Matlabvbtrix1Matlabvbtrix是Math Tools公司(已被MathWorks收购)专门为VB开发环境提供的一个COM接口,主要包含MA TLAB中常用的500多个函数,但用户也仅限于使用这些函数,不能随意编写[收稿日期]2004-04-15[作者简介]冯旭(1970—),男,工程师,主要研究方向:计算机网络与工程1——56自己的M文件1而Matlab最重要的特点是易于扩展,因此应用范围也受到限制1(3)通过DLL实现二者的结合1用户不仅可以使用Matlabvbtrix所提供的MA TLAB基本函数,还可以在MA TLAB中随意编写自己的M-文件,对于一个从事特定领域的工程师来说,还可方便地构造出专用的函数,从而大大扩展了Matlab的应用范围1然后通过M IDEVA转化为VB可调用的DLL,就可以开发出独立的应用程序12 M-文件转化为DLL本文将一个M-文件转换成一个VB可调用的DLL,如果利用MA TLAB编译器,操作的过程很繁琐,需要很多设置1利用Math Tools公司产品Mideva可以大大简化这一过程1以前也有文章介绍这方面操作,由于当时Mideva版本较低,生成DLL仍需要大量的设置,Mideva4.5大大简化了这些过程1操作步骤如下:启动运行Mideva,点击菜单File/Compile to dll,选择要转化的M-文件1这里要转化的M -文件必须是能够作为函数被其他开发环境调用的M-文件,假设文件名为mymfile.m如果要编译M -文件是没有输入也没有输出的脚本文件,可以现将其编辑成无输入无输出的函数1事先可以在Mideva的环境下进行设置,即在菜单Configuration中配置编译的参数为Debug模式或Release模式1转换完成后,可以看到在对应的Debug或Release目录下,有许多编译生成的文件1在VB开发环境中需要用的文件有3个:mymfile.dll(DLL文件)、mymfile.bas(在VB中声明DLL的模块文件)、mymfile. cls(类模块文件,调用DLL的接口)1为了在VB中能够调用生成的DLL,需要将mymfile.dll拷贝到System或者System32目录下;将mymfile.bas、mymfile.cls拷贝到VB当前工程目录下13 VB中调用DLLVB中调用DLL实际是调用mymfile.cls接口,然后通过该接口实现调用System目录下的DLL,这是Mideva4.5新增加的功能,以前在要调用DLL,必须通过矩阵句柄进行,很不方便1准备工作很简单,只需将mymfile.bas和mymfile.cls文件加入到VB当前工程,为了能应用强大的矩阵运算功能,客户端还需安装Matlabvbtrix14 实例分析该例子旨在说明如何在Mideva中生成动态链接库,以及如何在VB中调用生成的DLL1问题:求两个矩阵的和与差1)先在MA TLAB编写程序mymfile.m%mymfile.m实现矩阵的和与差function[ADD,ODD]=mymfile(A,B);ADD=A+B;ODD=A-B;2)用Mideva将mymfile.m转化成mymfile.dll,同时生成VB需要的文件mymfile.bas和mymfile. cls3)将mymfile.bas和mymfile.cls加入到VB工程中;并且在VB工程中引入Matlabvbtrix,过程为点击菜单Project,选择Reference,在Reference对话框中复选Mmatrix,O K14)选择一个窗体,加入一个按钮1为按钮编写单击事件函数为: Private Sub Command1-Click() Dim inputnatrix(0To1),E inputnatrix(0)=ones(2,2) inputnatrix(1)=zeros(2,2) E=mymfile(myinput)——66 E(1).Show E(2).Show End Sub注意:所调用函数自变量数组下标界从0开始,而返回矩阵数组下标从1开始15)调试通过,打包整理,完成一个独立运行的应用软件包15 关于工具箱函数为了在VB中充分利用MA TLAB工具箱诸如自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等的强大功能,在编写含有这些工具箱函数的M-文件时,必须将这些函数完全展开,即将实现这些函数的M-文件拷贝到自己要编写的M-文件中,这样在应用时不至于遇到编译错误1作者成功在VB中调用神经网络工具箱函数,由于篇幅所限,不在此详细说明,大家可以根据自己实际需要参照进行16 小结VB是一个高效快速软件开发平台,但在进行数值计算需要编写大量的代码,还需要反复调试以保证其可靠性和稳定性1通过编写DLL,只须少量代码,并且MA TLAB的算法是经过商业化的考验,比较可靠,省去了许多软件维护费用1特别是要编写一些复杂的算法,例如,大型稀疏矩阵、大型线形方程组的解法、微分方程及偏微分方程的解法等等,以及在此基础上开发更复杂的算法,该方法的优越性将更加明显1但以前提供的类似方法都需要很多设置和烦琐的规定,不易上手,本文介绍的方法是目前VB调用M-文件转化来的DLL最简便的1可以看出这是一种时间、效率上的极好的折衷,它使得你可以将更多的时间放在项目关键问题的思考上,对于广大工程技术人员的开发工作是十分有益的1参考文献:[1]李仁厚,张平.精通MA TLAB-综合辅导与指南[M].西安:西安交通大学出版社,1999.[2]王颖,胡宗军.ActiveX:从Visual Basic6.0调用MA TLAB的实现方法[M].机电工程,19991172-174.[3]How do I call a Compiler generated stand-alone DLL from my Visual Basic application in MA TLAB6.0(R12)www./support/solutions/data/28621.shtm1[4]Steven Holzner.Visual Basic6技术内幕[M].北京:机械工业出版社,1999.C alling a MAT LAB-G enerated Dynamic LinkLibrary in Visu al B asic ProgrammingFENG Xu(Modern Education Technology College Northwest Minorities University,Lanzhou G ansu730030,China)[Abstract]This paper compares the means by which Visual Basic programs call MA TLAB function firstly, then accounts for how to compile a MA TLAB function into a stand-alone DLL and how to call the DLL in VB Programming.The method makes use of the advantages of VB and MA TLAB fully,supplys a power2 ful technical support for the exploitation of application software fasty and effectively.[K ey w ords]MA TLAB;M IDEVA;Matcom;VB;DLL——76。
手把手教你在Qt平台上调用Matlab函数
手把手教你在Qt平台上调用Matlab函数大家好,我是宁静致远。
在日常的Qt开发中,我们常常会遇到一些复杂的数学计算问题,比如信号处理、图像识别等。
虽然Qt提供了一些数学库如QtMath,但是跟Matlab相比,无论是在功能的全面性还是在语法的简洁性上,都有不小的差距。
作为一名科研工作者,我非常依赖Matlab的数学建模能力。
但是Matlab在界面编程方面却有诸多不便。
那么,能不能把Matlab强大的数学功能与Qt优秀的界面能力结合起来呢?答案是肯定的!接下来,我就将详细介绍如何在Qt平台上调用Matlab函数,实现二者的完美融合。
Qt调用Matlab函数的几种方式总的来说,Qt调用Matlab函数有三种思路:1. 将Matlab函数编译成C/C++代码,然后在Qt工程中直接调用编译后的代码。
这种方法移植性最好,但是需要将Matlab代码翻译成C/C++,工作量较大。
2. 将Matlab函数编译成动态链接库(DLL),然后在Qt中调用DLL中的函数。
这是本文采用的方法。
3. 在Qt中通过命令行调用Matlab,传入数据文件并接收结果文件。
这种方法灵活性最高,但是需要在用户的电脑上安装Matlab,适用性略差。
可以看到,第二种方法在灵活性和适用性上达到了较好的平衡,因此是我们的首选。
环境准备在开始实践之前,我们需要准备好开发环境:Matlab 2020bQt 5.14.2MinGW 64位编译器这里需要注意的是,在编译Matlab生成的DLL时,一定要与Qt使用的编译器保持一致,否则会产生链接错误。
由于Qt默认使用的是MinGW编译器,因此我们在Matlab中也要选择MinGW编译器。
如果你习惯使用MSVC编译Qt程序,那么也要在Matlab中选择MSVC编译器。
总之,一定要做到前后一致。
实践步骤接下来,让我们一起来实践Qt调用Matlab函数的完整步骤。
第一步:创建Matlab函数首先,我们要在Matlab中创建一个函数。
C#中调用matlab程序
1,在matlab中建一个m文件(test.m)例如:function test(h,D)for x=-10:0.1:10,if x>Dy=h;hold on;plot(x,y)elseif x<-Dy=-h;hold on;plot(x,y)elsey=h/(D*x);hold on;plot(x,y)endend在MATLAB R2007a中输入deploytool命令(在matlab6.5中输入comtool),打开Matlab Bui ld For .net窗口新建个工程,在此工程中“Add files”即填加test.m这个文件,build即可生成COM组件,为test.dll,即为我们将在C#中引用的COM组件。
Build时matlab已经自动将此dll在注册表中注册不过之前我们还需做一个准备工作,打开开始菜单“运行”,输入regsvr32 "matlab安装路径\ bin\win32\mwcomutil.dll",即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com 组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。
2,下面即可在C#中调用dll文件:"引用"右击,选择浏览,找到test.dll,添加。
"引用"右击,选择浏览,找到MWArray.dll(matlab安装路径\toolbox\dotnetbuilder\bin\win32\ v2.0\MWArray.dll),添加。
再写入以下代码:test.testclass st = new test.testclass();.Arrays.MWArray m = 1, n = 2;st.test(m,n);我们的c++程序有很多种方法调用Matlab中的函数,但是我最喜欢的方法是直接调用Matlab的动态库,这样生成的程序在没有安装Matlab 的机子上也可以运行。