MATLAB调用C++DLL

合集下载

MATLAB调用C程序、调试和LDPC译码过程详解

MATLAB调用C程序、调试和LDPC译码过程详解

MATLAB调用C程序、调试和LDPC译码过程详解MATLAB是一个很好用的工具。

利用MATLAB脚本进行科学计算也特别方便快捷。

但是代码存在较多循环时,MATLAB运行速度极慢。

如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行,可以考虑将循环较多的功能采用C编写,MATLAB调用。

本文将概述这一过程。

虽然本文以LDPC译码算法为例,但不懂该算法不影响本文阅读。

1. 起因最开始用MATLAB写的LDPC译码算法中,其中一个版本是这里,里面有三重循环,运行速度极慢。

后来考虑了MATLAB的向量化操作,通过算法的合理划分以及内置函数调用,成功将三重循环修改为1层,具体这一版本的代码可见这里。

通过这一手段,函数的运行速度提高了几倍乃至几十倍。

虽然这一方法下运行速度依旧比不过MATLAB工具箱中的comm.LDPCDecoder,远比不上利用GPU的comm.gpu.LDPCDecoder,但胜在可明确算法并具有一定扩展性。

起初也注意到可以通过MATLAB调用C程序来加速程序运行,但向量化后的代码凑活能用,加上有时也可调用更为强大的内置函数,这一想法一直没有付诸实践。

这几天想好好整理一下代码,遂萌发了写一个C版本译码算法的想法。

代码现在的状态是“能用”,这里把相关经验总结分析在此。

2. MATLAB调用C程序这一部分的内容在刘晓辉的matlab调用C程序中已经有较为详细的介绍了,想要正确调用C程序,关键概括为2点。

机器上装有MATLAB编译器,可通过在MATLAB命令行窗口输入mex -setup进行具体设置。

有一个正确的接口子程序mexFunction完成MATLAB和C程序之间的数据转换和程序调用这里给出我写得mexFunction(注意这个代码写得不好,没有任何判断,没有健壮性……)void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){ double* llr = (double*)mxGetPr(prhs[0]);int* rownum = mxGetPr(prhs[1]);int* colnum = mxGetPr(prhs[2]);int* trans = mxGetPr(prhs[3]);double* state = mxGetPr(prhs[4]);plhs[0]= mxCreateDoubleMatrix(1,state[1],mxREAL);double* r =mxGetPr(plhs[0]);ldpcDec(r ,llr,rownum,colnum,trans,state);}mexFunction的规范在刘晓辉的matlab调用C程序一文中已有提及,即nlhs:输出参数数目plhs:指向输出参数的指针nrhs:输入参数数目prhs:指向输入参数的指针例如,在matlab命令行中使用[a,b]=test(c,d,e)调用mex函数test时,传给test的这四个参数分别是2,plhs,3,prhs其中:prhs[0]=cprhs[1]=dprhs[2]=e由此可以解释上述mexFunction,而命令plhs[0]= mxCreateDoubleMatrix(1,state[1],mxREAL)则定义了一大小为1 ×state[1]的矩阵,做为函数的返回值。

MATLAB编译并调用C、C++程序

MATLAB编译并调用C、C++程序
窗口中,输入: >>mex test.cpp ,若程序有错,会有提示,若无错,
会在 test.cpp 的旁边生成 test.mexw32 文件,这个文件可以供 MATLAB
调用实现 test.cpp 中的 C、C++函数的功能。
在 MATLAB 中调用 C、C++程序:
将 MATLAB 的工作目录切换至上面已编译好的 test.mexw32 所在的目
}
dbX = mxGetScalar( prhs[ 0 ] ); dbY = mxGetScalar( prhs[ 1 ] );
/* Create matrix for the return argument. */ plhs[0] = mxCreateDoubleMatrix( mrows, ncols, mxREAL ); plhs[1] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );
mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if ( mxIsComplex(prhs[0]) ||
!(mrows == 1 && ncols == 1)) {
mexErrMsgTxt("The First input must be a noncomplex scalar double precision.");
/* Assign pointers to each input and output. */ pdbA = mxGetPr( plhs[0] ); pdbG = mxGetPr( plhs[1] );
Desc2Pol( dbX, dbY, pdbA, pdbG ); }

Matlab函数制作Dll后C二次开发封装DLL(VS2013)

Matlab函数制作Dll后C二次开发封装DLL(VS2013)

Matlab函数制作Dll后C⼆次开发封装DLL(VS2013)前⾔:Matlab算法丰富,直接可以拿来使⽤,但是⼜不熟悉m语⾔或者要求效率⾼的代码,内部函数封装Dll后C⼆次处理封装dll⼀、Matlab⽣成DLL备注:配置环境变量(很重要,否则编译会出现“找不到libmx.dll⽂件”):D:\Install\MatLab\bin\win64;(路径参考,实际安装位置,默认软件⾃动设置环境变量)在matlab命令⾏输⼊mex -setup,按提⽰选择合适的选项。

在matlab命令⾏输⼊mbuild -setup,按提⽰选择合适的选项。

以上配置只需进⾏⼀次就可以了,不必每写⼀个程序都重复⼀遍。

1、命令⾏输⼊deploytool可弹出对话框,选择“Library Complier”2、“TYPE”选择制作的库(C++ Shared Library),“EXPORTED FUNCTIONS”中选择需要转化成动态链接库的Matlab.m⽂件,添加完成后在Library Name编辑框中输⼊你想给Dll⽂件命名的名称。

