【问题标题】:Loading multiple .mat files containing the same variable name and changing the variable names simultaneously?加载包含相同变量名的多个 .mat 文件并同时更改变量名?
【发布时间】:2015-06-24 19:39:25
【问题描述】:

所以我有一个包含许多 .mat 文件的目录:

apples.mat、oranges.mat、bananas.mat、grapes.mat、apricots.mat、pears.mat、pineapple.mat

所有这些 .mat 文件都有一个变量名“卡路里”,并为其赋值。如何在 MATLAB 中同时加载所有这些 .mat 文件并将每个变量的变量从卡路里更改为卡路里_(水果名称),以便我可以在工作区中使用所有变量值?

例如,我想加载 apples.mat 并将其变量名从卡路里更改为卡路里苹果,然后加载 oranges.mat 并将变量名更改为卡路里橙色等,而无需手动完成所有操作。

我知道这类似于创建具有不同水果名称的字符串,以及沿字符串索引以加载文件并将其变量从变量更改为变量_%s,其中 %s 指示生成的水果内容循环。这对我来说是一团糟,但是,我认为我的结构不正确。有人愿意帮助我吗?

【问题讨论】:

    标签: matlab file mat


    【解决方案1】:

    我会按顺序加载每个.mat 文件,并将每个相应的卡路里作为一个单独的字段全部组合成一个struct 供您访问。鉴于这些 .mat 文件出现的目录,请执行以下操作:

    %// Declare empty structure
    s = struct()
    folder = '...'; %// Place directory here
    
    %// Get all MAT files in directory
    f = dir(fullfile(folder, '*.mat'));
    
    %// For each MAT file...
    for idx = 1 : numel(f)
    
        %// Get absolute path to MAT file - i.e. folder/file.mat
        name = fullfile(folder, f(idx).name);
    
        %// Load this MAT file into the workspace and get the calories variable
        load(name, 'calories');
    
        %// Get the name of the fruit, are all of the characters except the last 4 (i.e. .mat)
        fruit_name = f(idx).name(1:end-4);
    
        %// Place corresponding calories of the fruit in the structure
        s.(['calories_' fruit_name]) = calories;
    end
    

    然后您可以使用点符号访问每个卡路里:

    c = s.calories_apple;
    d = s.calories_orange;
    
    ...
    ...
    

    ...等等。

    【讨论】:

    • 耶结构和动态字段引用为胜利! +1
    • @Benoit_11 - Merci mon ami :) Ça me fait grand plaisir pour lire tes réponses dans le puissance des images。无敌!
    • 恭喜恭维! Pareillement pour toi :)
    • 我的问题是名称太长而被截断。
    • 好样的@rayryeng! Merci de l'invitation je vais aller faire un tour :)
    【解决方案2】:

    我假设您并不是要在calories_(fruit name) 中包含括号。我还假设您的当前目录中没有其他 .mat 文件。这应该可以解决问题:

    theFiles = dir('*.mat');
    for k = 1:length(theFiles)
        load(theFiles(k).name, 'calories');
        eval(['calories_' theFiles(k).name(1:length(theFiles(k).name)-4) ' =  calories;'])
        clear calories
    end
    

    让我知道这是否有帮助。

    编辑 正如 rayryeng 指出的那样。显然,使用 eval 是一种不好的做法。所以,如果你愿意改变思考问题的方式,我建议你使用结构。在这种情况下,rayryeng 的回答将是一个可以接受的答案,即使它没有直接回答您的原始问题。

    【讨论】:

    • 仅供参考,使用eval 被认为是不好的做法。我不会投反对票,但是在 MATLAB 标记中的 StackOverflow 上,不鼓励这种做法的地方有很多追随者。您可能会收到这些人的反对票。请参阅 Loren Shure 的这篇内容丰富的帖子,了解为什么您不应该在此处使用 evalblogs.mathworks.com/loren/2006/01/04/more-in-eval
    • 对不起,我应该在这里链接:blogs.mathworks.com/loren/2005/12/28/evading-eval - 顺便说一句,我很欣赏编辑。
    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 2019-10-02
    • 2015-09-17
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2015-09-05
    • 2012-02-19
    相关资源
    最近更新 更多