前言:本篇文章主要通过一个简单的例子程序对C-Mex进行一个初步的说明。前期的环境搭建(包括安装Matlab和gcc编译器)就不在这里赘述了。

  在看文章之前,建议初学者先检查一下Matlab的mex配置。运行一下“mex -setup”,看看是否已经在Matlab中配置了相应的gcc编译器。如果没有,按照提示一步步改吧。

  

  首先,为什么要使用C-Mex?说开了,就是程序的效率问题。最近,我在做一个并行化的项目,原来的程序是用Matlab编写的,运行时间为6个小时以上,在我改成Matlab和C(或C++)混编之后,运行时间缩减到2分钟不到。天!180多倍的加速比,不敢想象!当然,并不是每一个程序改成C之后都能得到这么大的提速,关键还要看程序本身的计算量和访存的频繁程度。

  那么,mex文件是什么呢?Mex文件其实是其他语言与Matlab的接口。通过这个接口,我们可以像使用Matlab函数(即.m文件)一样的方式使用其他语言编写的程序。例如,下面一个最最简单的矩阵加法的例子。

matlab主函数(main.m):

1 %编译c文件
2 mex addVector.cpp;
3
4 %初始化参数
5 A = [1 2 3; 4 5 6];
6 B = [7 8 9; 2 3 4];
7
8 %调用mex文件
9 C = addVector(A,B);

  该Matlab程序非常简单,首先编译文件addVector.cpp,然后声明连个变量A和B。最后将A和B作为函数addVector的参数,调用函数并返回结果保存为C。这里,你可能会注意到addVector.cpp是c++文件,其实并没有什么区别,编译器会自动帮你识别区分c和c++程序。不过,要是你有强迫症的话,也可以写成.c文件,前提是你的文件里面没有诸如类和对象这些C语言没有的东西(C这个单身狗怎么可能有对象呢,哈哈哈......)。

  咦,那使用语句“mex addVector.cpp”来编译我们的C文件,编译后的文件是怎样的呢?来来来,请看下面:

  

  你看看那蓝色的家伙“addVector.mexw64"就是我们使用mex命令编译后的可执行文件了。在使用的时候,我们只需要喊一下她的名字”addVector“,然后把参数传进去,她就会老老实实的听你话啦!嘿嘿嘿,是不是很美妙呢!那么,后缀名"mexw64"又是什么东西,这个嘛!其实后缀名“mexw64”中的“mex”是告诉大家这个文件是mex文件啦!然后,“w64”是说这个文件只能在64位的windows系统下使用啦!没有什么的呐。

  我说她会老老实实听话,难道你信了啊?当然,我没有骗你,但是你肯定要先对她好才行呀。那么,怎么对她好呢?接下来,我来给大家介绍咋们的正主“addVector.cpp"。咋们轻解罗衫,细细品尝。请细看:

 1 #include "mex.h"
 2 #include <stdio.h>
 3
 4 //nlhs为输出参数个数,nrhs为输入参数个数
 5 //plhs为输出参数指针,prhs为输入参数指针
 6 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
 7 {
 8     //获取输入数据
 9     int i=0;
10     double* inputMatric_A   = (double*)mxGetData(prhs[i++]);//matlab传过来的参数默认为double类型
11     double* inputMatric_B   = (double*)mxGetData(prhs[i++]);
12
13     //获得第一个参数的行数和列数
14     int numRowsA = (int)mxGetM(prhs[0]);
15     int numColsA = (int)mxGetN(prhs[0]);
16     printf("numRowsA = %d\n",numRowsA);
17     printf("numColsA = %d\n",numColsA);
18
19     //生成输出输出
20     plhs[0] = mxCreateDoubleMatrix(numRowsA,numColsA,mxREAL);   //三个参数分别为行数,列数和数据类型,mxREAL为实数
21     double* outputMatric_C = (double*)mxGetData(plhs[0]);    //创建指针指向输出数据
22
23     //计算并将结果放入输出数据区
24     int dataSize = numRowsA * numColsA; //矩阵A元素总个数
25     for(i=0; i<dataSize; i++)
26     {
27         outputMatric_C[i] = inputMatric_A[i] + inputMatric_B[i];
28     }
29 }

  嘻嘻!代码有点长,整整29行呀!先看一下头文件吧,计算最前面#include那两行啦!”#include “mex.h"呢,是把那些你要用到的函数的函数声明先包含进来,你看看下面调用的那些函数,所有你没看到过的就是啦!”include <stdio.h>"只是C的io流头文件而已呐,没有什么的,不要告诉我你不会C,瞬移回去学完再来。

  前方高能,请看第6行代码,没错,就是那个函数“void mexFunction( int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])"。你问我这是什么鬼?我TM哪知道了。我只知道它是她的心脏,必须存在。你写C程序不是还要一个main函数作为入口吗?那你写mex程序也要一个入口呀,这个入口就是”mexFunction“啦!入口,入口,懂不!我知道你懂,嘿嘿嘿!咦,那这个函数怎么有那么多个参数呀!我记得main函数只有两个参数呀,叫什么”argc“和”argv的“。小傻瓜,人家是C-Mex啦,跟C哪能一样呀,虽然我们都没有对象。既然你想知道,那我就跟你讲清楚咯。看到没,四个参数:”nlhs“,”plhs“,”nrhs“,”prhs“。哇塞,长得好像!n开头的是参数个数,”nlhs“和”nrhs“分别是输出参数个数和输入参数个数,像我们上面的例子就是nlhs=1,nrhs=3啦。p开头的呢就是指向输入数据的指针啦,”plhs“和”prhs“分别是指向输出数据和输入数据的指针。你看看,人家传递的参数是指针,多好,不用把数据再复制一遍。Matlab那个家伙声明了两个变量A和B,把他们放到仓库(内存)里了,然后把仓库的位置(内存地址,即指针)告诉我,我(C)要用的时候就可以直接去那里取啦!嘻嘻,我把仓库里的原材料(A和B)拿来做成蛋糕(outputMatric_c),然后放到我的小仓库(plhs[0])里,然后Matlab就可以来拿去吃啦!原汁原味,又不浪费多余的空间。

  在来细细斟酌一下具体的内容。9~11行,我们把参数一个接一个拿出来。记得哦!我们拿到的都是指针哦!Matlab传递的参数一般是double类型的咯,所以你的"inputMatric_A"等都要是double类型的咯。如果你从Matlab传过来的参数是float类型的就改成float类型的咯。

  既然有了输入数据,那么我们还要做一个放小蛋糕的仓库(输出数据)呀!那么,这个仓库(内存)要多大呢?你喜欢咯!14~21行就是在做这件事情咯,我们得到参数prhs[0]的行号和列号就是要用来规定仓库的大小的呐。numRowsA x numColsA,这么大哦!

  虽然我们给输出参数plhs[0]分配了空间,但是我们肯定是不能直接操作这个指针的呀!我们用另一个指针”outputMatric_C”指向这个内存空间,然后把结果保存在"outputMatric_C"就可以啦!毕竟plhs[0]和“outputMatric_C”本质上是一个东西,只是他们类型不一样,一个是mxArray类型的,一个是double类型的。

  突然发现自己废话有点多啊!还是赶紧总结一下吧,别说话,看图:

  

  首先先写C或C++的源文件咯,写完编译一下生成可执行文件咯!搞定之后,就可以在Matlab程序中调用咯,输入参数和输出参数的参数你自己决定咯。

  好咯,这篇文章就写到这里咯!我要去吃饭啦!闪人!!!

