IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Créer sous-ensembles ne se chevauchant pas


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut Créer sous-ensembles ne se chevauchant pas
    Bonjour,

    J'ai à disposition un ensemble de données (signal audio, donc en temps x amplitude), dont certaines portions sont bruitées. Je cherche à présent à extraire des petites fenêtres de signal propres à partir de mes données brutes/bruitées.

    J'ai déjà fait une grande partie du travail en récupérant les indices des échantillons bruités dans un tableau.




    Pour donner un exemple, soit x mes données brutes. x est de longueur N. Disons N=10000;

    Une partie de mes données est bruitée, j'ai stocké les indices des donnés bruitées dans le tableau, disons A, qui serait par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[5,60:70,76,650,1300:1350,5000,7000,9290];


    A présent, je souhaite créer un algorithme me permettant d'extraire 5 petites fenêtres de longueur M (M<<N) à partir de mon signal x, mais ne se chevauchant pas. Disons M=100;

    De plus, il faut que la distribution de ces petites fenêtres soit la plus aléatoire possible dans le domaine temporel (par exemple, je ne veux pas que 80% de mes fenêtres soient issues des 20 premiers pourcents de mon signal x).

    Pouvez vous m'aider à réaliser cela?

    Merci beaucoup !

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    La fonction RANDI ne te permettrait pas d'obtenir des indices aléatoires qui te permettrait de faire ca?

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse !

    ...Je ne vois pas trop ce que tu veux dire. Tu peux expliciter un peu?

  4. #4
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Avec l'indexation, tu peux aller chercher ton image numéro "i" dans ta liste.

    En gros: mesurer la taille de ton vecteur de bruit (par exemple 100 données)
    tirer un chiffre entre 1 et 100, lire les valeurs à la position "i", et ce x fois de suite, x étant le nombre d'éléments que tu veux par paquet.

    Tu devras mettre une vérification du type "si i est déjà sorti, relance les dés"
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  5. #5
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Une idée rapide pour un tirage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    idx = randi(nb_elements, 1, nb_fenetre);
    Avec nb_elements le nombre de points de ton vecteur et nb_fenetre le nombre de fenêtre que tu souhaites.

    A partir de là tu peux créer tes fenêtres, voir relancer un tirage si les numéros ne vont pas (cf. la réponse de Clotho)
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Ok merci pour vos réponses. Je vais me lancer avec vos indications et voir ce que ça donne.

    Si je n'y arrive pas il y a de grandes chances que je revienne vers vous

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Ok, j'ai un peu avancé, j'ai à présent tous les indices des petites fenêtres de mon signal qui sont propres. Les indices du début possible pour chaque fenêtre sont regroupées dans un tableau, disons B.

    Par contre ces fenêtres se chevauchent pour la plupart (Par exemple, étant donné mon tableau A cité plus haut, B sera : [71:550, etc...], ce qui veut dire que je peux choisir une fenêtre commençant à n'importe quelle valeur prise dans B, elle ne contiendra pas de bruit).

    J'ai bien compris comment gérer la distribution des fenêtres, mais comment feriez vous pour choisir 5 valeurs de B séparées d'au moins M=100, de manière élégante ? (et oui je suis chiant en plus )

    Pour l'instant je ne vois pas d'autre moyen que de passer par une affreuse boucle for i=1:nb_fenetre...

  8. #8
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Je n'ai pas bien compris ta dernière question, tu veux que dans ton intervalle 71:550 tu aies 5 tirages et que l'étendue minimum soit de 100 sur (550-71) ?

    Si tu veux un tirage qui ne soit plus réellement un tirage totalement aléatoire, je crois que le plus simple c'est de décomposer ton tirage dans l'intervalle en tirages successifs sur des intervalles se chevauchant légèrement (par exemple 71:300 tu prends 2 valeurs et 250:550 tu en prends 3, en faisant très attention a ce que ton nombre de valeurs par sous intervalle soit proportionnel à la taille de ce dernier, sinon tu respectes plus la répartition statistique).

    Si par contre tu veux "juste" être sur que tes 5 valeurs soient au moins espacées de 100 indices, je ne vois pas trop comment faire sans tricher sur le tirage, avec un truc du type "B=100+rand(71:550)"
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    En fait c'est assez simple : je veux constituer 5 fenêtres (issues de mon signal de départ x) qui ne contiennent pas de bruit.

    Par conséquent, j'ai repéré les indices de mon vecteur x qui correspondent à du bruit. Ces valeurs sont stockées dans A.

    Maintenant, il est important que mes 5 fenêtres non bruitées ne se chevauchent pas (je vais faire une analyse statistique dessus par la suite et toute redondance dans les données sera rédhibitoire), et de plus elles doivent être les plus représentatives possibles de mon signal de départ x, donc il faut absolument que le tirage de ces fenêtres se fasse aléatoirement sur toutes les valeurs possibles. (Valeurs possibles qui sont déjà répertoriées dans B)

    Par exemple, je ne voudrais pas que mes 5 fenêtres soient systématiquement plutôt au début de mon signal x, ou trop distribuées au milieu, ou trop à la fin...

  10. #10
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Faisons des maths.

    tu as un ensemble E composé de A et B disjoints, A étant ton bruit et B la matrice/vecteur/ensemble dont tu veux tes résultats, c'est ca?

    Si tu dois faire 5 sous-ensembles de B, tu peux faire comme suit, avec matlab:

    Dénombrer B, prenons l'exemple B=100

    Créer une boucle qui de 1 à i te fera des tirages aléatoires et te crééra une matrice temporaire Bi contenant les 100 résultats moins ceux déjà sortis. Enregistrer le résultat de tes tirages dans un tableau de cellules ou une matrice Di. Fin de la boucle.

    Après 100 itérations tu auras une matrice (a peu près) aléatoire de tes résultats initiaux, tu n'as plus qu'à la couper en 5 matrices équivalentes.

    Ca doit pas être le plus optimal, mais ca me semble être le plus simple a coder, ca doit prendre une dizaine de lignes, à vue de nez.

    Il doit être possible de passer par des procédés de vérifications plus compliqué (puisqu'avec une simple boucle for, plus tu sors de résultats, plus tu fausses le tirage suivant) sans amputer la matrice initiale, du genre "apres avoir lu une valeur a tel indice, remplace la par 0 et refais un tirage, si ce tirage vaut 0, refait un tirage" mais j'ai jamais fait de logique de ma vie
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Clotho Voir le message
    Faisons des maths.

    tu as un ensemble E composé de A et B disjoints, A étant ton bruit et B la matrice/vecteur/ensemble dont tu veux tes résultats, c'est ca?

    Si tu dois faire 5 sous-ensembles de B, tu peux faire comme suit, avec matlab:

    Dénombrer B, prenons l'exemple B=100

    Créer une boucle qui de 1 à i te fera des tirages aléatoires et te crééra une matrice temporaire Bi contenant les 100 résultats moins ceux déjà sortis. Enregistrer le résultat de tes tirages dans un tableau de cellules ou une matrice Di. Fin de la boucle.

    Après 100 itérations tu auras une matrice (a peu près) aléatoire de tes résultats initiaux, tu n'as plus qu'à la couper en 5 matrices équivalentes.

    Ca doit pas être le plus optimal, mais ca me semble être le plus simple a coder, ca doit prendre une dizaine de lignes, à vue de nez.

    Il doit être possible de passer par des procédés de vérifications plus compliqué (puisqu'avec une simple boucle for, plus tu sors de résultats, plus tu fausses le tirage suivant) sans amputer la matrice initiale, du genre "apres avoir lu une valeur a tel indice, remplace la par 0 et refais un tirage, si ce tirage vaut 0, refait un tirage" mais j'ai jamais fait de logique de ma vie

    Pas tout a fait. A est le bruit.

    B est un tableau, dont les valeurs sont simplement des pointeurs vers tous les différents positionnements possibles de mes fenêtres par rapport à mon signal global, total (donc contenant aussi des plages bruitées n'est-ce pas?).

    Par contre, dans le calcul de mon tableau B j'ai déjà écarté toutes les fenêtres qui empiéteraient sur du bruit. Je n'ai plus qu'à tirer aléatoirement 5 valeurs de B qui soient séparées de M=100 au moins..

    Désolé, je dois très mal m'expliquer. A la rigueur, ce qui est important est uniquement le paragraphe en vert. C'est un peu plus clair comme ça ?

  12. #12
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    En creusant ton vecteur initial des 101 valeurs autour de celle que tu as extrait tu n'arriverais pas à faire ton tirage pseudo aléatoires?

    Si par exemple tu as 1000 points (de 1 à 1000) et que ton premier jet te donne 547, tu effectues un tirage dans une matrice amputée des valeurs 447 à 648 ?

    Soit directement, soit en recréant une matrice de 899 valeurs, puis 798, puis...

    C'est la façon la plus simple que je voie.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Clotho Voir le message
    En creusant ton vecteur initial des 101 valeurs autour de celle que tu as extrait tu n'arriverais pas à faire ton tirage pseudo aléatoires?

    Si par exemple tu as 1000 points (de 1 à 1000) et que ton premier jet te donne 547, tu effectues un tirage dans une matrice amputée des valeurs 447 à 648 ?

    Soit directement, soit en recréant une matrice de 899 valeurs, puis 798, puis...

    C'est la façon la plus simple que je voie.
    OK je vois merci. Et niveau Matlab, la meilleure fonction à utiliser serait quoi? setdiff ?

  14. #14
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Bonjour,

    pour ma part je pense que je n'utiliserai pas de fonctions, sur un exemple simple ca donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    matrice_initiale=1:1000; %matrice exemple, de 1000 valeurs
    valeur_utilisée=547; %index de la portion de matrice retirée
    a=valeur_utilisée-50;
    b=valeur_utilisée+50;
     
    matrice_tronquée=[1:a,b:1000]
    c'est pas très élégant car ma matrice initiale sert à rien dans l'histoire (de toute façon il te manque l'extraction de ta valeur 547 etc, c'est juste pour montrer la création de la sous matrice).
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Clotho Voir le message
    Bonjour,

    pour ma part je pense que je n'utiliserai pas de fonctions, sur un exemple simple ca donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    matrice_initiale=1:1000; %matrice exemple, de 1000 valeurs
    valeur_utilisée=547; %index de la portion de matrice retirée
    a=valeur_utilisée-50;
    b=valeur_utilisée+50;
     
    matrice_tronquée=[1:a,b:1000]
    c'est pas très élégant car ma matrice initiale sert à rien dans l'histoire (de toute façon il te manque l'extraction de ta valeur 547 etc, c'est juste pour montrer la création de la sous matrice).
    Soit, mais dans mon cas il est possible que ni a ni b fassent partie de ma matrice initiale...

  16. #16
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Ca c'est pas bien grave, de base matlab t'enverra un warning disant qu'il sort des limites.

    Sinon tu mets une petite vérification du genre "si valeur_prélevée -50 < borne_gauche: prendre borne_gauche." puisque de toute façon tu prendras pas d'autres valeurs à gauche.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

Discussions similaires

  1. Créer un sous-ensemble d'image 32x32
    Par pitchu dans le forum R
    Réponses: 1
    Dernier message: 03/04/2015, 16h12
  2. créer un .jar sous dos/MsDos ne reconnait pas la commande jar
    Par bracket dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 03/01/2009, 15h11
  3. Script permettant de créer l'ensemble des indexes d'une base
    Par matacars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2005, 16h14
  4. [DBGrid] Affichage d'un sous-ensemble de données
    Par Jean-Jacques Engels dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/09/2004, 16h31
  5. Sous-ensembles de tuples
    Par HPJ dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/10/2003, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo