您几乎可以使用的代码。我建议你做的是将空间中的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及以后。如果您有一个R2012b及更低版本的MATLAB,请将strsplit
替换为regexp
。因此,你会替换for
环与两条线:
Asplit = regexp(A{i}, ' ', 'split');
Bsplit = regexp(B{j}, ' ', 'split');
取代''通过any' find'?另外,这些单元格包含什么? –
每个单元格都包含一串单词。这些字符串的长度是不同的。一个可能是20,另一个是300. – user36729
你尝试过使用'intersect'吗? – rayryeng