转载于:https://www.cnblogs.com/JunhaoWu/p/CMex_Round1.html

Matlab C-Mex Round 1相关推荐

  1. MATLAB中MEX文件的编写与调试

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http:/ ...

  2. matlab使用mex,c – 如何在Matlab中配置MEX功能

    分析MEX文件是棘手的,因为MEX文件是共享库.在 Linux上使用标准'gprof'方法无法做到这一点 – gprof根本不这样做.我尝试使用sprof,但是我得到了 "PLTREL no ...

  3. MATLAB的MEX文件编写和调试

    资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用M ...

  4. matlab 模块mex,[转载]MATLAB的mex接口

    mex的适用情况:需要大量循环或者遍历,不想改写已有的C模块,这些情况下适用mex接口比较合适. mex的环境要求:已安装MATLAB,已安装合适的C编译器. mex使用: 首先在MATLAB中使用m ...

  5. matlab的mex安装,matlab安装使用mex

    gunmex 在 matlab 中的配置(WinGW 和 cygwin) 在 Window xp/7 下使用 Linux 的 C/C++代码,编译成 DLL 供 Matlab 混合编程使用,目前有两个 ...

  6. matlab中的round、ceil、floor、fix函数

    在matlab中,round.ceil.floor.fix都是取整函数函数, round函数是个四舍五入函数,例:round(2.7)=3; round(1.2)=1; round(-1.3)=-1 ...

  7. MATLAB中的round函数

    MATLAB中的round函数 函数简介 调用格式:Y = round(X) 在matlab中round也是一个四舍五入函数.在matlab的命令窗口中输入doc round或者helpround即可 ...

  8. matlab mex路径,使用matlab进行mex编译时的路径问题mexopts

    matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件.这些文件免不了使用include下的*.h和lib下的*.lib文件.举 matlab和vs 进行混合编 ...

  9. 使用matlab进行mex编译时的路径问题mexopts

    matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我的cpp中用到了 ...

  10. cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件

    cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排 cmake 编译工程具有独特的优势 ...

