我有一个包含许多文件的文件夹,名为:
filename_1.mat
filename_2.mat
.
.
.
filename_n.mat
每个文件都包含一个名为Var
的数据集,其列相同。我想将所有这些数据集加载到工作区中并使用vertcat()
来垂直连接它们,但是当我在for循环中加载它们时,我只获取最后一个数据集,因为变量Var
被覆盖。这些数据集是在for循环中创建的:
% generate filenames
tss = arrayfun(@(x){sprintf('filename_%d',x)},1:(length(1:3)))';
namerr = cell((length(1:3)),1);
namerr(:,1) = {'E:\FILES\'};
file_names = strcat(namerr,tss,'.mat');
% create datasets and save them to E:\FILES
for ii = 1:3
a = rand(1,5)';
b = rand(1,5)';
Var = dataset({[a,b],'a_name','b_name'});
save(file_names{(ii)},'Var','-v6')
end
% Now read these datasets into workspace and concatenate vertically??
% Is there a way for me to name the datasets `Var_1...Var_n`
% so they are not overwritten?
答案 0 :(得分:2)
不确定。您可以将数据加载到变量中,然后将文件的内容作为变量中的字段进行访问。从您的示例开始,这看起来像这样:
loadedData_1 = load(file_names{1})
loadedData_2 = load(file_names{2})
loadedData_3 = load(file_names{3})
mergedData = [...
loadedData_1.Var; ...
loadedData_2.Var; ...
loadedData_3.Var ];
您可以使用循环来清理它:
for ix = 3:-1:1 %Load all data, backwards to force preallocation
loadedData(ix) = load(file_names{ix});
end
mergedData = cat(1,loadedData.Var);
或者,如果你真的想要超越顶部,我认为你可以使用arrayfun
在一条长线上完成它,但这可能会超过顶部。
答案 1 :(得分:1)
直接在循环中执行它会容易得多:
...
Varcat = [];
for ii = 1:3
a = rand(1,5)';
b = rand(1,5)';
Var = dataset({[a,b],'a_name','b_name'});
Varcat = [Varcat; Var];
save(file_names{(ii)},'Var','-v6')
end
Var = Varcat;
如果您确实想要在以后或程序的其他部分中执行此操作,希望很明显如何使用load()
为类似的循环调整相同的方法。