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

mu0hgdu0  于 2023-10-23  发布在  Matlab
关注(0)|答案(2)|浏览(247)

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

%example 1    
cd(fileparts(mfilename('fullpath')))

%example 2
tmp = matlab.desktop.editor.getActive;
cd(fileparts(tmp.Filename));

%example 3
S = dbstack('-completenames');
S(1).file

%example 4
which(mfilename)

但是在MATLAB 2016 a中,有一个新的功能叫做live script。这样一来,这些解决方案就不再有效了。

%For example I would like to do something like this
cd(MLX_FILELOCATION);
%or
which(mlxfilename)

编辑三:问题:我无法获取当前打开/执行的MATLAB文件的路径/文件位置或名称。对于 *.m-files,可以使用上面的示例。对于 *. mlx文件,这不再可能。我更倾向于使用 *. mlx文件而不是 *.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"

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

如果有更好的做法,请让我知道。
谢谢你帮

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

kkbh8khc

kkbh8khc1#

如果你想要的是某种方式来防止你在错误的数据上运行错误的脚本而没有意识到,那么你可以在每个脚本的顶部添加一个安全指令,如果你的当前目录与你正在运行的脚本的位置不一样,就会抛出一个错误。例如

>> assert (strcmp (pwd, '/absolute/path/to/my/script'));

至于加载正确的数据/保存到正确的位置,只需使用绝对路径加载和保存,不应该有混淆。

carvr3hs

carvr3hs2#

至少在MATLAB 2023 b中,您的“示例2”现在可以在Live SDK中工作。
运行

>> temp = matlab.desktop.editor.getActive
>> f = temp.Filename

将检索当前Live Script到f的绝对路径。即使只运行Live Script中的单个单元格,也可以正常工作--MatlabEvaluationHelperLiveEditorEvaluationHelper*不再复杂。
现在也可以简称为

>> f = matlab.desktop.editor.getActiveFilename

看到

>> doc matlab.desktop.editor.getActiveFilename

获取更详细的文档。

相关问题