2014-01-08 37 views
0

多个数据集我有一个包含的文件,命名的文件夹:载入而不覆盖可变

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

当然。您可以将数据加载到变量中,然后以变量中的字段的形式访问文件的内容。与您的示例开始,这将是这个样子:

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

这将是更容易只是做它直接在循环:

... 
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()类似的循环相同的方法。