Matlab 无循环访问结构中的数据
我有一组字符串Matlab 无循环访问结构中的数据,matlab,struct,anonymous-function,Matlab,Struct,Anonymous Function,我有一组字符串vals,例如: vals = {'AD', 'BC'} 我还有一个结构info,其中的结构嵌套在与数组vals中的元素相对应的字段中(在本例中为'AD'和'BC'),每个结构依次在名为lastcontract的字段中存储一个数字 我可以使用for循环为每个VAL提取lastcontract,如下所示: for index = 1:length(vals) info.(vals{index}).lastcontract end 如果可能的话,我想找到一种不用循环的方法,
vals
,例如:
vals = {'AD', 'BC'}
我还有一个结构info
,其中的结构嵌套在与数组vals
中的元素相对应的字段中(在本例中为'AD'和'BC'),每个结构依次在名为lastcontract
的字段中存储一个数字
我可以使用for
循环为每个VAL
提取lastcontract
,如下所示:
for index = 1:length(vals)
info.(vals{index}).lastcontract
end
如果可能的话,我想找到一种不用循环的方法,但是我运气不好。我试过:
info.(vals{1:2}).lastcontract
没有成功。我认为
arrayfun
可能是合适的方式,但我无法找出正确的语法。在这里,实际上可以在没有显式循环的情况下进行管理(或者arrayfun
/cellfun
):
p.Scellfun
在这里比arrayfun
更合适,因为您迭代vals
(单元格数组)。为了便于练习,这里有一个使用cellfun
的解决方案:
C = struct2cell(info); %// Convert to cell array
idx = ismember(fieldnames(info), vals); %// Find fields
C = [C{idx}]; %// Flatten to structure array
result = [C.lastcontract]; %// Extract values
result = cellfun(@(x)info.(x).lastcontract, vals);
arrayfun
是一个隐藏循环,比显式循环慢。不要害怕for
循环。有时它们是完美的,甚至是最合适的解决方案。@OlegKomarov,但对于简单的解决方案,它们可能很方便-liners@GuntherStruyf事实上,这就是他们的目的(也许还有一些JIT方面的考虑)。现在我想起来了,为什么arrayfun和类似的产品一开始就被引入呢?非常聪明,但是这种内存和性能方面的效率有多高?