加载包含相同变量名的多个.mat文件并同时更改变量名称?

时间:2015-06-24 19:39:25

标签: matlab file mat

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

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

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

例如,我想加载apples.mat并将其变量名称从卡路里更改为calories_apple,然后加载oranges.mat并从calories_orange更改为变量名等,而不是手动完成所有操作。

我知道这有点像创建一个包含不同水果名称的字符串,以及沿着字符串索引以加载文件并将其变量从变量更改为variable_%s,%s表示生成的水果内容循环。对我来说这是一个很大的混乱,但是,我不认为我正在构建它。有人愿意帮助我吗?

2 个答案:

答案 0 :(得分:3)

我会按顺序加载每个.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 :(得分:0)

我假设你不是要在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的回答将是一个可接受的答案,即使它没有直接回答你原来的问题。