所以我有一个包含许多.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表示生成的水果内容循环。对我来说这是一个很大的混乱,但是,我不认为我正在构建它。有人愿意帮助我吗?
答案 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的回答将是一个可接受的答案,即使它没有直接回答你原来的问题。