2014-07-15 53 views
1

我有两个单元阵列,大小是1x20033和1x19。我们将这两个单元格数组称为A和B.我想将A的每个单元格与B的每个单元格进行比较,以查看是否有任何公共元素。Matlab,找到两个单元阵列的通用元素

最后,我需要建立一个二进制矩阵,并在出现匹配时放置一个矩阵。

我尝试这样做:

BinaryMatrix=zeros(20033,19); 

for i=1:1:20033 

    for j=1:1:19 
     match=find(ismember(A{i},B{j}));   
     if match==1 
      BinaryMatrix(i,j)= 1;   
     end 
    end 
end 

但我面临这个错误:“输入A类细胞的类双和输入B的必须是字符串的 单元阵列,除非一个是字符串”

请告诉我我应该怎么做才能解决它?

+0

取代''通过any' find'?另外,这些单元格包含什么? –

+0

每个单元格都包含一串单词。这些字符串的长度是不同的。一个可能是20,另一个是300. – user36729

+0

你尝试过使用'intersect'吗? – rayryeng

回答

2

您几乎可以使用的代码。我建议你做的是将空间中的AB中的字符串分开。因此,AB然后将是元素的单元阵列,其中AB中的每个元素是单个词。这些空格将作为分隔词的分隔符。

一旦你这样做,使用intersect来查看A中的单词和B中的单词之间是否有任何常见单词。 intersect通过将两个数组(它们可以是数值数组,单元阵列等)CD作为集合起作用,并且它返回这两个数组之间的集交集。

在我们的情况下,CD将是从AB由空格分隔单词的单元阵列。 intersect(C,D)将返回字符串的单元数组,其中输出中的每个元素都是中的字符串,这两个字符串均为CD。因此,如果这个单元阵列不是空的,我们在CD之间找到至少一个常用单词。如果是这样的话,那么在你的矩阵的位置设置你的二进制标志为1。换句话说:

BinaryMatrix = false(20033,19); 

for i=1:1:20033 
    for j=1:1:19 
     Asplit = strsplit(A{i}); 
     Bsplit = strsplit(B{j}); 
     if (~isempty(intersect(Asplit, Bsplit))) 
      BinaryMatrix(i,j)= true;   
     end 
    end 
end 

你会发现,我从zeros(20033,19)改变了你的矩阵,以false(20033,19)。之所以会这样做,是因为在做zeros时,您在矩阵中为每个数字分配了8个字节,因为这会以双精度创建您的矩阵。通过做false,这将是一个logical矩阵,而您正在为每个数字分配1个字节。看到您想要BinaryMatrixtruefalse,请勿使用double - 请使用logical。我不知道这两个单元阵列有多大,所以这样做会降低你的内存消耗8

小注

strsplit只能从R2013a及以后。如果您有一个R2012b及更低版本的MATLAB,请将strsplit替换为regexp。因此,你会替换for环与两条线:

Asplit = regexp(A{i}, ' ', 'split'); 
Bsplit = regexp(B{j}, ' ', 'split'); 
+0

很好的回答! +1 –

+0

@LuisMendo - 我站在巨人的肩膀上:)我只从最好的方面学习,包括你。谢谢! – rayryeng

+0

哈哈哈,谢谢!伟大的发明,这堆栈溢出 –