2014-07-15 9 views
1

J'ai deux matrices de cellules, les tailles sont 1x20033 et 1x19. Appelons ces deux tableaux de cellules A et B. Je veux comparer chaque cellule de A avec chaque cellule de B pour voir s'il y a un élément commun. Enfin, je dois construire une matrice binaire et en mettre une quand il y a une correspondance.Matlab, trouver des éléments communs de deux matrices de cellules

J'ai essayé ceci:

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 

mais je fait face à cette erreur: « entrée A de classe double et entrée B de la cellule de classe doit être réseaux de cellules de chaînes, sauf si l'on est une chaîne. »

Se il vous plaît dites-moi Que dois-je faire pour le résoudre?

+0

Remplacer 'find' par' any'? Aussi, que contiennent les cellules? –

+0

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

+0

Avez-vous essayé d'utiliser 'intersect'? – rayryeng

Répondre

2

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'); 
+0

Bonne réponse! +1 –

+0

@LuisMendo - Je suis debout sur les épaules des géants :) Je n'ai appris que des meilleurs, y compris vous. Je vous remercie! – rayryeng

+0

Hahaha, merci! Grande invention, cette Stack Overflow –

Questions connexes