2014-05-03 106 views
0

我有一個單元矩陣TILER,它包含一些不同大小的矩陣。如何刪除單元格數組中的重複矩陣?

TILER=[22x4 double] [1265x4 double] [58x4 double] [31x4 double]  [58x4 double] 

,我們知道有些矩陣是重複的,例如[58x4 double]矩陣。 如何才能從一個單元陣列中刪除重複的矩陣有:

TILER=[22x4 double] [1265x4 double] [58x4 double] [31x4 double] 

here是一個鏈接,但它不能正常工作

回答

0

在這種情況下,很難避免環路。你可以沿着以下路線:

ind = true(1,numel(TILER)); %// true indicates non-duplicate. Initiallization 
for ii = 1:numel(TILER)-1 
    for jj = ii+1:numel(TILER) 
     if isequal(TILER{ii}, TILER{jj}) 
      ind(jj) = false; %// mark as duplicate 
     end 
    end 
end 
TILER2 = TILER(ind); 

一些優化是可能的。例如:

  • 在內循環中,不考慮在外循環的上一次迭代中檢測爲重複值的值。
  • 首先檢查矩陣大小是否相等(這可以通過bsxfun高效完成),然後僅測試具有相同大小的矩陣之間的相等性。
0

如果尺寸可以被視爲一個有效的標準,在單元陣列和維數識別重複的是整個單元陣列內容相一致,你可以使用這個 -

t1 = cellfun(@size,TILER,'uni',0) %%// TILER is your input cell array 
t2 = vertcat(t1{:}) 
t3 = squeeze(reshape(bsxfun(@eq,t2,permute(t2,[3 2 1])),numel(t2),[],size(t2,1))) 
[~,p2] = unique(t3','rows','stable') %%//' 
TILER = TILER(p2) 
0

您也可以操縱它進入一個字符串單元並利用「獨特」命令;從單元格「a」開始:

b=cell(0); 
for i=1:length(a), cat(2,b,mat2str(a{i}));, end 
b=unique(b); 
c=cell(0); 
for i=1:length(b), cat(2,c,eval(b{i}));, end 
+0

但是請注意,將每個矩陣操縱爲一個字符串具有重要的缺點。例如:非整數值或大整數。此外,矩陣'[1 1 1 1]'和'[1 1; 1 1]'可能映射到相同的字符串 –

+0

我不認爲這些情況中的任何一個都會成爲問題,除非是非常大的數字。 – oligilo

0

謝謝路易斯門多向我們提供您的答案。

我稍微修改了您的版本,更適合我的需求。 我的數據是一個單元格,即

for kk = 1 : length(cellOfCells) 
    TILER = cellOfCells{kk}; 
    ind = true(1,numel(TILER)); %// true indicates non-duplicate. Initialization 
for ii = 1:numel(TILER)-1 
    for jj = ii+1:numel(TILER) 
     if size(TILER{ii},1) ~= size(TILER{jj},1) 
      continue 
     else 
     membership = (ismember(TILER{ii}, TILER{jj},'rows')); 

      if sum(membership)==size(TILER{ii},1) 
       ind(jj) = false; %// mark as duplicate 
      end 
     end 
    end 
end 
TILER2{kk} = TILER(ind); 
end 
相關問題