Matlab 如何知道有一个 .mex64 文件并避免无限 "compiling" 循环

How Matlab knows there is a .mex64 file and avoid infinity "compiling" loop

我创建了一个 MyMex.m 和一个 MyMex.cpp。在 .m 中,我使用 mex 编译 .cpp。仅当 .mex64 不存在时才会发生。 .mex64 包含在 Matlab PATH 中的一个目录中。但是,如果我不将 Matlab 当前工作目录设置为 .mex64 目录,Matlab 将在无限循环中保持 运行 .m。我错过了什么?

MyMex.m:

function [dataOut] = MyMex(dataIn)

mexCppFile = 'MyMex.cpp';
mexCmd = 'mex MyMex.cpp;';

fprintf('\nFile %s not compiled yet, compiling it now...\n%s\n',mexCppFile,mexCmd);
fileFullPath = which(mexCppFile);

if size(fileFullPath,2) > 0 && exist(fileFullPath,'file')
    [fileDir, fileName, ext] = fileparts(fileFullPath);
    curDir = pwd;
    cd(fileDir);
    mex MyMex.cpp;
    cd(curDir);
else
    error('prog:input','Unable to find %s to compile it. Check if the file is in the current dir or in the Matlab PATH!',mexCppFile);
end

% Call C++ mex
[dataOut] = MyMex(dataIn)
end

编辑 来保护自己不受评论说我做了一个无限循环: Matlab 应该知道有一个函数的编译版本。我不知道它是怎么做到的,我的问题与此有关,因为有时它找到了函数,有时却找不到。

这是一个合并的在线 mex 示例,它执行相同的 "infinity" 操作并且工作顺利:

2D interpolation

他在mirt2D_mexinterp.m中的代码:

% The function below compiles the mirt2D_mexinterp.cpp file if you haven't done it yet.
% It will be executed only once at the very first run.
function Output_images = mirt2D_mexinterp(Input_images, XI,YI)

pathtofile=which('mirt2D_mexinterp.cpp');
pathstr = fileparts(pathtofile);
mex(pathtofile,'-outdir',pathstr);

Output_images = mirt2D_mexinterp(Input_images, XI,YI);

end

也许 .m 和 .mex64 需要在同一个文件夹中。

这一切都归结为 Matlab's search path。 如果 Mex 文件在路径中处于同一级别,则它们优先于 m 文件。当前目录中的文件优先于 matlab 搜索路径中其他地方找到的文件。 因此,当您遇到无限循环时,很明显 m 文件在搜索路径中的位置高于 mex 文件。

本质上,如果两个文件在同一个文件夹中,一切都很好。