Извлечение структур в цикле - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть структура («данные») с 26 полями (A, B, C, D и т. Д. c.). Каждое поле содержит 1x30 ячеек (по одной для каждого участника), а каждая ячейка содержит структуру. Я хотел бы извлечь все структуры (т.е. одну структуру на поле), соответствующие каждому участнику. То есть я хотел бы получить 30 новых «данных», каждое из которых содержит 26 полей, а каждое поле содержит структуру 1x1, причем структура соответствует участнику. Я пробовал следующий код:

data = load('D:\filepath\mydata.mat'); %load file with data. 1x1 struct.
all_fields = fieldnames(data); %store the fields of the structure. 26x1 cell.

forStr = length(all_fields); %26
n_ppts = 30; %total number of participants.

%for each participant, extract the corresponding structure in each field.
for nn = 1:n_ppts 
    for idx_field = 1:forStr
        name_field = all_fields{idx_field};
        data2 = data;
        data2.(name_field) = data.(name_field){nn};
    end

    %save the 'data' for each participant. The 'data' should include 26 fields, and 1 structure for each field.
    name = ppt_fname(nn);  %Generate the new name for saving
    savename =string(regexprep(name,'_oldname.set','_newname.mat'));
    save(savename, '-struct', 'data');
end

Код не дает никакой ошибки. Тем не менее, это не работает, как я ожидал. «data2» по-прежнему содержит 26 полей, но только последнее поле содержит 1 структуру, соответствующую участнику. Другие поля содержат ячейку 1x30. Я думаю, это потому, что каждый раз, когда я запускаю l oop, он перезаписывает предыдущие поля, оставляя только последнее поле правильным. Итак, я думаю, что мне может понадобиться временная переменная для хранения каждой итерации l oop.

Я думал создать временное хранилище для каждого поля

structure = [];
namelist = {‘A’;’B’;’C’;’D’;’E’;’F’;’G’;’H’;’I’;’J’;’K’;’L’;’M’;’N’;’O’;’P’;’Q’;’R’;’S’;’T’;’U’;’V’;’W’;’X’;’Y’;’Z’};
for i = 1:length(namelist)
    structure.(namelist{i})={};
end

Но не могу выяснить, как заставить это работать.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Вам нужно вывести строку data2 = data; из цикла for.

0 голосов
/ 12 февраля 2020

Антуан Т прав, вы всегда копируете исходную структуру data снова в data2 в каждом l oop. Вот почему он не будет изменен (за исключением самого последнего шага l oop, где вы добавляете к нему одно имя поля).

По поводу вашей другой проблемы:

% create empty struct:
S = struct();
% loop
for i = 1:25
    % create field name
    nm = char( double('A') +i );
    % create new field with empty cell.
    S.(nm) = {};
end

Просто приятно конвертировать числа в символы в качестве имен полей. Ваша основная ошибка заключалась в том, что вы использовали неправильную кавычку для создания символов. Небольшим недостатком было то, что вы выделили strucutre = [] как пустую матрицу, а не как пустую структуру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...