小记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版