Matlab调用C接口

matlab调用C语言mex

标签(空格分隔): 学习笔记


一、为什么要用C语言编写MEX文件

MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用for循环时,把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。

二、 编译器的安装与配置

要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器:

5.0、6.0版的MicroSoft Visual C++(MSVC)

5.0、5.2、5.3、5.4、5.5版的Borland C++

LCC(由MATLAB自带,只能用来产生MEX文件)

下面是安装与配置MATLAB编译器应用程序MEX的设置的步骤:

(1)在MATLAB命令窗口中运行mex –setup,出现下列提示:

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:

Select a compiler:

[1] Borland C++Builder version 6.0 in C:\Program Files\Borland

[2] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio

[3] Lcc C version 2.4 in D:\MATLAB6P5P1\sys\lcc

[4] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

(3)选择其中一种(在这里选择了3),MATLAB让用户进行确认:

Please verify your choices:

Compiler: Lcc C 2.4

Location: D:\MATLAB6P5P1\sys\lcc

Are these correct?([y]/n):

(4)选择y,结束MATLAB编译器的配置。

三、一个mex例子

3.1c语言部分的编写

#include<Windows.h>
#include"mex.h"
void dynamicPrograming(double* graph, double* location, double* path, int graylevel_10,int graylevel_8)
{
    for (int i = 0; i < graylevel_10; i++)
    {
        path[i] = graph[i];
        location[i] = 0;
    }
    //接下来填充path的剩余数据
    for (int i = 1; i < graylevel_8; i++)  // 合并点个数的循环
    {
        ///////////////////////////j = i?;///////////////////
        for (int j = i; j < graylevel_10; j++)
        {
            double current_cost = 10000000;
            for (int k = i; k < j; k++)
            {
                double temp_cost = path[(i - 1) * graylevel_10 + k] + graph[k * graylevel_10 + j];
                if (temp_cost < current_cost)
                {
                    current_cost = temp_cost;
                    location[i * graylevel_10 + j] = k;
                }
                //将求得的最少失真和合并点返回
                path[i * graylevel_10 + j] = current_cost;
            }
        }
    }
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double* graph;
    double* location;
    double* path;
    int graylevel_10;
    int graylevel_8;
    //输入
    graph = mxGetPr(prhs[0]);
    graylevel_10 = *(mxGetPr(prhs[1]));
    graylevel_8 = *(mxGetPr(prhs[2]));
    //输出
    plhs[0] = mxCreateDoubleMatrix(graylevel_10, graylevel_8, mxREAL);
    location = mxGetPr(plhs[0]);
    plhs[1] = mxCreateDoubleMatrix(graylevel_10, graylevel_8, mxREAL);
    path = mxGetPr(plhs[1]);
    dynamicPrograming(graph, location, path, graylevel_10, graylevel_8);

}

在上述代码中,mexFunction是matlab调用c语言的接口函数,函数的输入时固定的,int nlhs表示左边参数的个数,这在matlab中是输出的个数, mxArray *plhs[]用来存放输出,新建是必须用矩阵的形式新建,如果输出只是一个数的话,也需要新建一个1*1大小的矩阵;同理,nrhs是输入的个数, mxArray *prhs[]用来存放输入。
对于输入,首先调用mxGetPr(prhs[])函数,获得输入的入口指针,第一个输入为 mxGetPr(prhs[0]),第二个输入为mxGetPr(prhs[1]),以此类推。如果右侧输入是一个数的话,可以采取下述形式

graylevel8=(mxGetPr(prhs[2]));

为所有输出分配好空间后并得到接口指针, 就可以调用C语言函数。

3.2matlab部分语言的编写

初次使用matlab的mex时,需要配置mex。在matlab参数行中输入mex -setup然后按照提示一步步配置完成后。输入mex ++++.cpp(需要mex的C语言文件名),之后就可以非常愉快的当做matlab的一个内置函数轻松调用了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值