2014-11-04 58 views
3

我有一个单元格字符串矩阵,其中40,000行和一个与400。我需要找到适合secondfirst矩阵中的那些行(行)。请注意,可能会有很多重复。比较两个单元格阵列的相同行 - MATLAB

它看起来: 40,000线,如

Anna Frank 
Anna George 
Jane Peter 
Anna George 
Jane Peter  
etc. 

这里我需要找到适合

Anna George 
Jane Peter 

我发现,到目前为止两个for功能和之间的if的唯一途径。但它是相当缓慢:

for i=2:size(bigTable,1) 
    for j = 1: size(smallTable,1) 
     if sum(ismember(bigTable(i,1:2),smallTable(j,1:2))) == 2 
      Total_R(size(Total_R,1)+1,1)= i; 
     end 
    end 
end 
+0

你有没有考虑串联姓氏和名字?这样一个单一的会员应该做的伎俩。 – 2014-11-04 12:14:08

回答

3

我假设你的输入设置这样的 -

bigTable = 
    'Anna' 'Frank' 
    'Anna' 'George' 
    'Jane' 'Peter' 
    'Anna' 'George' 
    'Jane' 'Peter' 
smallTable = 
    'Anna' 'George' 
    'Jane' 'Peter' 

为了解决你的情况下,有两种方法可以在这里建议。

方法#1

ismember基础的方法 -

Total_R = find(sum(ismember(bigTable,smallTable,'rows'),2)==2) 

方法2

%// Assign unique labels to each cell for both small and big cell arrays, so that 
%// later on you would be dealing with numeric arrays only and 
%// do not have to mess with cell arrays that were slowing you down 
[unqbig,matches1,idx] = unique([bigTable(:) ; smallTable(:)]) 
big_labels = reshape(idx(1:numel(bigTable)),size(bigTable)) 
small_labels = reshape(idx(numel(bigTable)+1:end),size(smallTable)) 

%// Detect which rows from small_labels exactly match with those from big_labels 
Total_R = find(ismember(big_labels,small_labels,'rows')) 

或替换ismember从一个bsxfun基于执行的最后一行 -

Total_R = find(any(all(bsxfun(@eq,big_labels,permute(small_labels,[3 2 1])),2),3)) 

从这些方法为假定输入输出的情况下 -

Total_R = 
    2 
    3 
    4 
    5 
+0

注意:对于2010或最近版本的MATLAB,您可以跳过某些输出,所以您可以改为 - '[〜,〜,idx] = unique([bigTable(:); smallTable(:)])''。 – Divakar 2014-11-04 13:11:52