我在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)=[];
答案 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)
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))
的输出不是单个值,即仍为向量