在matlab中有效地从复杂的嵌套结构中删除一组特定的元素

时间:2014-07-10 14:18:37

标签: matlab structure bigdata

我在MATLAB中有一个复杂的嵌套结构: a.b.c,a.b.d,a.b.e ... a.b.p a有4个元素,b有90个,c有可变数量的元素 我想删除例如:c,d,e,f,.... p的5个元素,用于特定的b(i) 如何在一个命令中或最有效地执行此操作而无需记下

a(1).b(i).c(5)=[];....
a(1).b(i).p(5)=[];

1 个答案:

答案 0 :(得分:2)

我认为如果没有循环子结构的元素,这是不可能的,除非你想将更改应用于给定级别的所有元素


选择元素
使用动态字段名称循环遍历元素子集的解决方案

ai=1;                 % first level index
bi=2;                 % second level index
rem=[1,5]             % elements to remove

for ci='c':'p'        % field names to change
    a(ai).b(bi).(ci)(rem)=[];
end

适用于所有元素
从所有a(1).b(2)

中删除第1列和第5列的示例
ia=1;  % a index
ib=2;  % b index
rem=[1,5]; % columns to remove
a(ia).b(ib)=structfun(@(a)a(setdiff(1:end,rem)),a(ia).b(ib),'unifo',0)

注意:不会删除元素但会覆盖结构的修改部分而忽略要删除的元素

行是什么

a(ia).b(ib)=structfun(@(a)a(setdiff(1:end,rem)),a(ia).b(ib),'unifo',0)

                            setdiff(1:end,rem)            % elements not in rem
                      @(a)a(                  )           % get these elements of
            structfun(                         ,a(ia).b(ib)   % this sub array
a(ia).b(ib)=                                                  % and overwrite it

最后,'unifo',0)告诉matlab @(a)a(setdiff(1:end,rem))的输出不是单个值,即仍为向量