У меня есть папка, содержащая несколько файлов с именем:

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
siegel 9 Янв 2014 в 02:02

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, но, вероятно, это перебор.

2
Pursuit 8 Янв 2014 в 23:01

Было бы намного проще сделать это прямо в цикле:

...
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().

1
Notlikethat 8 Янв 2014 в 22:12