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.S
cellfun
在这里比
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和类似的产品一开始就被引入呢?非常聪明,但是这种内存和性能方面的效率有多高?