将c语言编译为mex文件(将c语言编译为mex文件怎么编译)

今天给各位分享将c语言译为mex文件的知识,其中也会对将c语言编译为mex文件怎么编译进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、怎样用Matlab调用已有的C语言程序2、c语言如何实现mex函数3、matlab 把c文件 编译成mex64 文件

怎样用Matlab调用已有的C语言程序

方法/步骤

准备好C语言程序,一般情况下要清楚C语言的入口函数,比如,如下的C语言函数:

ntuple_list linedetect(image_double image)

上述C语言函数中,linedetect为函数名,ntuple_list为输出,image为输入。C语言的源文件包含”.h”和”.c”文件。如:linedetect.h文件和linedetect.c文件。

编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中,文件内容如下:

#include “mex.h”

#include “matrix.h”

#include “linedetect.h”

#include “string.h”

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

int M;

int N;

double * pImg;

ntuple_list p;

struct image_double_s img_s;

if(nrhs==0)

{

mexPrintf(“error input\n”);

return;

}

M = mxGetM(prhs[0]);

N = mxGetN(prhs[0]);

pImg = mxGetPr(prhs[0]);

img_s.data = pImg;

img_s.xsize = M;

img_s.ysize = N;

p=lsd(img_s);

plhs[1] = mxCreateDoubleMatrix(1,3,mxREAL);

*(mxGetPr(plhs[1])+0) = p-size;

*(mxGetPr(plhs[1])+1) = p-max_size;

*(mxGetPr(plhs[1])+2) = p-dim;

plhs[0] = mxCreateDoubleMatrix(p-dim,p-max_size,mxREAL);

memcpy(mxGetPr(plhs[0]),p-values,(p-max_size)*(p-dim)*sizeof(double));

}

在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件,如下所示。

mex mylinedetect.c linedetect.c

编译完成后,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用于MATLAB与C语言接口函数

编译完成之后,编写MATLAB函数,调用MEX文件。如下所示。

load trees;

%以MEX文件的形式调用编译完成的C语言函数

[o1,o2]=mylinedetect(double(X).’);

……

输出结果,上述linedetect函数完成图像中直线检测功能,带入MATLAB中调用后,形成如下结果。

c语言如何实现mex函数

通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom

C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,就在Matlab里键入mex

-setup,下面只要根据提示一步步设置就可以了。需要注意的是,较低版本的在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的VC装在路径C:\PROGRAM

FILES\DEVSTUDIO下,那在设置路径时就要写成:“C:\PROGRA~1”这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序存为hello.c。

/*hello.c*/

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

mexPrintf(“hello,world!\n”);

}

假设你把hello.c放在了C:\TEST\下,在Matlab里用CD

C:\TEST\

将当前目录改为C:\

TEST\(注意,仅将C:\TEST\加入搜索路径是没有用的)。现在敲:

mex

hello.c

如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:\TEST\加

入了搜索路径,现在键入hello,程序会在屏幕上打出一行:

hello,world!

看看C\TEST\目录下,你会发现多了一个文件:HELLO.DLL。这样,第一个mex函数就算完成了。分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程

mexFunction构成。

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

前面提到过,Matlab的mex函数有一定的接口规范,就是指这

nlhs:输出参数数目

plhs:指向输出参数的指针

nrhs:输入参数数目

例如,使用

[a,b]=test(c,d,e)

调用mex函数test时,传给test的这四个参数分别是

2,plhs,3,prhs

其中:

prhs[0]=c

prhs[1]=d

prhs[2]=e

当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的目的。

细心的你也许已经注意到,prhs[i]和plhs[i]都是指向类型mxArray类型数据的指针。

这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在。当然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。

为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输

入参数的变化给出不同的屏幕输出:

//hello.c

2.0

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

int

i;

i=mxGetScalar(prhs[0]);

if(i==1)

mexPrintf(“hello,world!\n”);

else

mexPrintf(“大家好!\n”);

}

将这个程序编译通过后,执行hello(1),屏幕上会打出:

hello,world!

而hello(0)将会得到:

大家好!

现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除了用到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一个函数:mxGetScalar,调用方式如下:

i=mxGetScalar(prhs[0]);

“Scalar”就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的作用就是把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序:

//hello.c

2.1

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

int

*i;

i=mxGetPr(prhs[0]);

if(i[0]==1)

mexPrintf(“hello,world!\n”);

else

mexPrintf(“大家好!\n”);

}

这样,就通过mxGetPr函数从指向mxArray类型数据的prhs[0]获得了指向double类型的指针。

但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢

?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就

没法对它进行计算。

为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行数

和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来:

