2010-11-11 3 views
2

У меня есть тонна данных, которые необходимо обработать из лабораторных работ. У меня есть тонна файлов .mat, которые содержат сигнальную матрицу размером 7 x w. Мне нужно изменить размер матрицы на 7 x N и w больше и меньше N, чтобы облегчить остальную часть анализа (не заботятся о данных за N). У меня есть psuedocode того, как я хочу, чтобы это работало, но не знаю, как его реализовать. Любая помощь будет большой благодарностью!автоматизация загрузки нескольких файлов * .mat и изменение размера матрицы

структура папок всех моих данных:

Главная папка

Alpha 1 
    1111.mat 
    1321.mat 
Alpha 2 
    1010.mat 
    1234.mat 
    1109.mat 
    933.mat 
Alpha 3 
    1223.mat 

т.д.

Psudeocode:

Master_matrix = [] 
    For all n *.mat 
     Load n'th *.mat from alpha 1 
     If w > N 
      Resize matrix down to N 
     Else 
      Zero pad to N 
     End if 
    Master_matrix = master_matrix .+ new resized matrix 
    End for 

rest of my code... 

ответ

2

Прежде всего, необходимо создать список файлов. У меня для этого есть моя собственная функция, но есть, например, GETFILELIST или отличный интерактивный UIPICKFILES для генерации списка файлов.

После того, как у вас есть список файлов (я предполагаю, что это массив ячеек, содержащий имена файлов), вы можете сделать следующее:

nFiles = length(fileList); 
Master_matrix = zeros(7,N); 

for iFile = 1:nFiles 
    %# if all files contain a variable of the same name, 
    %# you can simplify the loading by not assigning an output 
    %# in the load command, and call the file by 
    %# its variable name (i.e. replace 'loadedData') 
    tmp = load(fileList{iFile}); 
    fn = fieldnames(tmp); 
    loadedData = tmp.(fn{1}); 

    %# find size 
    w = size(loadedData,2); 

    if w>=N 
     Master_matrix = Master_matrix + loadedData(:,1:N); 
    else 
     %# only adding to the first few columns is the same as zero-padding 
     Master_matrix(:,1:w) = Master_matrix(:,1:w) = loadedData; 
    end 
end 

Примечание: В случае, если вы на самом деле не хотите, чтобы сложить данные, но просто сохраните его в главном массиве, вы можете сделать Master_matrix в массив 7-на-N-by-nFiles, где n-я плоскость Master_matrix является содержимым n-го файла. В этом случае, вы бы инициализировать Master_matrix, как

Master_matrix = zeros(7,N,nFiles); 

и вы бы написать if-условие, как

if w>=N 
     Master_matrix(:,:,iFile) = Master_matrix(:,:,iFile) + loadedData(:,1:N); 
    else 
     %# only adding to the first few columns is the same as zero-padding 
     Master_matrix(:,1:w,iFile) = Master_matrix(:,1:w,iFile) = loadedData; 
    end 

отметить также, что вы можете инициализировать Master_matrix в NaN вместо zeros, так что нули не влияют на последующую статистику (если это то, что вы хотите делать с данными).

Смежные вопросы