第一步:把.c文件改成.cpp文件,C语言写的所有代码保留下来,只需在创建好的cpp文件的第一行里加入。
#include "mex.h"
第二步:把cpp里原有的主函数void main()
改成这个
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
第三步(核心):matlab里要用对mexFunction函数就能编译C语言文件。那么这个mexFunction函数要怎么用呢?
首先要明确一点:matlab只要.m文件有运行按钮,.cpp文件可不能直接运行,就是.cpp文件没有这个东西:
。所以,在解决了mexFunction函数的用法后,还需要自己再写一个.m文件。.m文件是需要根据自己的C语言代码的需求自己编的。即你C语言代码的样子,它会决定你mexFunction函数怎么写和.m文件怎么写。
好,上面都说了些没用的,我们继续说这个mexFunction函数要怎么用?
1.如果你的C语言的代码中是要给一些输入数据的(比如要输入一幅图篇,或是两个数字)。
如果是一幅图篇,它就是个二维数组,二维数组要这么用
inData = mxGetPr(prhs[0]);
CAMERA_H = mxGetM(prhs[0]);
CAMERA_W = mxGetN(prhs[0]);
第一句是确定了输入是一个数组,即输入的图片用变量名inData代替。prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入。
第二句是确定了数组的行,即行数用变量CAMERA_H命名。
第三句是确定了数组的列,即列数用变量CAMERA_W命名。
如果你是两个数字要输入:要这么用
double b,c;
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
2.输入说完了,现在说输出:
如果你的输出是两个数组,这么用:
plhs[0] = mxCreateDoubleMatrix(120,1 , mxREAL);
outdata0 = mxGetPr(plhs[0]);
plhs[1] = mxCreateDoubleMatrix(120,1 , mxREAL);
outdata1 = mxGetPr(plhs[1]);
第一句话是创造了一个能存120个数的一维数组。
第二句话则是把此数组赋给变量outdata0,outdata0是我前面已经定义过的变量,看截图。
第三、四句话则是创建另一个数组。
如果你的输出是一个数字,这么用:
这里的变量b和c是前面定义过的输入要用的那俩。
3.把输出给到输出
上面的第2.应该叫建立输出,这里的第3.才是真·输出。
你要这么给:
看到了吗?Lline数组哪来的?这是你C语言代码里的,就是你C语言程序的最后求出来的东西,我这里求的是两个数组——Lline和Rline。就很纯粹的Lline的所有值给120次,给到outdata0,硬核赋值,是个人都会这么写。
同理,给一个数输出出来:
看到了吗?就这一句,*a=add(b,c);
你就把c文件里的输出给到matlab里的输出变量就完事了,愣头青似的赋值(用这个=)就完事了。但是,这里要注意,不知你注意到了没有?把输出给到输出 这一步操作是在mexfunction函数里边的,并且它一般是作为mexfunction函数里的最后一步。
…%@*¥…好,至此,讲完了。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
忘掉上面的所有,上面全是对.cpp文件的操作,现在另起炉灶说.m文件的使用,编.m文件是打算调用.cpp文件。
第四步:编写.m文件,看看matlab运行C语言的成果。
1.前面说的,输入一幅图,输出两个数组的,这么用:
mex my.cpp;
a = double(imread('4013.bmp'));
[c,d] = my(a);
figure,imshow(a),hold on,plot(c(1:120),1:120,'r-'),hold on,plot(d(1:120),1:120,'g-'),hold on;
这里的红线就是Lline数组,绿线就是另一个输出的数组Rline。
第一句 mex my.cpp;
我的cpp文件名就叫my。
2.前面说的,输入两个数,输出一个数的那个:
不必编写.m文件了,因为调用很简单,就两句话,写在命令行窗口即可。
看到了吗?这里没有mex my.cpp;
为什么?答案是:这就是句废话,没有它照样能用。上面的那个例子,可以把此句话删掉。
此外,除了我用的mxCreateDoubleMatrix函数之外,还有这些函数:
有点不好说,大意我是说完了,如果还是不会,就请在评论区提问。意会而不好言传。如果说我写的第一篇博客是奶奶都会的那种,那么这篇就是连大学生也不好看明白的那种。
最后,注意了! 在开始这些所有东西之前,请先在matlab的命令行窗口打出以下代码:
mex -setup
如果出现下图这样就没问题:
如果你收到了红字的警告,那你一定是没有安装visual studio,visual studio这种大型的编译软件带有能和matlab匹配的Microsoft Visual C++,visual studio的版本建议安装2013及以上。