6

我有一个 tab = value 格式的嵌套结构数组 t,其中 a 和 b 只是随机字符串。t 可以有任意数量的 a 作为字段名,每个 a 可以有任意数量的 b 作为字段名。我需要制作一个名为 x 的 t 副本,但设置所有 xab = 0。此外,我需要为 t 中的所有 a 创建另一个 ya = 0 形式的结构数组。现在我正在使用嵌套的 for 循环解决方案,但是如果 a 和 b 太多,它就会太慢。有人可以告诉我是否有任何方法可以矢量化此嵌套循环或此代码中的任何其他操作以使此代码运行得更快?谢谢。

names1 = fieldnames(t);
x = t;
y = {};
for i=1:length(names1)
  y.(names1{i}) = 0;
  names2 = fieldnames(x.(names1{i}));
  for j=1:length(names2)
      x.(names1{i}).(names2{j}) = 0;
  end
end 

样本:

if t is such that
t.hello.world = 0.5
t.hello.mom = 0.2
t.hello.dad = 0.8
t.foo.bar = 0.7
t.foo.moo = 0.23
t.random.word = 0.38

then x should be:
x.hello.world = 0
x.hello.mom = 0
x.hello.dad = 0
x.foo.bar = 0
x.foo.moo = 0
x.random.word = 0

and y should be:
y.hello = 0
y.foo = 0
y.random = 0
4

2 回答 2

2

您可以通过使用structfun摆脱所有循环

function zeroed = always0(x)
  zeroed = 0;
endfunction

function zeroedStruct = zeroSubfields(x)
   zeroedStruct = structfun(@always0, x, 'UniformOutput', false);
endfunction

y = structfun(@always0, t, 'UniformOutput', false);
x = structfun(@zeroSubfields, t, 'UniformOutput', false); 

如果您有任意嵌套的字段 zeroSubfields 可以扩展到

function zeroedStruct = zeroSubfields(x)
   if(isstruct(x))
     zeroedStruct = structfun(@zeroSubfields, x, 'UniformOutput', false);
   else
     zeroedStruct = 0;
   endif
endfunction
于 2013-03-04T01:59:04.347 回答
0

要构造y,您可以执行以下操作:

>> t.hello.world = 0.5;
>> t.hello.mom = 0.2;
>> t.hello.dad = 0.8;
>> t.foo.bar = 0.7;
>> t.foo.moo = 0.23;
>> t.random.word = 0.38;
>> f = fieldnames(t);
>> n = numel(f);
>> fi = cell(1,n*2);
>> fi(1:2:(n*2-1)) = f;
>> fi(2:2:(n*2)) = num2cell(zeros(n,1))
fi = 
    'hello'    [0]    'foo'    [0]    'random'    [0]
>> y = struct(fi{:})
y = 
     hello: 0
       foo: 0
    random: 0

基本上,您只是获取字段名,将它们与单元格数组中的零交错,然后从该单元格数组中直接使用逗号分隔的字段名和值列表构造结构。

对于x,我认为您仍然需要遍历第一级字段名。但是您应该能够在每次循环迭代中执行与上述类似的操作。

于 2013-03-01T11:13:47.987 回答