博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++与Matlab混合编程初探
阅读量:7234 次
发布时间:2019-06-29

本文共 4033 字,大约阅读时间需要 13 分钟。

==================================================================

% 欢迎转载,尊重原创,所以转载请注明出处。

=======================切割线以下为正文================================

     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”文件里,保存

(注意。这里建立文件夹以及命名等行为不是规定的。仅仅是为了解说方便)。

#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++编译环境的配置。

注意:假设你有多个编译器,建议选择最新的。

mex -setup
Code 2, 设置Matlab的C/C++编译环境

     完毕配置后。在Matlab中运行Code 3的命令来编译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所看到的。

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所看到的。

#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 c  c_cols = mxGetN(prhs[0]);// get cols of c  d_rows = mxGetM(prhs[1]);// get rows of d  d_cols = mxGetN(prhs[1]);// get cols of d  mxAssert(c_rows==d_rows && c_cols==d_cols, "Error: cols and rows");  // create output buffer  plhs[0] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);  plhs[1] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);  // get buffer pointers  p_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。

mex abfunc.cppc = [1 2;3 4;5 6];d = [1 1;1 1;1 1];[a, b] = abfunc(c, d);
Code 6, Code5的測试代码

    Code 6的输出结果例如以下:

a =     2     3     4     5     6     7b =     0     1     2     3     4     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++混编方法论流程图

另附:文中代码下载位置:

你可能感兴趣的文章
js的 new image()---转
查看>>
Hibernate Criterion
查看>>
AFNetworking 使用方法(2.0)
查看>>
React Canvas:高性能渲染 React 组
查看>>
Mono产品生命周期
查看>>
FetchType与FetchMode的区别
查看>>
GCD &amp;&amp; Run Loops学习笔记
查看>>
SQLite Learning、SQL Query Optimization In Multiple Rule
查看>>
文件编码格式(转)
查看>>
开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
查看>>
js控制select选中显示不同表单内容
查看>>
HTML5--Audio
查看>>
地铁线路图计算--路由计算及设计参考
查看>>
[] ubuntu 14.04 搜狗拼音输入法安装
查看>>
毕业了五年了--- 人生感想
查看>>
【转】深入浅出Android Support Annotation
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
MYSQL线程池总结(一)
查看>>
c++11 gcc4.8.x安装
查看>>
工厂方法模式
查看>>