将中间级别插入嵌套的struct数组中

the*_*alk 9 matlab struct vectorization

我想按如下方式重新排序结构:

%// original struct
s(1).a = rand(10,1);
s(2).a = rand(10,1);
s(1).b = rand(10,1);
s(2).b = rand(10,1);

%// reorder to:
y(1).a = s(1).a;
y(2).a = s(2).a;
y(1).b.c = s(1).b;
y(2).b.c = s(2).b;
Run Code Online (Sandbox Code Playgroud)

以下嵌套循环有效:

fieldToMove = 'b';
newFieldname = 'c';

fn = fieldnames(s);

for ii = 1:numel(fn)

    for jj = 1:numel(s)
        if strcmp(fn{ii},fieldToMove)
            y(jj).(fn{ii}).(newFieldname) = s(jj).(fn{ii});
        else
            y(jj).(fn{ii}) = s(jj).(fn{ii});
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

但这似乎对我来说太过分了.任何想法如何优化或简化它?


我使用临时值进行了大量实验,删除了原始字段rmfield并设置了新字段setfield,但是到目前为止还没有任何工作,因为标量结构总是需要.我有什么功能可以忽略吗?

gno*_*ice 2

一种选择是使用arrayfunandsetfield像这样:

y = s;
y = arrayfun(@(s) setfield(s, 'b', struct('c', s.b)), y);
Run Code Online (Sandbox Code Playgroud)

另一种选择是分发修改后的字段b

y = s;
temp = num2cell(struct('c', {y.b}));
[y.b] = temp{:};
Run Code Online (Sandbox Code Playgroud)