我有两个单元阵列,大小分别为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必须是 字符串的单元格数组,除非一个是字符串。"
请告诉我该怎么做才能解决它?
答案 0 :(得分:2)
你几乎可以使用的代码。我建议你做的是将A
和B
中的字符串拆分为空格。因此,A
和B
将成为元素的单元格数组,其中A
或B
中的每个元素都是单个单词。这些空格将作为分隔单词的分隔符。
执行此操作后,请使用intersect
查看A
中的字词与B
中的字词之间是否有任何常用字词。 intersect
通过考虑两个数组(可以是数字数组,单元数组等)C
和D
作为集合来工作,并返回这两个数组之间的集合交集。
在我们的案例中,C
和D
是由A
和B
的空格分隔的单词单元格数组。 intersect(C,D)
将返回字符串的单元格数组,其中输出中的每个元素都是 C
和D
中的字符串。因此,如果此单元格数组非空,我们在C
和D
之间找到至少一个常用字。如果是这种情况,则将矩阵位置的二进制标志设置为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
成为true
或false
,请不要使用double
- 使用logical
。我不知道两个单元阵列的大小,所以这样做可以减少8的内存消耗。
strsplit
仅适用于R2013a及以后版本。如果您的MATLAB版本为R2012b及更低版本,请将strsplit
替换为regexp
。因此,您可以将for
循环中的两行替换为:
Asplit = regexp(A{i}, ' ', 'split');
Bsplit = regexp(B{j}, ' ', 'split');