然后点击下⾯Package即可完成转化。

注:⽣成的dll拷贝到另⼀台电脑需要对应版本的MATLAB Runtime组件(MCR)。

⼆、VS2013 C⼆次封装DLL1、点击“新建项⽬”创建“Win32控制台应⽤程序”2、选择DLL,空项⽬3、点击源⽂件,创建⼀个main.c⽂件4、点击⼯程属性页,“配置管理器”可创建64位平台DLL(根据需要)。

5、配置VS2013属性表(Matlab库依赖,调⽤matlab引擎)项⽬属性 - 配置属性 - VC++⽬录 -包含⽬录:D:\Install\MatLab\extern\include;(路径参考)库⽬录:D:\Install\MatLab\extern\lib\win64\microsoft;(路径参考)项⽬属性 - 配置属性 -链接器 - 输⼊ - 附加依赖项:libmx.lib;libmat.lib;libeng.lib;mclmcr.lib;mclmcrrt.lib;libmex.lib或者也可通过#pragma comment( lib, "mclmcrrt.lib" )指令在C⽂件中附加依赖项。

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。

本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。

第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。

前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。

关于MCR,请见第四章的说明。

至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。

下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

Matlab调用c语言程序代码

Matlab调用c语言程序代码

Matlab调用c程序方法:第一步:要先在matlab中安装c程序编译器,步骤如下:键入命令:mex -setup;选择c/c++编译器;选择c/c++编译器版本;确认。

第二步:键入:mex *.c实例介绍:【转】如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) {return x + y;}现在我想要在Matlab中使用它,比如输入:>> a = add(1.1, 2.2)3.3000要得出以上的结果,那应该怎样做呢?解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。

MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。

可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。

该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。

所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。

比如该C文件已写好,名为add.c。

那么在Matlab中,输入:>> mex add.c就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows 中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。

现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。

所以,通过MEX文件,使用C函数就和使用M函数是一样的了。

(完整版)matlab和c++调用DLL方法

(完整版)matlab和c++调用DLL方法

(完整版)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#includeusing 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;< bdsfid="98" p=""></r<<endl;<>FreeLibrary(hDLL);return 0;}三、Matlab调用DLL通常matlab调用DLL有两种方法,一种是用mex文件,另一种是用matlab的函数。

Matlab调用VC生成的dll的具体步骤

Matlab调用VC生成的dll的具体步骤

Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)1创建项目: Win32->Win32项目,名称:MyDLL2新建头文件testdll.h,并编写相关程序注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。

具体程序如下#ifndef MATLABDLLTEST_H#define MATLABDLLTEST_H#ifdef __cplusplusextern "C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3新建源文件testdll.cpp,并编写相关程序具体程序如下所示:#include "stdafx.h"#include "testdll.h"double add(double x, double y){return (x+y);}4新建模块定义文件mydll.def,并编写相关程序二、Matlab调用生成的dll1、编译器准备1)在Matlab的命令窗口输入:mex -setup2)选择你的编译器,我的是:[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.02、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数具体程序clc;clear all;close all;addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件libfunctionsview lib %执行此命令后会生成如下窗口calllib('lib', 'add', 1.0,2.0)%只有出现上述窗口才能使用此命令参考链接:1、/s/blog_70b3b3a701015e98.html(此文忘记加模块定义文件mydll.def,而且在Matlab读取路径是的指令也是错误的,参考本文的指令就能跑通)2、/g710710/article/details/7255744(此链接的文章是VS生成dll的方法,但如果想用Matlab调用生成的dll在编写头文件时一定要用上文的编写指令,而不这篇链接里的指令,因为链接里的指令是生成C++的指令,而Matlab只识别C的写法)。

MATLAB Compiler 是MATLAB自带的一个编译器

MATLAB Compiler 是MATLAB自带的一个编译器

MATLAB Compiler是MATLAB自带的一个编译器,它能将m文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。

MATLAB 6.5使用的编译器包括了MATLAB的C\C++数学库函数以及图形库。

动态链接库(dll)是编写软件中常用的一种技术,MATLAB 提供了将M文件编制成dll文件的方法,本文就介绍如何在MATLAB6.5中将m 文件z转化成dll文件,然后在VC中调用该dll文件。

1、必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需、要使用mex-setup和mbuild-setup两个命令对编译器进行配置,如果以前已经进行了配置就不需要这一步。

2、设置头文件和库文件的路径,可以参考精通VC与MATLAB联合编程<六>,配置完成如图1和图2:图1图2读者根据MATLAB安装实际情况输入头文件和库文件的路径。

3、在MATLAB打开文本编辑器(File->New->M-file)写一个简单的m函数:function y=huatu_test()x=-10:0.1:10;y=sin(x);plot(x,y,'*')文件保存为huatu_test.m。

4、在MATLAB命令窗口用如下命令生成dll文件和调用dll所需要的文件:mcc-t-W libhg:dlltest-T link:lib-h libmmfile.mlib huatu_test.m生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录\work,找到dlltest.h、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。

5、在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为"测试"的button按钮。

将dlltest.h、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project->Add To Project->Files选择拷贝到当前目录下的三个文件,将文件引入工程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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:
clc
clear
tic
x = 1.6;
y = 2.7;
Test_add = Test(x, y)
toc
6、run这个脚本.MATLAB调用C++动态库就成功了….
Author : Li Jun
Date :2012-03-26。

相关文档
最新文档