2016-01-23 51 views
0

我在Matlab中有一个结构,每个字段包含具有不同数量变量的元素。我想删除出现在同一字段中的数字的重复项:我知道unique()函数并知道如何使用它来逐个扫描字段,但不是整个字段。MATLAB:从结构中的字段中删除非唯一的数字

我想,我想是这样的:

structure(1:length(structure)).field=unique(structure(1:length(structure)).field 

,并得到 原

field=[1,2,3] [1,4,5] [2,5,8] 

变成

field=[1,2,3] [4,5] [8] 

也许一个复杂的类似循环以下(ISN” t工作),它将获取字段中第一个元素的值,然后搜索每个广告dictal元素,如果该值存在,则将其设置为等于= [],并通过这种方式进行迭代?

for n=1:length(RESULTS) 
     for m=1:length(RESULTS(n).Volumes) 
      for l=1:length(RESULTS) 
       for o=1:length(RESULTS(l).Volumes) 
        if RESULTS(n).Volumes(m)==RESULTS(l).Volumes(o) 
         RESULTS(l).Volumes(o)=[]; 
        end    
       end 
      end 
     end 
    end 

谢谢!

回答

0

这是一个快速和肮脏的尝试,但您可能可以改进它。假设你的结构数组和字段是sa(:).v。我还假设该字段包含1xn数字数组,如您的示例中所示。首先,所有的字段值的级联进行的“联合”阵列和过滤非唯一值:

joint = cell2mat({sa.v});  
[uniqJoint,~,backIdx] = unique(joint); 

的“uniqJoint”阵列也被排序,但“backIdx”数组包含索引是,如果应用于uniqJoint,将会重建原来的“联合”数组。我们需要以某种方式将这些原始索引(i,j)连接到结构数组中,并在字段值sa(i).v(j)内。要做到这一点,我试图创建相同大小的数组包含原本有相应的元素中的“联合”阵列中的结构的指标“联合”:

saIdx = cell2mat(arrayfun(@(i) i * ones(1,length(sa(i).v)), ... 
       1:length(sa), 'UniformOutput', false)); 

然后您可以编辑(或,在我的情况下,复制并修改struct数组的副本以将该字段设置为之前未出现的值。为了做到这一点,我把逻辑阵列标记为“已使用”,“backIdx”的索引,在这种情况下,我重建每个结构的字段时跳过这些值:

sb = sa; 
used = false(length(backIdx)); 
for i = 1:length(sa) 
    origInd = find(saIdx == i); % Which indices into backIdx correspond to this struct? 
    newInd = []; % Which indices will be used? 
    for curI = backIdx(origInd) 
    if ~used(curI) 
     % Mark as used and add to the "to copy" list 
     used(curI) = true; 
     newInd(end+1) = curI; 
    end 
    end 
    % Rewrite the field with only the indices that were not used before 
    sb(i).v = uniqJoint(newInd); 
end 

在结束时,将sb(i).v中的数据包含与sa(i).v相同的数字,而不重复,并删除出现在结构的任何先前元素中的数字。