Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

如下为本人亲证代码:

一:

编译器的安装与配置(环境不同,显示结果不同)

 要使用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编译器的配置。

二在matlab当前目录下新建 add.c文件。输入

复制代码
#include "mex.h" //使用MEX文件必须包含的头文件
//mex 通过
//a=add(b,c)
double add(double x,double y)
{
return x+y;
}
//MEX文件接口函数
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{   //步骤一:声明
   // 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误
   // 源文件名后缀为.cpp时,没有上面的问题,...- -||
       double b,c;
       double *a;
   //步骤二:操作输入数据
   //对输入数据进行操作,根据需要选择这几个函数mxGetPr指针指向参数的数据地址、 mxGetM 、 mxGetN 得到矩阵数据的行和列 (返回整数)。
    b=*(mxGetPr(prhs[0]));//*代表取地址的内容
    c=*(mxGetPr(prhs[1]));
    //步骤三:操作输出数据,
    //对于输出数据,需要首先用专门的mex函数分配内存空间
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
   //同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量
   a=mxGetPr(plhs[0]);
   //步骤四:调用add
   *a=add(b,c);
   
}
复制代码

三、C文件已写好,名为add.c。那么在Matlab中,输入:

>> mex add.c

就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows多出MEX文件

 

>> output = add(1.1,5)

五、得到输出结果

 

output =

    6.1000

案例二:

在matlab中建立EstabHibert.cpp的文件,并插入如下代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Matlab以MEX方式调用C代码示例二
//功能:建立一个n*n的Hibert 矩阵 ,n存放输入值,y存放输出的矩阵
// 【例1】用m文件建立一个1000×1000的Hilbert矩阵代码如下。
//
// tic
//
// m=1000;
//
// n=1000;
//
// a=zeros(m,n);
//
// for i=1:1000
//
// for j=1:1000
//
// a(i,j)=1/(i+j);
//
// end
//
// end
//
// toc
 
#include "mex.h"
//计算过程,该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。
void  hilb( double  *y, int  n)
{
int  i,j;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
*(y+j+i*n)=1/(( double )i+( double )j+2);
}
}
}
//接口过程
void  mexFunction( int  nlhs,mxArray *plhs[], int  nrhs, const  mxArray *prhs[])
{
//步骤一:声明
// 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误
// 源文件名后缀为.cpp时,没有上面的问题,...- -||
//double x,*y;
// int n;
double * y;
int  n;
//检测输入、输出参数个数和类型的正确性
if (nrhs!=1)
mexErrMsgTxt( "One inputs required." );
if (nlhs!=1)
mexErrMsgTxt( "One output required." );
if (!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)
mexErrMsgTxt( "input must be scalars" );
//scalars 代表标量,double型是标量的一种哦
n=mxGetScalar(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(n,n,mxREAL);
// n=mxGetM(plhs[0]); //get rows
y=mxGetPr(plhs[0]);
hilb(y,n);
}

  

 

mex EstabHibert.cpp

a= EstabHibert(1000);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值