2015-08-26 106 views
0

考虑一个MATLAB结构用Matlab“联盟”功能,我有一个环比的字段名如下:在一个循环

scenario = fieldnames(myStruct) 
for scenarioidx = 1:length(scenario) 
    scenarioname = scenario{scenarioidx}; 
    category = fieldnames(myStruct.(scenarioname)) 
    for categoryidx = 1:length(category) 
     categoryname = category{categoryidx}; 
     entity = fieldnames(myStruct.(scenarioname).(categoryname)) 
    end 
end 

这个循环返回我对每个类别的实体。现在,我想将所有这些实体合并到一个向量中。我试图用“联盟”的功能如下:

scenario = fieldnames(myStruct) 
for scenarioidx = 1:length(scenario) 
    scenarioname = scenario{scenarioidx}; 
    category = fieldnames(myStruct.(scenarioname)) 
    for categoryidx = 1:length(category) 
     categoryname = category{categoryidx}; 
     allEntity = {} 
     entity = fieldnames(myStruct.(scenarioname).(categoryname)) 
     combo_entity = union (allEntity, entity) 
    end 
end 

不幸的是,这只是返回相同的结果之前,而不是结合东西。 有没有人有关于如何在这样的循环中实现联合功能的任何想法?

回答

1

简单:

struct_entities = structfun(@struct2cell, myStruct, 'UniformOutput', false); 
    cell_entities = struct2cell(struct_entities); 
    all_entities = unique(vertcat(cell_entities{:})); 

的想法是:

  • 检索单位和放弃的类别名称;
  • 也放弃了场景名称,因为它们不是必需的;
  • 将累积的实体组装在单个单元格数组中。

如果需要使用工会的,那么代码可以被改写为:

all_entities = {}; 

scenarios = fieldnames(myStruct); 
for si = 1:numel(scenarios) 
     categories = fieldnames(myStruct.(scenarios{si})); 
     for ci = 1:numel(categories) 
       entities = fieldnames(myStruct.(scenarios{si}).(categories{ci})); 
       all_entities = union(all_entities, entities); 
     end; 
end; 
+0

谢谢你这样做的工作!不幸的是我需要在这个循环中实现联合功能! – steve

+0

@steve我不明白。当你说你想*实现*'union'时,你的意思是你想要定义这个函数,或者只是使用标准函数? 'union'是一个标准函数,并且与set union有关。它仅适用于数字数组或字符串的单元数组。所有的“实体”事物都是数字,字符串还是其他东西? –

+0

我只需要使用标准的** union **功能。在运行我的**域名**循环时,**实体**是n×1单元格。 – steve