中易网

c语言如何调用matlab?

答案:3  悬赏:10  
解决时间 2021-11-14 16:53
c语言如何调用matlab?
最佳答案
方法1 mcc 生成cpp文件方式

1、设置项目编译选项

首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:

Project-> Settings-> C/C++

Category:Preprocessor

Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND

Category: Precompiled Headers

选择: Automatic use of precompiled headers
Through header: stdafx.h

2、调设置项目连接选项

首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib)

libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def
全部回答
1.准备好C语言程序,清楚C语言的入口函数 2.编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中.在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件。 3.编译完成后,生成mylinedetect...
如果我有一个用c语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用mex文件,mex文件使得调用c函数和调用matlab的内置函数一样方便。mex文件是由原c代码加上mex文件专用的接口函数后编译而成的。 可以这样理解,mex文件实现了一种接口,它把在matlab中调用函数时输入的自变量通过特定的接口调入了c函数,得出的结果再通过该接口调回matlab。该特定接口的操作,包含在mexfunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexfunction的c文件,matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexfunction的一个参数,mexfunction把该值传给add,把得出的结果传回给mexfunction的另一个参数,matlab通过该参数来给出在matlab语句中调用函数时的输出值(如上例中的a)。 比如该c文件已写好,名为add.c。那么在matlab中,输入: >> mex add.c 就能把add.c编译为mex文件(编译器的设置使用指令mex -setup),在windows中,mex文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用m函数那样调用mex文件,如上面说到的例子。所以,通过mex文件,使用c函数就和使用m函数是一样的了。 我们现在来说mexfunction怎样写。 mexfunction的定义为: void mexfunction( int nlhs, mxarray *plhs[], int nrhs, const mxarray *prhs[]) { } 可以看到,mexfunction是没返回值的,它不是通过返回值把结果传回matlab的,而是通过对参数plhs的赋值。mexfunction的四个参数皆是说明matlab调用mex文件时的具体信息,如这样调用函数时: >> b = 1.1; c = 2.2; >> a = add(b, c) mexfunction四个参数的意思为: nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。 nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。 plhs是一个数组,其内容为指针,该指针指向数据类型mxarray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。 prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。 因为matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是一个1x1的double array。而在c语言中,matlab的array使用mxarray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxarray类型的指针数组。 完整的add.c如下: // add.c #include "mex.h" // 使用mex文件必须包含的头文件 // 执行具体工作的c函数 double add(double x, double y) { return x + y; } // mex文件接口函数 void mexfunction( int nlhs, mxarray *plhs[], int nrhs, const mxarray *prhs[]) { double *a; double b, c; plhs[0] = mxcreatedoublematrix(1, 1, mxreal); a = mxgetpr(plhs[0]); b = *(mxgetpr(prhs[0])); c = *(mxgetpr(prhs[1])); *a = add(b, c); } mexfunction的内容是什么意思呢?我们知道,如果这样调用函数时: >> output = add(1.1, 2.2); 在未涉及具体的计算时,output的值是未知的,是未赋值的。所以在具体的程序中,我们建立一个1x1的实double矩阵(使用mxcreatedoublematrix函数,其返回指向刚建立的mxarray的指针),然后令plhs[0]指向它。接着令指针a指向plhs[0]所指向的mxarray的第一个元素(使用mxgetpr函数,返回指向mxarray的首元素的指针)。同样地,我们把prhs[0]和prhs[1]所指向的元素(即1.1和2.2)取出来赋给b和c。于是我们可以把b和c作自变量传给函数add,得出给果赋给指针a所指向的mxarray中的元素。因为a是指向plhs[0]所指向的mxarray的元素,所以最后作输出时,plhs[0]所指向的mxarray赋值给output,则output便是已计算好的结果了。 上面说的一大堆指向这指向那,什么mxarray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。 实际上mexfunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保 输入正确。如在add函数的例子中,用户输入char array便是一种错误了。 从上面的讲述中我们总结出,mex文件实现了一种接口,把c语言中的计算结果适当地返回给matlab罢了。当我们已经有用c编写的大型程序时,大可不必在matlab里重写,只写个接口,做成mex文件就成了。另外,在matlab程序中的部份计算瓶颈(如循环),可通过mex文件用c语言实现,以提高计算速度。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
尚志市民政局地址在哪,我要去那里办事
有烦恼有心事时怎么样发泄
梦见老房子着火是什么意思?好不好呢?
巴彦县民政局办公地址在什么地方,我要处理点
我想知道如何做好橱窗陈列
防腐木木屋设计要注意什么问题
食物离蜂巢较远,工蜂舞蹈的速度减慢。请问能
路灯照明工程公司哪家最好
延寿县民政局办公地址在什么地方,我要处理点
长春市建筑设计院怎么样
梦见白发老人是什么意思?好不好呢?
木兰县民政局地址有知道的么?有点事想过去!
在上海外地和本地人干同样工作工资一样吗?
松北区民政局地址在哪,我要去那里办事
韩国哪里赏樱花最美?五月三号出发还能看见樱
推荐资讯
郑州哪个地方卖飞鹤飞慧奶粉
短文信誉的价值酒店的生意为什么破产?这篇短
梦见做衣服返工是什么意思?好不好呢?
每天都插拔电源,会对电脑硬件有影响吗?
嵩县洛阳田湖亚博家电地址是什么,有没有知道
湖南道县特产
天区的意思是什么?天区的释义是什么啊?
哪些大学有葡语系
光真有动能吗?那么在不同介质中传播时会有动
武汉市洪山区城市花园社区养老院老年服务部地
有个牌子 买牛皮包,鞋子,腰带,衣服的。标
星海镖师女镖师谁最美啊?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?