加载多个数据集而不覆盖变量

时间:2014-01-08 22:02:06

标签: matlab variables file-io

我有一个包含许多文件的文件夹,名为:

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? 

2 个答案:

答案 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()为类似的循环调整相同的方法。