小记Matlab和C混合编程
2015-11-06 16:51
393 查看
小记Matlab和C混合编程
最近在看代码是发现Matlab和C语言混合编程的代码,先大概了解一下,参考了一些资料,写了一个自己编译完验证了的例子。据说C语言编写的程序比同等功能的Matlab代码速度快,效率高,尤其是Matlab中的while循环等,效率极低。1、一个简单的例子
需要先确认电脑上安装有mex编译器,我安装的是MicrosoftVisual C++ 2012 (C)的编译环境,内含mex编译器。
先看以下一个简单的例子:
#include <mex.h> void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello world!\n"); }
把上面程序保存为一个C文件,如 hello.c
在commandwindow下运行
K>> mex hello.c
使用 'MicrosoftVisual C++ 2012 (C)' 编译。
MEX 已成功完成。
结束之后在文件窗口里会有一个hello.mexw64文件。
在commandwindow下运行
K>> hello()
Hello world!
至此,一个简单的helloword程序已经完成。
2、一个更详细的例子
#include <mex.h> void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello world!\n"); }
Matlab中混合编程的C语言的入口函数为mexFunction,相当于普通使用情况下的void main()函数,此函数没有返回值,是void型。
nlhs 为函数输出的个数,plhs为函数输出值,
nrhs 为函数输入的个数,prhs为函数参数值。
举例:
如.m函数为 function [x,y]=fft(a,b,c)
则在写成C语言
输入:nlhs为2,plhs为x,y
输出:nrhs为3,prhs为a,b,c
以下是一个求出m*n矩阵的最小值和最大值的混合编程函数,输入矩阵,输出1*2的矩阵(最小值,最大值)
#include"mex.h" /***************************************************** 功能:求出m*n矩阵的最小值和最大值 输入:一个矩阵 输出:最小值和最大值 注:如果运行不了,请删除中文注释 ******************************************************/ void findMinMax(double *H,double *outMinMax,int m,int n); void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { double *H,*outMinMax; int m,n; /*************定义输入输出相关量******************/ //得到输入参数矩阵行列大小 m = mxGetM(prhs[0]); n = mxGetN(prhs[0]); //构造输出参数矩阵大小 plhs[0]=mxCreateDoubleMatrix(1, 2, mxREAL); //输出最小值和最大值 /*************传递输入输出指针绑定***************/ //输入参数 H = mxGetPr(prhs[0]); //输出参数 outMinMax = mxGetPr(plhs[0]); /*******************调用函数*********************/ findMinMax(H,outMinMax,m,n); //调试函数:mexPrintf("m=%d,n=%d\n",m,n); } void findMinMax(double *H,double *outMinMax,int m,int n) { int i=0,j=0; double tempMin = *H; double tempMax = *H; for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(tempMax<*(H+n*i+j)) tempMax = *(H+n*i+j); if(*(H+n*i+j)<tempMin) tempMin = *(H+n*i+j); } } *outMinMax = tempMin; *(outMinMax + 1) = tempMax; }
将以上代码保存成findMinMax.c
>>mex findMinMax.c
使用 'Microsoft Visual C++ 2012 (C)' 编译。
MEX 已成功完成。
测试:
>> H = [ 1 2 3 4;-1 -5 -8 -9;3 4 999 1];
>> [outMinMax] = findMinMax(H)
outMinMax =
-9 999
参考文档:精通Matlab和C/C++混合程序设计第2版
相关文章推荐
- MATLAB产生各种分布的随机数
- 在外部调用Matlab引擎实现数学计算
- matlab快捷键大全
- 使用随机梯度算法对高斯核模型进行最小二乘学习法的MATLAB程序源码分析
- Matlab与C++混合编程,添加OpenCV库
- 分层K-Means+Matlab计算向量间距离
- 对给定音频文件“testshort.wav”,用matlab输出它的波形【学生创新实验室联合纳新测试题】
- MATCOM在VC++与MATLAB混合编程中的应用
- Matlab与C/C++混合编程接口及应用
- 浅谈手机sensor采集的raw图像
- matlab下配置lpsolve
- 关于MATLAB函数不可用问题。??? Undefined function or method 'minfo' for input arguments of type 'double'.
- MATLAB GUI中Edit Text的Callback函数何时执行
- 【Matlab】1. Matlab效率提升——调用C语言编写的函数 (mex,matlab C API)
- MATLAB7.0安装后,启动弹出找不到指定的模块
- 数值分析 追赶法求解三对角线性方程组 MATLAB实现
- 在命令行输入matlab,将matlab启动
- [matlab]计算事件连续发生的频数、…
- 做空间插值[matlab]
- matlab环境下安装libsvm