【问题标题】:MATLAB - Unsure of fullfile command syntax for path locationMATLAB - 不确定路径位置的完整文件命令语法
【发布时间】:2016-04-27 01:52:53
【问题描述】:

这是我正在处理的一段代码,基于之前评论中的另一个示例。

在第一行中,我的路径是什么?

我是一直延伸回 Macintosh HD/Users/..../Documents/MATLAB(该路径中的 MATLAB 文件夹是我正在分析的 ascii 文件的存储位置)还是从另一个点开始?

我只是不确定用下面的示例替换pathtofolder

我更加困惑,因为我的 MATLAB 窗口中显示的当前 dir 是存储我正在使用的文件的正确位置。

在这种情况下,我该如何处理fullfile 行?我也在尝试显示新截断的文件的内容。我怎么做?谢谢!

folder = fullfile('path', 'to', 'folder');

  f = dir(fullfile(folder, '*.asc'));
  matrices = struct();
     for ii = 1 : numel(f)
         name = fullfile(folder, f(ii).name);
         O = dlmread(name);
         matrices.(f(ii).name) = O(1:80,:);
     end

【问题讨论】:

  • 如果MATLAB目录下有数据,或许可以使用userpath

标签: matlab path directory data-storage


【解决方案1】:

正如文档所述,fullfile 允许您从文件的各个部分构造文件名,而不必担心是否使用 / 或 \ 作为文件分隔符,也无需按照旧的非常混乱的方式进行操作

filename = ['path' filesep 'to' filesep 'files'];

甚至更糟!

folder = '/path/to/file';

如果您尝试在操作系统之间切换,您会遇到各种各样的问题。

在您提供的示例中,它可能是

folder = fullfile('Users', 'Documents', 'MATLAB')

旁注:请不要将您的数据实际存储在该文件夹中

如果您尝试加载的文件位于当前目录中,则您是正确的,那么您不需要folder 变量,因为如果您只输入dlmread(filename) 它就可以工作。

问题在于,要求用户必须在特定目录中才能运行您的代码,并且用户可能不清楚那是哪个文件夹。您提供的代码更健壮,因为它不依赖于您的当前目录。在我看来,最好的做法是永远不要依赖当前目录。在我看来,没有什么比看到有人在 MATLAB 中更改目录以访问他们的数据更糟糕的了!

所以请记住 fullfile 的作用,我将在下面注释您的代码

folder = fullfile('path', 'to', 'folder');

存储数据所在的路径。这可以是绝对路径(如您在问题中所述)'/Users/blah/data' 或相对于当前目录 'data' 的路径(如果您的数据位于 fullfile(pwd, 'data') 中)。前者是我的首选方法。

f = dir(fullfile(folder, '*.asc'));

这会调用dir 来查找该文件夹中扩展名为.asc 的所有文件/文件夹。

name = fullfile(folder, f(ii).name);

这一行构造了感兴趣文件的绝对路径,因为dir 只返回文件名,而不是它所在的文件夹(我最大的烦恼之一)。

O = dlmread(name);

那么显然这会使用提供的完整路径读取您的实际文件。

同样,这里真正的好处是您不必在特定目录中执行此代码。

所以直接回答你的问题,现在你已经知道了这一切。如果您的数据位于当前目录中,您可以folder 设置为当前目录

folder = pwd;

或者如果你想善待他人和未来的自己,你可以指定一个绝对路径(最好作为函数参数传递而不是硬编码)

function matrices = getfiles(folder)
    f = dir(fullfile(folder, '*.asc'));
    matrices = struct();
    for ii = 1 : numel(f)
        name = fullfile(folder, f(ii).name);
        O = dlmread(name);
        matrices.(f(ii).name) = O(1:80,:);
    end
end

matrices = getfiles(fullfile('user', 'defined', 'path', 'to', 'data'));

【讨论】:

  • 好的,如果我只做替换文件夹 = fullfile('path', 'to', 'folder');使用文件夹 = pwd,解决了我的目录混乱。但是现在我如何确认(通过显示?)这段代码实际上只按预期保存了前 80 行?谢谢!
  • @Svet 我建议您阅读整个答案,这样您就可以理解为什么简单地设置folder = pwd 可能是个坏主意。
  • @Svet 直到前 80 行,这就是这条线的作用matrices.(f(ii).name) = O(1:80,:);。您可以自己尝试验证。
  • 好的,是的,使用 folder = fullfile('Users',... 'MATLAB') 是最好的选择,假设我不会为这个特定的例程将数据移出该文件夹.现在为什么它给我一个 Invalid field name: 'filename.asc' 错误,一旦我运行这个例程?如果我删除该文件,它会转到文件夹中的下一个文件并说同样的话,所以这不是一个文件错误。我试图在这个例程中使用的所有 ascii 文件似乎都是一个错误!
  • @Svet 是的,这个函数并没有实际验证这些文件是否有效。它假定所有 .asc 文件都是有效的
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2014-04-18
相关资源
最近更新 更多