您的位置:首页 > 编程语言 > MATLAB

小记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版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: