автоматическая загрузка нескольких файлов *.mat и изменение размера матрицы

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

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

Основная папка

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

и т. д.

Псевдокод:

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

person khop    schedule 11.11.2010    source источник


Ответы (1)


Сначала вам нужно создать список файлов. У меня есть для этого своя функция, но есть, например, 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 на n файлов, где 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, чтобы нули не влияли на последующую статистику (если это то, что вы хотите сделать с данными).

person Jonas    schedule 11.11.2010