2016-01-23 47 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相同的數字,而不重複,並刪除出現在結構的任何先前元素中的數字。