怎样用Matlab调用已有的C语言程序
1个回答
展开全部
方法/步骤
准备好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语言程序,一般情况下要清楚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中调用后,形成如下结果。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询