① MATLAB mex 找不到编译器怎么办
①选y后,MATLAB会列出当前机器上已经安装的、且与当前MATLAB版本兼容的所有C编译器,一般而言,MATLAB都会自带一个LCC编译器,然而LCC目前仅支持32位的MATLAB,所以你的机器上没有。
②选n后,MATLAB会列出所有与当前MATLAB版本兼容的C编译器类型(不管你是否已经安装,用于帮助用户选择合适的C编译器),你机器上已经安装的2个编译器,VC6.0:MATLAB从R2010b之后不再支持,所以选项里看不到;而SDK7.1选n时可以看到([11]),但选y时没有跳出,是因为MATLAB没有正确定位SDK。
③解决方法:
方法一:如果以缺省选项安装了SDK7.1(不改变默认安装路径),可以尝试输入n后,选择 [14] (注意:是14,不是11!),强制定位该编译器(网上有人用这种方法成功了:http://mlinking.blog.163.com/blog/static/185801922201331464626365/)
方法二:重新安装MATLAB,安装时选择32位进行安装,则自带LCC编译器。
方法三:选择适配的VS版本,下载安装后,重新配置MEX命令。
② 请教关于利用Matlab中“mex”命令编译C程序的问题
1.准备好C语言程序,清楚C语言的入口函数
2.编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中.在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件。
3.编译完成后,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用于MATLAB与C语言接口函数.
4.编译完成之后,编写MATLAB函数,调用MEX文件。以MEX文件的形式调用编译完成的C语言函数[o1,o2]=mylinedetect(double(X).');......
5.输出结果,上述linedetect函数完成图像中直线检测功能,带入MATLAB中调用后形成结果。
③ matlab如何编译mex文件
通过MEX文件可以在MATLAB中像调用内嵌函数一样调用现有的使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能解决MATLAB循环效率低的缺点,提高MATLAB环境中数据处理的效率。
MEX文件的后缀名为 .mexw32
MEX文件的编写和编译需要两个基本条件:一是必须按照MATLAB应用程序接口组件和相关工具,二是要有C语言或Fortran语言的编译器。
需要对MATLAB系统进行设置,使MATLAB系统知道使用系统的哪一个C语言编译器,以及其参数和路径。
MEX文件系统设置:
>> mex –setup按照提示进行,最后出现Done…系统配置完毕。
C语言MEX文件的建立
C语言MEX文件的建立
1. MEX文件的结构
a) 计算子程序
b) 入口子程序,void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]){ /*用户特定的代码….*/ }
2. 创建timestwoalt.c
#include "mex.h"
void timestwo_alt(double *y, double x)
{
*y = 2.0*x;
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
double *y;
doublex;
/* 检查参数 */
if (nrhs != 1) {
mexErrMsgTxt("One input argument required.");
} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments.");
} else if (!mxIsNumeric(prhs[0])) {
mexErrMsgTxt("Argument must be numeric.");
} else if (mxGetNumberOfElements(prhs[0]) != 1 || mxIsComplex(prhs[0])) {
mexErrMsgTxt("Argument must be non-complex scalar.");
}
/* 为输出参数创建变量 */
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
/*
为参数 x、y赋值,x为值,而y为指针
(由于MATLAB没有值传递,所以用指针才能得到修改后的y值,
不然修改的是y的一个副本,为临时变量,在函数返回时,y值没有变化,
不能得到希望的结果)
*/
x = mxGetScalar(prhs[0]);
y = mxGetPr(plhs[0]);
/* 调用timestwo_alt 子函数 */
timestwo_alt(y,x);
}
3. 编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mex timestwoalt.c生成一个名为timestwoalt.mexw32的MEX文件
4. 运行:在MATLAB的控制窗口中输入
x=2;
y=timestwoalt(x)
输出:y=4
MEX文件实现了一种C语言与MATLAB的接口,其实际的计算功能仍在C语言形式的计算子程序中完成,而入口子程序的功能是检查参数以匹配C语言的参数规范(how to?)。
当有C语言编写的大型程序时,不必用MATLAB语言重新编写,只要将此C语言程序作为一个计算子程序,然后编写一个入口子程序,完成参数的匹配,然后编译成MEX文件即可。
MEX文件的另外一个功能是可以将MATLAB编程中的瓶颈问题,如多重循环等,将此类费时的指令用C语言实现,然后作必要的入口子程序,编译成MEX文件,可以有效地提高MATLAB的效率。
S-函数创建器限制了C语言S-函数的功能:只能有一个输入信号和一个输出信号,而且只能处理double类型的数据!所以,可用性不大。
④ MATLAB 错误使用 mex
要解决相关的mex命令找不到编译器,首先就需要了解相关命令调用的配置文件的路径位于:<MatlabRoot>/bin/win64/mexopts,里面有很多和和编译器以及SDK相关的环境配置文件,如图所示。
1、matlab版本问题
标明了不同类型版本的编译器配置文件,如果编译器版本的配置信息不在这个文件夹里面自然会提示找不到到文件夹。这类问题网上有很多解决方法,提供了很多相应版本的配置文件,只要将其拷到mexopts文件夹下,就解决了。
2、配置文件里面的路径和电脑的实际路径不一致
解决方法:要仔细核对 msvc2013.xml和msvcpp2013.xml这两个配置文件的信息。
(4)matlabmex命令扩展阅读:
通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。
MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。