在 MATLAB 中查找当前脚本(mlx 文件)的位置

KLJ*_*KLJ 7 directory matlab cd

我正在许多不同的位置处理我的 MATLAB 代码,如果我能让代码知道它在计算机上的位置,那将非常有帮助。到目前为止,我一直在使用 .m 文件。对于 .m 文件,我找到了以下解决方案:

%example 1    
cd(fileparts(mfilename('fullpath')))
Run Code Online (Sandbox Code Playgroud)

或者

%example 2
tmp = matlab.desktop.editor.getActive;
cd(fileparts(tmp.Filename));
Run Code Online (Sandbox Code Playgroud)

或者

%example 3
S = dbstack('-completenames');
S(1).file
Run Code Online (Sandbox Code Playgroud)

或者

%example 4
which(mfilename)
Run Code Online (Sandbox Code Playgroud)

但是在 MATLAB 2016a 中,有一个名为 live script 的新功能。这样一来,这些解决方案就不再起作用了。

%For example I would like to do something like this
cd(MLX_FILELOCATION);
%or
which(mlxfilename)
Run Code Online (Sandbox Code Playgroud)

编辑 III:问题:我无法获得当前打开/执行的 MATLAB 文件的路径/文件位置或名称。使用 *.m-files 这可以通过上面的示例实现。使用 *.mlx-files 它是不可能了。我更喜欢使用 *.mlx-files 而不是 *.m-files。)

在 *.mlx 文件中执行的上述示例的输出:

%example1: mfilename returns the path to the 'MatlabEvaluationHelper' in the 'AppData\Local\Temp'-folder
%example2: output is an empty array
%example3: same output as example1
%example4: same output as example1, because mfilename returns "MatlabEvaluationHelper"
Run Code Online (Sandbox Code Playgroud)

编辑 I: 我的第一个目标是将“当前文件夹”(->“cd”)更改为正在运行的脚本的路径。为什么:在与 mlx 文件相同的文件夹中,我有例如带有数据的 .csv 文件。例如到明天我有新文件夹。我复制了 mlx_file,现在我想确保我不使用昨天的 csv 文件(因为昨天的当前文件夹显示在 MATLAB 的文件浏览器中)-> 所以我想更改“当前文件夹”,只需将 mlx 文件复制到新文件夹中即可。

如果有更好的做法,请告诉我。

谢谢你的帮助

编辑 II: 使用的工作流示例:我编写了一个 MATLAB 脚本。将其保存在文件夹“Dataset_ONE”中。此外,我将“Dataset_ONE.csv”文件复制到同一文件夹中。例如,我现在创建一个图并将其另存为“Dataset_ONE”文件夹中的“*.png”。第二天我可能会有第二个(一个新的和不同的)数据集“Datasset_TWO”。我创建了一个新文件夹“Dataset_TWO”。将 MATLAB 文件复制到新文件夹。在那里打开 MATLAB 文件。然后,由于默认设置,MATLAB 已将“当前文件夹”更改为我打开 MATLAB 的新文件夹。但是如果我现在再次打开第一个文件夹中的 MATLAB 脚本(同时打开另一个数据集 MATLAB 脚本),我必须小心当前文件夹。

Tas*_*nou 1

如果您想要某种方法来防止您在没有意识到的情况下对错误的数据运行错误的脚本,那么您可以在每个脚本的顶部添加一条安全指令,如果当前目录与当前目录不同,则会抛出错误您正在运行的脚本的位置。例如

>> assert (strcmp (pwd, '/absolute/path/to/my/script'));
Run Code Online (Sandbox Code Playgroud)

至于加载正确的数据/保存到正确的位置,只需使用绝对路径加载和保存,就不会出现混乱。