2014-01-08 76 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()類似的循環相同的方法。