小记Matlab和C混合编程

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值