//show.c

1.0

#include

“mex.h”

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*data;

int

M,N;

int

i,j;

data=mxGetPr(prhs[0]);

//获得指向矩阵的指针

M=mxGetM(prhs[0]);

//获得矩阵的行数

N=mxGetN(prhs[0]);

//获得矩阵的列数

for(i=0;iM;i++)

{

for(j=0;jN;j++)

mexPrintf(“%4.3f

“,data[j*M+i]);

mexPrintf(“\n”);

}

}

编译完成后,用下面的命令测试一下:

a=1:10;

b=[a;a+1];

show(a)

show(b)

需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组大data后对应于data[j*M+i]

输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同一个地址空间,因而在prhs[]里传递指针就可以达到参数传递的目的。但是,输出参数却需要在mex函数内申请到内存空间,才能将指针放在plhs[]中传递出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请,函数原型如下:

mxArray

*mxCreateDoubleMatrix(int

m,

int

n,

mxComplexity

ComplexFlag)

m:待申请矩阵的行数

n:待申请矩阵的列数

为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs[]里传递回去了。但是对这个新矩阵的处理,却要在函数内完成,这时就需要用到前面介绍的mxGetPr。使用

mxGetPr获得指向这个矩阵中数据区的指针(double类型)后,就可以对这个矩阵进行各种操作和运算了。下面的程序是在上面的show.c的基础上稍作改变得到的,功能是将输

//reverse.c

1.0

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*inData;

double

*outData;

int

M,N;

int

i,j;

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;iM;i++)

for(j=0;jN;j++)

outData[j*M+i]=inData[(N-1-j)*M+i];

}

当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到的一些函数,其余的详细情况清参考Apiref.pdf。

通过前面两部分的介绍,大家对参数的输入和输出方法应该有了基本的了解。具备了这些知识,就能够满足一般的编程需要了。但这些程序还有些小的缺陷,以前面介绍的re由于前面的例程中没有对输入、输出参数的数目及类型进行检查,导致程序的容错性很差,以下程序则容错性较好

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*inData;

double

*outData;

int

M,N;

//异常处理

//异常处理

if(nrhs!=1)

mexErrMsgTxt(“USAGE:

b=reverse(a)\n”);

if(!mxIsDouble(prhs[0]))

mexErrMsgTxt(“the

Input

Matrix

must

be

double!\n”);

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;iM;i++)

for(j=0;jN;j++)

outData[j*M+i]=inData[(N-1-j)*M+i];

}

在上面的异常处理中,使用了两个新的函数:mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在给出出错提示的同时退出当前程序的运行。MxIsDouble则用于判断mxArray中的数据是否double类型。当然Matlab还提供了许多用于判断其他数据类型的函数,这里不加详述。

需要说明的是,Matlab提供的API中,函数前缀有mex-和mx-两种。带mx-前缀的大多是对mxArray数据进行操作的函数,如mxIsDouble,mxCreateDoubleMatrix等等。而带mx前缀的则大多是与Matlab环境进行交互的函数,如mexPrintf,mxErrMsgTxt等等。了解了这一点,对在Apiref.pdf中查找所需的函数很有帮助。

至此为止,使用C编写mex函数的基本过程已经介绍完了。

将c语言编译为mex文件(将c语言编译为mex文件怎么编译)

matlab 把c文件 编译成mex64 文件

下面是编译步骤:

1. 设置编译器

