Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > MATLAB > Contribuez
Contribuez Proposez vos tutoriels, FAQ, sources, astuces MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 16/06/2012, 03h00   #1
ol9245
Membre Expert
 
Avatar de ol9245
 
Homme Olivier Planchon
Chercheur
Inscription : avril 2007
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Olivier Planchon
Âge : 51
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chercheur

Informations forums :
Inscription : avril 2007
Messages : 876
Points : 1 016
Points : 1 016
Par défaut [Défis][4] Comparer deux listes de mots

J'ai deux listes de mots en nombre arbitraire et non ordonnées. Par exemple :
Code :
1
2
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
Le défi est le suivant :
Écrire le code le plus compact(*) possible pour trouver tous les mots communs aux deux listes. c'est-à-dire quelque chose comme ça :
Code :
1
2
3
4
5
>>votre formule magique ici

ans = 

    'deux'    'chateau'    'quatre'
-----------------------------------
(*) un code est compact quand il a :
  • moins de boucles (for-end, while-end, ...)
  • moins de lignes de code
  • moins d'affectations (signe =)
  • moins de variables déclarées

Pas besoin de hiérarchiser ces critères car toute amélioration de l'un impacte les autres.
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais)
Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>
ol9245 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2012, 23h39   #2
magelan
Modérateur
 
Inscription : août 2007
Messages : 4 094
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 4 094
Points : 5 424
Points : 5 424
Salut,

