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

Caml Discussion :

tri matrice par rapport à une colonne


Sujet :

Caml

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Points : 54
    Points
    54
    Par défaut tri matrice par rapport à une colonne
    Salut tous,

    Mon problème est dans le titre: je voudrais trier une matrice par rapport à une de ses colonnes (dans l'ordre croissant). Avec un Array.sort, je ne trierais que la colonne elle-même.

    Est-ce qu'il y a moyen de faire ça avec Ocaml?

    Merci d'avance!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Une matrice en OCaml, c'est un tableau de tableaux. Tu as donc un "grand tableau" qui contient des "petits tableaux". Pour représenter une matrice mathématique, il y a deux choix possibles : soit les petits tableaux représentent les lignes, et donc le grand tableau contient toutes les lignes de ta matrice (indexées par le numéro de la colonne), soit les petits tableaux représentent les colonnes, et donc le grand tableau contient toutes les colonnes indexées par le numéro de ligne.

    Si tu veux "trier les lignes d'une matrice par rapport à la valeur d'une de leur colonne", il suffit donc que tu utilises la première représentation : tu tries le grand tableau, en utilisant pour comparer deux éléments (deux lignes) leur valeur en une colonne donnée.
    Si tu as utilisé la deuxième représentation comme point de départ de ta structure de donnée, tu ne peux pas faire ça immédiatement. Il faut alors que tu codes une fonction de conversion qui passe d'une représentation à l'autre; ça correspond essentiellement à l'opération "transposée".

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Points : 54
    Points
    54
    Par défaut
    Ok, c'est très bien expliqué, mais je rencontre un nouveau problème:
    - je transpose la matrice
    - puis j'ordonne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    let make_order matrix_t =
        Array.sort (fun x y -> List.hd (matrix_t.(x).(1)) - List.hd (matrix_t.(y).(1))) matrix_t;;
    (en l'occurrence, c'est une matrice de listes d'entiers, d'où le List.hd et je trie par rapport à la "colonne" 1)

    Mais quand je compile, il renvoie:
    This expression has type int list array array but is here used with type int array

    Je ne vois pas pourquoi,: il n'a aucune raison d'exiger que matrix_t soit une matrice d'entiers, si?

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Salut !

    La fonction de tri qu'utilise Array.sort reçoit les éléments de matrix_t. Comme cette valeur est une matrice de liste d'entiers (type int list array array), ses « éléments » sont de type int list array. La fonction de tri reçoit donc des tableaux en entrée.

    Partant de là, l'expression matrix_t.(x).(1) est incorrecte puisque x n'est pas un entier !

    Je ne sais pas si c'est ainsi que tu souhaites trier ta matrice, mais cette solution est correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let make_order = Array.sort (fun x y -> List.hd x.(1) - List.hd y.(1))
    Remarque à propos de ce code : comme c'est hors contexte, il est difficile de savoir quelles sont les formes que peuvent prendre toutes ces données. Partant de là, il est peut-être bon de préciser que make_order, ainsi définie, peut lever une exception Failure à cause de List.hd, une exception Invalid_argument à cause de x.(1) et/ou y.(1). Bref, si les données sont susceptibles de provoquer ces comportements, il vaut peut-être mieux ajouter un try...with.

    Cordialement,
    Cacophrène

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Points : 54
    Points
    54
    Par défaut
    Ca marche parfaitement et les explications étaient limpides...

    Thanks guys!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Trier une matrice par rapport à une autre
    Par LoVan dans le forum MATLAB
    Réponses: 7
    Dernier message: 23/07/2012, 09h10
  2. TOP : Statistiques simple par rapport à une colonne
    Par haskouse dans le forum Autres outils
    Réponses: 0
    Dernier message: 09/02/2012, 17h25
  3. [XL-2007] Tri élaboré par rapport à une combobox
    Par sebing dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/08/2010, 15h46
  4. Réponses: 1
    Dernier message: 19/03/2009, 14h44
  5. Recherche Min par rapport à une colonne - awk
    Par samiy dans le forum Linux
    Réponses: 5
    Dernier message: 06/02/2008, 12h13

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