c语言如何调用matlab?
答案:3 悬赏:10
解决时间 2021-11-14 16:53
- 提问者网友:雨之落き
- 2021-11-14 05:30
c语言如何调用matlab?
最佳答案
- 二级知识专家网友:短发女王川岛琦
- 2021-11-14 06:09
方法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、设置项目编译选项
首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:
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楼网友:都不是誰的誰
- 2021-11-14 08:25
1.准备好C语言程序,清楚C语言的入口函数 2.编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中.在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件。 3.编译完成后,生成mylinedetect...
- 2楼网友:孤伤未赏
- 2021-11-14 07:08
如果我有一个用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语言实现,以提高计算速度。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