proposition avec cellfun justement :
Code :
1
2
3
4
5
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
C = repmat(A,size(B,2),1)
D = repmat(B.',1,size(A,2))
E = cellfun(@(x,y)strfind(x,y), C, D,'UniformOutput',false)
ou en compactant encore plus :
Code :
1
2
3
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
E = cellfun(@(x,y)strfind(x,y), repmat(A,size(B,2),1), repmat(B.',1,size(A,2)),'UniformOutput',false)
Juste une remarque pour préciser qu'un code compact n'est pas toujours un code optimisé et cela peut le rendre parfois illisible.
__________________
Pour une bonne utilisation des balises code c'est ici!
Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


La nature est un livre écrit en langage mathématique. Galilée.
magelan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 00h08   #3
ol9245
Membre Expert
 
Avatar de ol9245
 
Homme Olivier Planchon
Chercheur
Inscription : avril 2007
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Olivier Planchon
Âge : 51
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chercheur

Informations forums :
Inscription : avril 2007
Messages : 876
Points : 1 016
Points : 1 016
Pour un début, la barre est assez haut : une seule instruction

Par contre tu n'obtiens pas la solution (je vais ajouter une précision dans l'énoncé). Je veux les trois chaines communes. Et toi, il te faut encore quelques instructions de plus pour les sortir :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
E = cellfun(@(x,y)strfind(x,y), repmat(A,size(B,2),1), repmat(B.',1,size(A,2)),'UniformOutput',false)

E = 

     []    [1]     []     []     []
     []     []     []     []    [1]
     []     []     []     []     []
     []     []     []     []     []
     []     []     []     []     []
     []     []     []     []     []
     []     []     []     []     []
     []     []     []     []     []
     []     []    [1]     []     []
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais)
Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>
ol9245 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 11h04   #4
duf42
Modérateur
 
Avatar de duf42
 
Homme
Formateur en informatique
Inscription : novembre 2007
Messages : 2 908
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 2 908
Points : 4 381
Points : 4 381
Bonjour,

Je pense que la fonction INTERSECT doit faire l'affaire ici:
Duf
__________________
Définir les signaux d’entrée d’un modèle Simulink sur le blog Vers MATLAB et au-delà

Modérateur MATLAB

Au boulot : Windows 7 , MATLAB 8.00 (r2012b)
A la maison : ArchLinux mais pas MATLAB
duf42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 11h44   #5
ol9245
Membre Expert
 
Avatar de ol9245
 
Homme Olivier Planchon
Chercheur
Inscription : avril 2007
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Olivier Planchon
Âge : 51
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chercheur

Informations forums :
Inscription : avril 2007
Messages : 876
Points : 1 016
Points : 1 016
Citation:
Envoyé par duf42 Voir le message
Bonjour,

Je pense que la fonction INTERSECT doit faire l'affaire ici:
Code :
1
2
3
4
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
intersect(A,B)
Duf

Bravo Duf !

0 boucle
0 variables intermédiaires
1 ligne de code,
1 fonction matlab appelée.

Je propose de t'accorder la victoire à ce défi

Mon idée de départ était celle-ci, que tu as largement battu :
Code :
1
2
3
4
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
[a, b]=meshgrid(1:numel(A),1:numel(B)) ;
A(any(strcmp(A(a),B(b))))
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais)
Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>
ol9245 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 12h07   #6
ol9245
Membre Expert
 
Avatar de ol9245
 
Homme Olivier Planchon
Chercheur
Inscription : avril 2007
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Olivier Planchon
Âge : 51
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chercheur

Informations forums :
Inscription : avril 2007
Messages : 876
Points : 1 016
Points : 1 016
@Duf :

J'ai essayé d'appliquer ta solution dans mon code, mais mon problème n'est pas exactement celui que j'ai formulé dans le défi. Le défi est un problème symétrique. Le mien ne l'est pas.
J'ai une liste A de mots de référence (un dictionnaire) et une liste de mots B à chercher dans A. J'ai besoin des index des mots de B dans le dictionnaire A.
Voici un bout de code qui résume les deux solutions, appliquées au problème non symétrique. Qu'en penses-tu ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dico = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
Chercher = {'deux' 'chateau'} ;

% Duf
M = intersect(Dico, Chercher) ;
fprintf('\nLes mots communs sont -dans le désordre- (recette Duf) : ') ;
fprintf('%s ', M{:}) ;

% OL9245
[a, b]=meshgrid(1:numel(Dico),1:numel(Chercher)) ;
Ix = find(any(strcmp(Dico(a),Chercher(b)))) ;
fprintf('\nLeurs index dans le dico sont -dans l''ordre- (recette OL9245) : ') ;
fprintf('%d ', Ix) ;
fprintf('\n') ;
Résultat :
Code :
1
2
Les mots communs sont -dans le désordre- (recette Duf) : chateau deux 
Leurs index dans le dico sont -dans l'ordre- (recette OL9245) : 1 9
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais)
Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>
ol9245 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 13h00   #7
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 163
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 163
Points : 12 595
Points : 12 595
Salut,

Petit tour du côté de la doc :
Citation:
[c, ia, ib] = intersect(a, b) also returns column index vectors ia and ib such that c = a(ia) and c = b(ib) (or c = a(ia,:) and c = b(ib,:)).
Donc à partir de là, ce n'est pas dur d'obtenir ces indices

Sinon, deux autres solutions :
Code :
1
2
3
4
5
6
A = {'un' 'deux' 'chateau' 'trois' 'quatre'} ;
B = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;

A(ismember(A,B))

A ( cellfun(@(a) any(strcmp(a,B)), A) )
Concernant ta solution ol9245, je rajouterais A(any(strcmp(A(a),B(b)),1)) dans le cas d'un seul mot à chercher.
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur ? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 13h06   #8
Dut
Responsable MATLAB & Hardware/PC

 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 15 078
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 15 078
Points : 31 157
Points : 31 157
Et pour une solution encore plus spécifique que la solution "générale" de duf42 :

__________________
Identification de processeur sous MATLAB (3/3) Identification de processeur sous MATLAB (2/3) Mes contributions MATLAB (R2009a - Windows & Linux)

J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2012, 15h34   #9
tanguy4724
Membre habitué
 
Homme Tanguy
étudiant ingénieur traitement images médicales
Inscription : juin 2012
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme Tanguy
Âge : 24
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : étudiant ingénieur traitement images médicales
Secteur : Santé

Informations forums :
Inscription : juin 2012
Messages : 74
Points : 143
Points : 143
sans aucun mérite car je ne fais que résumer les messages précédents :


Code :
1
2
3
[C,IA,IB] = INTERSECT(Dico, Chercher) ;
IA = sort(IA)
on a ainsi le résultat suivant :

Citation:
Dico = {'deux' 'quatre' 'six' 'huit' 'dix' 'douze' 'maison' 'bateau' 'chateau'} ;
Chercher = {'deux' 'chateau'} ;
[C,IA,IB] = INTERSECT(Dico, Chercher) ;
IA = sort(IA)

IA =

1 9
tanguy4724 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2012, 18h45   #10
ol9245
Membre Expert
 
Avatar de ol9245
 
Homme Olivier Planchon
Chercheur
Inscription : avril 2007
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Olivier Planchon
Âge : 51
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chercheur

Informations forums :
Inscription : avril 2007
Messages : 876
Points : 1 016
Points : 1 016
Ca nous fait donc deux lignes, donc autant que ma proposition, mais ++ joli et ++ compact.
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais)
Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>
ol9245 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h29.


 
 
 
 
Partenaires

Hébergement Web