Matlab 拥有丰富的功能,编程简单。不过,有些情况下,Matlab程序的执行速度比较慢。C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些。因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速。

本文主要讲解如何在Matlab中调用C/C++的程序,以及如何编写可供Matlab程序调用的C/C++程序。

本文主要分以下几部分:

Hello Matlab,用一个简单的例子来说明如何在Matlab中调用C/C++的程序,以及可供Matlab调用的C/C++程序应该注意哪些基本事项。

Matlab调用C/C++程序传递参数。讨论在C/C++中是如何使用Matlab传来的参数的。

Matlab与C/C++混合编程的方法论。给出在一般情况下使用Matlab与C/C++混合编程的方法步骤,让大家有一个较为清晰的应用此技术的思路。

关于数据存储的说明。说明数据在Matlab中的存储方式。

注意:本文认为读者会使用Matlab,掌握C/C++语言,并且有一台计算机。计算机上安装有Windows的操作系统,操作系统上装有Matlab以及Visual Studio(比如VS2008,VS2010等)。或者计算机上安装有Linux的操作系统,系统上装有Matlab,GCC。

hello Matlab

我们一步步完成一个叫“Hello Matlab”的程序。

第一步:在你的计算机D盘下,创建一个目录命名为HiMat。在D:\HiMat目录下创建一个文本文件,命名为“abhimat.cpp”。将Code 1中的代码拷贝到“abhimat.cpp”文件中,保存。(注意,这里建立目录以及命名等行为不是规定的,只是为了讲解方便)。

第一步:在你的计算机D盘下,创建一个目录命名为HiMat。在D:\HiMat目录下创建一个文本文件,命名为“abhimat.cpp”。将Code 1中的代码拷贝到“abhimat.cpp”文件中,保存。(注意,这里建立目录以及命名等行为不是规定的,只是为了讲解方便)。

[cpp] view plaincopy print?
  1. #include "mex.h"
  2. void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  3. {
  4. mexPrintf("hello matlab in C/CPP.\n");
  5. }
#include "mex.h"
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{mexPrintf("hello matlab in C/CPP.\n");
}
Code 1, abhimat.cpp

“abhimat.cpp”就是将要在Matlab中被调用的C/C++代码。

第二步:在Matlab中编译“abhimat.cpp”。启动Matlab,进入D:\HiMat目录,在Matlab命令窗口中执行code 2中的命令,根据提示完成C/C++编译环境的配置。注意:如果你有多个编译器,建议选择最新的。

[plain] view plaincopy print?
  1. mex -setup
mex -setup
Code 2, 设置Matlab的C/C++编译环境

完成配置后,在Matlab中执行Code 3的命令来编译abhimat.cpp。

[plain] view plaincopy print?
  1. mex abhimat.cpp
mex abhimat.cpp
Code 3, 编译abhimat.cpp

第三步:执行编译后的C/C++程序。在Matlab命令窗口输入“abhimat”或者”abhimat()”,都可以调用编译后的程序,推荐使用后者。

细心的读者已经注意到了:

  • 在Matlab中调用的C/C++函数名就是编译后以mex*(这里,*表示任意多个字符,例如mexw64)为后缀名的文件名。
  • Matlab执行abhimat()命令后,实际执行的是mexFunction函数中的程序。

Matlab调用C/C++程序传递参数

此节我们讨论下,在供Matlab调用的C/C++程序中,我们是如何知道Matlab调用的参数类型、个数的。

给出Matlab中调用C/C++程序的一个实例,如code 4所示。

[plain] view plaincopy print?
  1. c = [1 2;3 4;5 6];
  2. d = [1 1;1 1;1 1];
  3. [a, b] = abfunc(c, d);
c = [1 2;3 4;5 6];
d = [1 1;1 1;1 1];
[a, b] = abfunc(c, d);
Code 4, Matlab调用C/C++程序实例

下面的工作是如何在当前目录下一个命名为abfunc.cpp的文件中实现mexFunction函数。在这个函数中如何获得Matlab命令中的c、d两个变量的值,如何返回a、b两个变量呢。

