Le code que vous avez presque fonctionne. Ce que je vous recommande de faire est de diviser les chaînes trouvées dans A
et B
par des espaces. En tant que tel, A
et B
seraient alors des tableaux de cellules d'éléments où chaque élément de A
ou B
est un seul mot. Les espaces serviront de délimiteurs pour séparer les mots.
Une fois que vous faites cela, utilisez intersect
pour voir s'il y a des mots communs entre les mots dans A
et les mots dans B
. intersect
fonctionne en considérant deux tableaux (ceux-ci peuvent être des tableaux numériques, des tableaux de cellules, etc.) C
et D
en tant qu'ensembles, et renvoie l'ensemble d'intersection entre ces deux tableaux.
Dans notre cas, C
et D
serait une matrice de mots séparés par des espaces de A
et B
. intersect(C,D)
renvoie un tableau de chaînes de chaînes où chaque élément de la sortie est une chaîne trouvée dans à la foisC
et D
. En tant que tel, si ce tableau de cellules n'est pas vide, nous avons trouvé au moins un mot commun entre C
et D
. Si tel est le cas, réglez votre drapeau binaire à l'emplacement de votre matrice à 1. En d'autres termes:
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
Vous remarquerez que j'ai changé votre matrice de zeros(20033,19)
, à false(20033,19)
. La raison en est que, en faisant zeros
, vous allouez 8 octets par nombre dans votre matrice car cela créera votre matrice en double précision. En faisant false
, ce sera une matrice logical
à la place, et vous allouez 1 octet par numéro. Voyant comme vous voulez que BinaryMatrix
soit true
ou false
, n'utilisez pas double
- utilisez logical
. Je ne sais pas comment les deux grandes réseaux de cellules sont, et ce faisant, cela permettra de réduire votre consommation de mémoire 8.
Remarque mineure
strsplit
est uniquement disponible à partir R2013a et les années suivantes. Si vous avez une version de MATLAB qui est R2012b et inférieure, remplacez strsplit
par regexp
. En tant que tel, vous devez remplacer les deux lignes de la boucle for
par:
Asplit = regexp(A{i}, ' ', 'split');
Bsplit = regexp(B{j}, ' ', 'split');
Remplacer 'find' par' any'? Aussi, que contiennent les cellules? –
Chaque cellule contient une chaîne de mots.La longueur de ces chaînes est différente. L'un peut être 20 et l'autre 300. – user36729
Avez-vous essayé d'utiliser 'intersect'? – rayryeng