比较两个单元数组的相同行 - MATLAB

3
我有一个包含40,000行和一个包含400行的单元格字符串矩阵。我需要在第一个矩阵中找到符合第二个矩阵的那些行。请注意,这可能会有很多重复的行。
它看起来像: 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

你有没有考虑将名字和姓氏连接起来?这样一个单独的ismember就可以解决问题了。 - Dennis Jaheruddin
1个回答

3
我假设您的输入设置如下 -
bigTable = 
    'Anna'    'Frank' 
    'Anna'    'George'
    'Jane'    'Peter' 
    'Anna'    'George'
    'Jane'    'Peter' 
smallTable = 
    'Anna'    'George'
    'Jane'    'Peter' 

为解决您的问题,这里提出两种方法。
第一种方法:
基于ismember的方法 -
Total_R = find(sum(ismember(bigTable,smallTable,'rows'),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

注意:对于2010年或更新版本的MATLAB,您可以跳过某些输出,因此您可以使用以下方法 - [~,~,idx] = unique([bigTable(:) ; smallTable(:)]) - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接