Загрузите несколько файлов .mat в рабочее пространство Matlab

Я пытаюсь загрузить несколько файлов .mat в рабочую область. Однако они, кажется, перезаписывают друг друга. Вместо этого я хочу, чтобы они добавлялись. Я знаю, что могу сделать что-то вроде:

S=load(file1)
R=load(file2)

и т.п.

а затем добавить переменные вручную.

Но есть масса переменных, и делать оператор добавления для каждой крайне нежелательно (хотя возможно в крайнем случае). Есть ли способ загрузить файлы .mat в рабочую область (используя команду load() без назначения) и добавить их?


person CHP    schedule 16.07.2012    source источник
comment
Под тем, что они, кажется, перезаписывают друг друга, вы имеете в виду, что в этих файлах .mat есть одно и то же имя переменной? Если это так, то ничего нельзя сделать, кроме как загрузить файлы один за другим, а затем переименовать переменную, которая является общей для обоих файлов, а затем загрузить следующий файл.   -  person TJ1    schedule 16.07.2012
comment
Да, это то, что я имею в виду. Ну это отстой. Но спасибо   -  person CHP    schedule 16.07.2012


Ответы (3)


Не совсем понятно, что вы подразумеваете под «добавить», но вот способ загрузить данные в формат, с которым должно быть легко справиться:

file_list = {'file1';'file2';...};
for file = file_list'
    loaded.(char(file)) = load(file);
end

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

person tmpearce    schedule 16.07.2012
comment
Это не совсем тот ответ, который я хотел, но, вероятно, следующий лучший ответ, учитывая, что то, что я хочу, не может быть сделано. Я пойду и приму это. - person CHP; 17.07.2012
comment
Как только все будет загружено, вы можете использовать fieldnames, чтобы выяснить все различные переменные, которые вы загрузили в структуру. Затем вы можете eval поместить их в рабочую область (а не только в структуру), добавляя (как бы вы это ни определяли) по мере необходимости. - person tmpearce; 17.07.2012

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

function var = loadCat( dim, files, varname )
%LOADCAT Concatenate variables of same name appearing in multiple MAT files
%  
%   where dim is dimension to concatenate along,
%         files is a cell array of file names, and
%         varname is a string containing the name of the desired variable

    if( isempty( files ) )
        var = [];
        return;
    end
    var = load( files{1}, varname );
    var = var.(varname);

    for f = 2:numel(files),

        newvar = load( files{f}, varname );
            if( isfield( newvar, varname ) )
                var = cat( dim, var, newvar.(varname) );
            else
                warning( 'loadCat:missingvar', [ 'File ' files{f} ' does not contain variable ' varname ] );
            end
        end 

    end
person Clark    schedule 09.10.2012

Ответ и функция Кларка на самом деле идеально решили мою ситуацию... Я просто добавил следующий фрагмент кода, чтобы сделать его немного менее утомительным. Просто добавьте это в начало и избавьтесь от аргумента «файлы»:

[files,pathname] = uigetfile('*.mat', 'Select MAT files (use CTRL/COMM or SHIFT)', ...
   'MultiSelect', 'on'); 

В качестве альтернативы, было бы еще эффективнее просто начать с этого бита:

[pathname] = uigetdir('C:\');
files = dir( fullfile(pathname,'*.mat') );   %# list all *.mat files
files = {files.name}';                       %# file names

data = cell(numel(files),1);                 %# store file contents
for i=1:numel(files)
    fname = fullfile(pathname,files{i});     %# full path to file
    data{i} = load(fname);                   %# load file
end

(изменено из обрабатывать список файлов с определенным именем расширения в Matlab).

Спасибо, Джейсон

person jason    schedule 04.06.2013