matlab 调用c代码,Matlab与C/C++联合编程之从Matlab调用C/C++代码

plhs[]与prhs[]都是指针数组,也就是说它是个数组,每个元素都是一个指针,这些指针指向的东东的类型是mxArray。那什么是mxArray呢?可以把他理解MATLAB中的矩阵,因为MATLAB中所有数据都是以矩阵的形式保存的。

先讲prhs[],就是输入的参数,prhs[0]指向a,prhs[1]指向b,但是注意不能用*(prhs[0])得到a的值。因为 prhs[0]指向的东西的类型是mxArray(参数列表里看出),想把它的值以我们常用的数值形式赋给一个标量(Scalar),得使用 mxGetScalar()函数转化一下:

double a, b;

a = mxGetScalar(prhs[0]);

b = mxGetScalar(prhs[1]);

plhs对应的输出的内容。plhs[0]这个指针指向输出的第一个参数,就是c=add(a, b)中的c了。记住这个c应该是以mxArray的类型出现的,为了得到mxArray类型的输出量,要使用mxCreateDoubleMatrix()函数,它创建一个指向mxArray类型的指针。

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

参数(1, 1, mxREAL)定义了对应c的尺寸类型,MATLAB中c是以1×1的实数矩阵形式报保存的。

而使用mxGetPr()函数可以得到plhs[0]指向的mxArray的第一个double类型的指针。

double *c;

c = mxGetPr(plhs[0]);

最后调用add()函数

*c=add(a,b);

(a) 在Matlab命令窗口输入命令

mex MyMEXFun.c

可以看到在当前目录生成新文件MyMEXFun.mexw32。在命令窗口中输入c=MyMEXFun(3,4)命令,可得到c=7。

(b) 对程序的调试有两种方法,第一种要借助相应语言的开发环境进行调试,只需要把mex 源文件文件在 Matlab 环境下编译的时候加上 debug 选项即可,例如我们编译一个名字为MyMEXFun.c的 mex 源文件,可以在 Matlab 的 command 窗口输入命令mex –g –v MyMEXFun.c即可。

(2) 在windows 环境下的调试方法。

打开VS2010->File->New->Project->VisualC++->MFC->MFC DLL,新建MFC DLL工程,选择DLL类型为Regular DLL with MFC statically linked,工程名为MexDemo。

为工程添加MyMEXFun.c文件,文件内容与上面相同。

打开文件MexDemo.def,在def文件的EXPORTS项添加mexFunction一行。

右键MexDemo->Properties->VC++Directories->Include Directories,添加目录:C:\ProgramFiles (x86)\MATLAB\R2011b\extern\include和目录C:\ProgramFiles (x86)\MATLAB\R2011b\extern\include\win32

右键MexDemo->Properties->VC++Directories->Library Directories,添加目录:C:\Program Files (x86)\MATLAB\R2011b\extern\lib\win32\microsoft

右键MexDemo->Properties->linker->input中增加Additional Dependencies中增加libmx.liblibmex.lib libmat.lib。

右键MexDemo->C/C++->Preprocessor中增加MATLAB_MEX_FILE

在Linker下output中将后缀改为mexw32,即$(OutDir)\$(ProjectName).mexw32

在需要的地方加入#include “stdafx.h”。

用Ctrl+Alt+P附加调试环境到Matlab,在Matlab中将当前目录更改为生成MyMEXFun.mexw32所在目录,在Matlab命令窗口输入函数调用语句,即可开始调试。

调用C/C++动态连接库

Matlab提供对动态连接库DLL文件的接口。利用该接口,可在Matlab中调用动态连接库导出的函数。Matlab对DLL的接口支持各种语言编写的DLL文件。在调用DLL文件之前,需要准备函数定义的头文件。对于C/C++语言开发的DLL文件,可使用源程序中相应的头文件;而对于其他语言开发的DLL,则要手工准备等效的C语言函数定义头文件。

在Matlab中利用动态连接库接口技术通常需要完成以下4个步骤:

(1)打开动态连接库文件;

(2)为调用函数准备数据;

(3)调用动态连接库文件中导出的函数;

(4)关闭动态连接库文件。

为了实现以上步骤,用到的Matlab函数有:loadlibrary,  calllib, libfunctions, lipointer, libstruct,libisloaded等。下面举例说明Matlab调用C/C++动态连接库的方法和步骤:

打开VS2010->File->New->Project->VisualC++->MFC->MFC DLL,新建MFC DLL工程,选择DLL类型为Regular DLL with MFC statically linked,工程名为Test1。

为工程添加a.cpp文件,内容为:

#include "a.h"

_declspec(dllexport)intadd(inta,intb)  {returna+b; }

为工程添加a.h文件,内容为:

_declspec(dllexport)intadd(inta,intb);

然后编译生成Test1.dll动态连接库文件,

将Test1.dll和a.h拷到Matlab 工作目录下。

在Matlab命令行下,调用Test.dll:

>>loadlibrary(‘Test1’,’a.h’);

>>x=7;

>>y=8;

>>calllib(‘Test1’,‘add’,x, y);

Ans=15

>>unloadlibrary(‘Test1’).0b1331709591d260c1c78e86d0c51c18.png

  • 2
    点赞
  • 2
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值