最新文章

  1. 重新标注128万张ImageNet图片:多标签,提升模型性能
  2. SpringBoot学习之@Configuration注解和@Bean注解
  3. ZooKeeper 如何保证数据一致性
  4. 易语言 设置屏幕刷新率 源码_一块好的手机屏幕应具备什么条件?现在了解还不晚...
  5. 如何使用Cyberduck登录SAP Leonardo机器学习服务的AWS在线存储
  6. left outer join 和 right outer join 和 join 的区别
  7. 希尔排序听起来有点难,其实很简单
  8. Rube GoldbergSpring整合
  9. micropython stm32f030_24C02 读写代码,基于STM32F030
  10. iOS 直接使用16进制颜色
  11. thinkphp v5.0.24 密码爆破_轻松搭建基于 Serverless 的 ThinkPHP 应用
  12. spring5企业级开发实战 pdf_终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF...
  13. 用Python一键生成炫酷九宫格图片,火了朋友圈
  14. java定义一个空数组_一个 Java 方法,最多能定义多少参数?
  15. VBR与CBR的区别是什么?
  16. 小程序录音php上传,微信小程序录音文件.silk上传服务器转mp3格式
  17. 电脑裸奔-中木马-QQ被盗-大团圆结局(QQ申诉艰难旅程)
  18. 混沌初开:全新HarmonyOS 2正式到来!
  19. 正激电路:半桥(波形解释)
  20. 城市精细化治理过程中的智能图像识别如何更精准、更智能?

热门文章

  1. jpa内网mysql_mysql+jpa简单实现步骤
  2. python谱聚类算法_谱聚类 - python挖掘 - 博客园
  3. beego mysql session_Go语言之高级篇beego框架之cookie与session
  4. r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
  5. jQuery 学习-DOM篇(一):jQuery 创建元素并添加属性
  6. adb ps shell 查看进程,如何使用ADB命令检测正在运行的应用程序
  7. idea给main方法附带参数
  8. onenote打开闪退平板_爆款教学小帮手——OneNote篇
  9. android textview显示表情,在Android TextView中显示表情符号/情感图标
  10. 记忆化搜索本质是dp