(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:

输入有lcc那个选项,我输入的是1

(3)让你确认选择的编译器是否正确,正确输入y,否则输入n。

2. 输入mex straight_line_integral_inner.c 没有报错则编译成功,你可以在你的项目文件夹下发现多了一个文件straight_line_integral_inner.mexw32。

这样你就可以在MATLAB中调用C代码了。

注:如果是WINDOWS系统,则生成mex32;如果是Win7则生成mex64.

关于将c语言编译为mex文件和将c语言编译为mex文件怎么编译的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 12:33:18
下一篇 2024年4月1日 12:40:31

相关推荐

  • c语言输出第n小的质数,输出第n个数

    C语言编程:输出1到N中所有质数的个数 输出1-100以内的素数:同样,也是输出1-100以内的素数,这个构造一个数组,将其所有元素初始化为1,表示素数,这时取x从2开始,到100以内做循环。 可以定义一个函数用于判断一个数是否是素数,接着从10到100依次遍历,判断其是否是素数,如果是并输出。 C语言:输入一个正整数n,求第n小的质数。1、题目:将一个正整…

    2024年5月19日
    4500
  • 黑客最好学习什么语言编程,黑客该学什么语言

    做黑客必须具备的语言有哪些? 1、想成为黑客,需要首先熟练掌握一种或多种编程语言,如Python、Java等。其次,要了解计算机网络结构、协议和常见漏洞,熟悉常见的渗透测试工具和技术,如Metasploit、Nmap等。 2、UNIX/LINUX这种操作系统就是用C语言写的,是最强大的计算机语言,于上世纪70年由丹尼斯瑞切开发。想成为一名黑客,必须掌握C语言…

    2024年5月19日
    3800
  • c语言return1什么意思,c语言中return 1的作用

    计算机C语言中return语句是什么意思 1、return在c语言中是返回函数的值的意思。返回通过调用涵洞数量到主涵洞数量获得的值。Return是返回函数的值。这里,它是op指针减去outstr指针的值。 2、return返回一个数值的意思就是把return 表达式后面表达式的值返回给调用他的函数。 3、return 1:返回真。C语言简介:C语言是一门面向…

    2024年5月19日
    4000
  • excel文件数据恢复软件,xlsx数据恢复

    如何恢复excel保存前的数据 EXCEL文件如何恢复保存前的数据?恢复保存前数据的方法如下:打开EXCEL,点击WPS工具,选择工具。点击“备份管理”。点击“其它备份”就可以去到备份文件夹。在这里找找,如果有,直接双击打开后,另存到桌面就可以了。 根据查询应用哥科技得知,表格恢复保存以前的数据有以下方法:方法一:通过Excel选项设置自动恢复时间间隔和路径…

    2024年5月19日
    5000
  • c语言实现堆栈计算器,c语言中的堆栈

    用C语言怎样实现计算器加减乘除功能? 是的,可以使用C语言编写一个计算器程序,能够实现加、减、乘、除等混合运算。 首先打开Code Blocks软件,新建一个C语言文件,如下图所示。接下来在C语言文件中编写加减乘除运算代码,如下图所示。然后点击构建菜单下面的编译当前文件选项,如下图所示。 用C语言编写可以进行加减乘除整数运算混合运算的计算器,要求写思路,越详…

    2024年5月19日
    3600
  • c语言编程abs,C语言编程题

    c语言中的abs abs( )是C语言中对整型数据进行取绝对值的函数。 在C语言中,abs()函数是标准库函数之一,因此我们不需要自己实现它。我们只需要包含头文件,就可以使用它了。 C语言的库函数中提供了求绝对值的函数,函数名为 abs 函数的头文件:#include 函数原型:int abs (int j); 函数说明:abs()用来计算参数j 的绝对值,…

    2024年5月19日
    3500
  • linux新建txt文件的简单介绍

    linux下如何创建一个.txt类型的文件 重定向符号 通常重定向符号可以创建一个0kb的空文件,可用于重定向命令的输出到一个新文件中,在无命令时使用重定向符号,会创建一个文件。但它不允许你在创建文件时向其中输入任何文本。 首先连接上linux主机,进入到需要处理的目录,例如“/”目录。输入:ls -1 txt,按回车。此时通过ls命令发现“txt”文件被生…

    2024年5月19日
    4300
  • c语言轮询mysql,c语言轮询执行语句

    用C语言怎么实现与数据库的连接 配置ODBC数据源。使用SQL函数进行连接。对于配置数据源,配置完以后就可以编程操作数据库了。 要在C语言中连接Oracle数据库,您可以使用Oracle提供的ODBC(Open Database Connectivity)接口来实现。以下是连接Oracle数据库的一般步骤:确保您已安装了适当的ODBC驱动程序和Oracle客…

    2024年5月19日
    4000
  • ic验证c语言文件编译,icc 编译器

    c语言中的编辑,编译,连接,运行分别是什么意思 编辑就是对代码的编写,按照c语言规则,编写完成一定功能的代码。编译就是对代码进行编译,让代码从高级语言编译成可以让电脑识别运算的机器码。连接就是对代码各个函数等进行,连接 运行就是运行所编辑代码组成的程序。 编译:将源程序转换为目标文件(Obj文件)。链接:将目标文件生成为可执行文件(EXE文件)。运行:执行,…

    2024年5月19日
    3900
  • c语言前身是什么,c语言前身是什么语言

    c语言的前身是什么语言呢 1、C语言的前身是B语言;其后是C++;Java曾被称为C++++–,意思是在C++上增点东西再减点东西;C#中#就是四个叠起的加号[1];最后D语言干脆在字母上进行升级。 2、B语言是C语言的前身,C语言是以B语言为基本开发的,C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。 3、B语言是…

    2024年5月19日
    3300

发表回复

登录后才能评论



关注微信