Matlab,找到两个单元阵列的共同元素

时间:2014-07-15 22:35:26

标签: arrays matlab cell elements

我有两个单元阵列,大小分别为1x20033和1x19。让我们将这两个单元格数组称为A和B.我想将A的每个单元格与B的每个单元格进行比较,以查看是否存在任何共同元素。

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

我试过了:

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

但我遇到了这个错误:"类double的输入A和类cell的输入B必须是 字符串的单元格数组,除非一个是字符串。"

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

1 个答案:

答案 0 :(得分: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个字节。看到您希望BinaryMatrix成为truefalse,请不要使用double - 使用logical。我不知道两个单元阵列的大小,所以这样做可以减少8的内存消耗。

次要注意事项

strsplit仅适用于R2013a及以后版本。如果您的MATLAB版本为R2012b及更低版本,请将strsplit替换为regexp。因此,您可以将for循环中的两行替换为:

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