6
votes

STRCMP pour les tableaux de cellules de longueur inégale dans matlab

Y a-t-il un moyen facile de trouver un réseau de cordes plus petites de cellules dans un plus grand? J'ai deux listes, une avec des éléments uniques et une avec des éléments répétés. Je veux trouver des occurrences entières du motif spécifique du plus petit tableau dans les plus grandes. Je suis conscient que STRCMP comparera deux tableaux de cellules, mais seulement s'ils sont égaux de longueur. Ma première pensée était de passer à travers des sous-ensembles du plus grand tableau à l'aide d'une boucle, mais il doit y avoir une meilleure solution.

Par exemple, dans ce qui suit: p>

index=[1 1 1 0 0 1 1 1]


0 commentaires

4 Réponses :


0
votes

J'ai eu la solution suivante qui travaille, mais je me demande toujours s'il y a une meilleure façon de le faire: xxx

(je sais, je sais, pas de vérification des erreurs - je suis une personne horrible.)


0 commentaires

9
votes

Vous pouvez réellement utiliser la fonction ismember Pour obtenir un vecteur d'index pour où les cellules dans largecellarray se produisent dans le tableau plus petit smallcellarray , utilisez la fonction strfind (qui fonctionne pour les deux chaînes et tableaux numériques) pour trouver les indices de départ de Le plus petit tableau dans les plus gros: xxx

alors il s'agit de construire le vecteur index à partir de ces indices de démarrage. Voici une façon de créer ce vecteur: xxx

Un autre moyen de le créer à l'aide de la fonction BSXFun est donné par AMRO . Encore une autre façon de le créer est la suivante: xxx


4 commentaires

Cela ne va pas ne pas produire le résultat correct si largecellarray est {'string3'} ?


@Jonas: i obtenez index = 0 pour ce cas, à l'aide de la version la plus récente de ma solution ci-dessus.


Oh, maintenant je comprends votre solution. Intelligent! +1


J'ai utilisé ce code pour un problème similaire. Matlab s'est plaint que strfind n'ait besoin d'entrée avec une ligne uniquement, donc j'ai tapé ceci à la place startindues = strfind (matchindex ', 1: nsmall')



1
votes

dans @gnoVice Répondez à la première partie peut être

l = grp2idx(largecellarray)';
s = grp2idx(smallcellarray)';
startIndices = strfind(l,s);


4 commentaires

Je ne connaissais pas GRP2IDX. Agréable! Mais cela ne serait-il pas échouer s'il y avait un string0 à largecellarray?


Malheureusement, cela ne fonctionne que si les N entrées dans SmallCellarray sont exactement identique à la première n entrées dans largecellarray .


Oui, cela échouera dans de nombreux cas, car pour GRP2IDX, la commande est importante. La fonction ismember est probablement importante ici.


Si vous les transmettez à GRP2IDX combiné comme une cellier, cela résoudra le problème ..



5
votes

Voici ma version (basée sur les réponses de @yuk et @gnovice): xxx


2 commentaires

+1: Très bien, bien que 2 choses mentionnent: 1) Vous avez besoin du Statistiques Toolbox à utiliser GRP2IDX . 2) la fonction FindStr semble être édéré pour Obsolescence en faveur de strfind .


@GNOVICE: Correction de Findstr / Strfind (note que l'ordre des arguments est important maintenant), je n'ai pas réalisé que c'était une fonction obsolète .. Merci