提取循环中的结构

问题描述 投票:-1回答:2

我有一个结构('数据'),具有26个字段(A,B,C,D等)。每个字段包含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的单元格。我猜是因为每次运行循环时,它都会覆盖先前的字段,而仅保留最后一个字段正确。因此,我认为我可能需要一个临时变量来存储循环的每次迭代。

我想为每个字段创建一个临时存储区>

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

但是无法弄清楚如何使之工作。

我有一个结构('数据'),具有26个字段(A,B,C,D等)。每个字段包含1x30单元(每个参与者一个),每个单元包含一个结构。我想提取所有...

matlab loops save structure
2个回答
1
投票

您需要将data2 = data;行从for循环中删除。


0
投票

[Antoine T是正确的,您总是在每个循环中再次将原始结构data复制到data2。这就是为什么它不会被更改的原因(除了循环的最后一步,您在其中添加了单个字段名称。)

© www.soinside.com 2019 - 2024. All rights reserved.