注意mexFunction函数中的四个参数,一一作出说明:

nlhs:mexFunction的第一个参数,它指示Matlab的调用命令中等号左侧有几个变量。例如,code 4中的调用,nlhs的值为2,因为它的等号左侧有两个变量,他们是a和b。

plhs: mexFunction的第二个参数,它指示Matlab的调用命令中等号左侧变量的指针。例如,code 4中的调用,plhs[0]表示的是a,plhs[1]表示的是b。

nrhs:mexFunction的第三个参数,它指示Matlab的调用命令中等号右侧的变量个数。例如,code 4中的调用,nrhs的值为2,因为它的等号右侧有两个变量,他们是c和d。

prhs:mexFunction的第四个参数,它指示Matlab调用命令中等号右侧的变量指针。例如,code 4中的调用,prhs[0]表示的是c,prhs[1]表示的是d。

mxArrary是一个不可见的数据类型,是Matlab定义的,大家只需要知道mxArrary的指针与Matlab中的变量一一对应就可以了。

下面实现abfunc.cpp,功能是a=c+d; b = c-d;具体代码如code 5所示。

[cpp] view plaincopy print?
  1. #include "mex.h"
  2. void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  3. {
  4. double *p_c, *p_d;
  5. double *p_a, *p_b;
  6. int c_rows, c_cols;
  7. int d_rows, d_cols;
  8. int numEl;
  9. int n;
  10. mxAssert(nlhs==2 && nrhs==2, "Error: number of variables");
  11. c_rows = mxGetM(prhs[0]);// get rows of c
  12. c_cols = mxGetN(prhs[0]);// get cols of c
  13. d_rows = mxGetM(prhs[1]);// get rows of d
  14. d_cols = mxGetN(prhs[1]);// get cols of d
  15. mxAssert(c_rows==d_rows && c_cols==d_cols, "Error: cols and rows");
  16. // create output buffer
  17. plhs[0] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);
  18. plhs[1] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);
  19. // get buffer pointers
  20. p_a = (double*)mxGetData(plhs[0]);
  21. p_b = (double*)mxGetData(plhs[1]);
  22. p_c = (double*)mxGetData(prhs[0]);
  23. p_d = (double*)mxGetData(prhs[1]);
  24. // compute a = c + d; b = c - d;
  25. numEl = c_rows*c_cols;
  26. for (n = 0; n < numEl; n++)
  27. {
  28. p_a[n] = p_c[n] + p_d[n];
  29. p_b[n] = p_c[n] - p_d[n];
  30. }
  31. }
#include "mex.h"
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{double *p_c, *p_d;double *p_a, *p_b;int c_rows, c_cols;int d_rows, d_cols;int numEl;int n;mxAssert(nlhs==2 && nrhs==2, "Error: number of variables");c_rows = mxGetM(prhs[0]);// get rows of cc_cols = mxGetN(prhs[0]);// get cols of cd_rows = mxGetM(prhs[1]);// get rows of dd_cols = mxGetN(prhs[1]);// get cols of dmxAssert(c_rows==d_rows && c_cols==d_cols, "Error: cols and rows");// create output bufferplhs[0] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);plhs[1] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);// get buffer pointersp_a = (double*)mxGetData(plhs[0]);p_b = (double*)mxGetData(plhs[1]);p_c = (double*)mxGetData(prhs[0]);p_d = (double*)mxGetData(prhs[1]);// compute a = c + d; b = c - d;numEl = c_rows*c_cols;for (n = 0; n < numEl; n++){p_a[n] = p_c[n] + p_d[n];p_b[n] = p_c[n] - p_d[n];}
}
Code 5,  abfunc.cpp的实现

说明一下code 5中用到的函数。这些函数大都以mx开头。mxAssert是断言,类似于C\C++中的assert。mxGetM获得Matlab传来的变量的行数,mxGetN获得Matlab传来的变量的列数。mxCreateDoubleMatrix创建一个2维的Matlab变量,形参分别用于指定变量的行数、列数、元素类型(mxREAL表示实数,mxCOMPLEX表示复数)。mxGetData用于获得内存中数据块的首地址。

