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]
4 Réponses :
J'ai eu la solution suivante qui travaille, mais je me demande toujours s'il y a une meilleure façon de le faire: (je sais, je sais, pas de vérification des erreurs - je suis une personne horrible.) p> p>
Vous pouvez réellement utiliser la fonction ismember Pour obtenir un vecteur d'index pour où les cellules dans alors il s'agit de construire le vecteur 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: p> largecellarray code> se produisent dans le tableau plus petit
smallcellarray code>, utilisez la fonction strfind (qui fonctionne pour les deux chaînes et em> tableaux numériques) pour trouver les indices de départ de Le plus petit tableau dans les plus gros:
index code> à partir de ces indices de démarrage. Voici une façon de créer ce vecteur: p>
Cela ne va pas ne pas produire le résultat correct si largecellarray code> est
{'string3'} code>?
@Jonas: i obtenez index = 0 code> 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 code> n'ait besoin d'entrée avec une ligne uniquement, donc j'ai tapé ceci à la place
startindues = strfind (matchindex ', 1: nsmall') code>
dans @gnoVice Répondez à la première partie peut être
l = grp2idx(largecellarray)'; s = grp2idx(smallcellarray)'; startIndices = strfind(l,s);
Je ne connaissais pas GRP2IDX. Agréable! Mais cela ne serait-il pas échouer s'il y avait un string0 code> à largecellarray?
Malheureusement, cela ne fonctionne que si les N entrées dans SmallCellarray CODE> sont exactement i> identique à la première n entrées dans
largecellarray code>.
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 ..
Voici ma version (basée sur les réponses de @yuk et @gnovice):
+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