编译并测试Code 5中的代码,参见Code 6。

[plain] view plaincopy print?
  1. mex abfunc.cpp
  2. c = [1 2;3 4;5 6];
  3. d = [1 1;1 1;1 1];
  4. [a, b] = abfunc(c, d);
mex abfunc.cpp
c = [1 2;3 4;5 6];
d = [1 1;1 1;1 1];
[a, b] = abfunc(c, d);
Code 6, Code5的测试代码

Code 6的输出结果如下:

[plain] view plaincopy print?
  1. a =
  2. 2     3
  3. 4     5
  4. 6     7
  5. b =
  6. 0     1
  7. 2     3
  8. 4     5
a =2     34     56     7
b =0     12     34     5

关于数据存储的说明

Matlab中的数据是按列存储的。例如,a=[1,2;3,4;5,6],a的数据在内存中的存储顺序是:1、3、5、2、4、6。在C\C++中使用Matlab传来的变量时,一定要注意数据的存储顺序

Matlab与C/C++混合编程的方法论

鉴于@编程小手 的建议,添加一个关于使用此方法的方法论流程图。希望它能让各位明白在什么情况下可是使用这种混合编程的技术、如何一步步实现。参见图1的流程图:

图 1、Matlab与C/C++混编方法论流程图

另附:文中代码下载位置: http://download.csdn.net/detail/bendanban/7643701

C/C++与Matlab混合编程初探相关推荐

  1. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  2. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  3. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

  4. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  5. VS和matlab混合编程的推荐书籍!

    1. 精通MATLAB混合编程 丁毓峰

  6. C++和MATLAB混合编程-DLL篇

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  7. matlab求解多项式系数,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  8. MATLAB混合编程视频教程下载 SIMULINK系统仿真视频

    下载链接: http://item.taobao.com/item.htm?id=43401674106 精通MATLAB混合编程视频讲解  MATLAB各类函数视频讲解 基于MATLAB的高等数学问 ...

  9. VC与Matlab混合编程的快速实现(3-1)

    [原创]VC与Matlab混合编程的快速实现(3-1) 发信站: BBS 水木清华站 (Mon May 19 21:30:19 2003), 转信 3       在VC++中使用Matlab生成的动 ...

最新文章

  1. LeetCode实战:最长有效括号
  2. python3 操作redis
  3. 汇编: 更灵活的定位内存地址的方法
  4. mfc中主窗体显示(任务栏上方显示)
  5. python---[列表]lsit
  6. 洛谷P4389:付公主的背包(多项式、生成函数)
  7. GnuPG 的PGP使用
  8. 当跨国企业女职业经理人遇上创业女 CEO,两者会擦出什么样的火花?
  9. Devexpress VCL Build v2014 vol 14.2.6 发布
  10. Ubuntu安装jdk10
  11. C读取INI的代码实例
  12. 自学-Linux-老男孩Linux77期-day3
  13. 最佳网络工具--OpManager局域网管理软件
  14. Ubuntu安装、更新显卡驱动
  15. EBS R12.2 ADOP (R12.2 AD Online Patching) - 3
  16. Springboot实战项目完结篇之商城系统之收货地址管理
  17. 网易云音乐app用户个人中心(对比QQ音乐)
  18. 【毕业设计】基于单片机的红外测距系统设计与实现 - c51 物联网 stm32
  19. spss数据分析_单样本T检验_两独立样本T检验
  20. errno和perror

热门文章

  1. 2019小程序没必要做了_2019微信小程序的发展前景怎么样?有必要开发微信小程序吗?...
  2. server之后安装ssms失败 安装sql_关于SQL安装失败的解决方法
  3. 个人作业——软件工程实践总结
  4. 设计模式系列 - 解释器模式
  5. 12月7日 第二冲刺周期个人站立会议内容报告(第七天)
  6. 使用jconsole监控JVM内存
  7. kinect数据读取
  8. oracle 非GBK字符集编码的汉字排序
  9. Framelayout
  10. 观察者模式 Observer