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 :

Création matrices creuses


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Création matrices creuses
    Bonjour à tous et à toutes,

    je dois créer une fonction creer qui va créer un type matrice. Mais j'ai des problèmes, surement au niveau des boucles.

    Mon travail:

    type info = {mutable c:float;i:int;j:int};;

    (** le type info sert a stocker la valeur d’un coefficient et sa
    position dans la matrice*)

    type matrice ={ nb_lig:int; nb_col:int; mutable tab: info array};;

    (*---------------------------------------------creer-------------------------------------*)
    let creer n p =
    let remplissage n p =
    let mat = Array.create (n*p) ({c=0.0;i=1;j=1}) in
    for l=0 to (n*p)-1 do
    mat.(l)<-{c=0.0;i=1;j=l+1}
    done;
    for k=0 to (n*p)-1 do
    mat.(k)<-{c=0.0;i=k+1;j=mat.(k).j}
    done;
    mat in
    {nb_lig=n; nb_col=p; tab=remplissage n p};;


    Mais j'ai un problème, par exemple

    creer 2 3 retourne

    [|{c = 0.; i = 1; j = 1}; {c = 0.; i = 2; j = 2}; {c = 0.; i = 3; j = 3};
    {c = 0.; i = 4; j = 4}; {c = 0.; i = 5; j = 5}; {c = 0.; i = 6; j = 6}|]}

    Et le résultat attendu serait plutôt:

    [|{c = 0.; i = 1; j = 1}; {c = 0.; i = 1; j = 2}; {c = 0.; i = 1; j = 3};
    {c = 0.; i = 2; j = 1}; {c = 0.; i = 2; j = 2}; {c = 0.; i = 2; j = 3}|]}.


    Merci.

    PS: Un algorithme me suffira vu que je n'ai aucun problème avec le langage lui même.


    Jeremux.

  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
    Tu devrais faire deux boucles *imbriquées*, au lieu de deux boucles l'une à la suite de l'autre.

    Pour chaque i, tu itères (pour chaque j, définir la case (i, j)).

    Par ailleurs, attention à l'utilisation du "mutable" devant le coefficient c. Ça peut provoquer des bugs subtils (let test = Array.make 5 {c = 0.; i = 0; j = 0} in test.(0).c <- 1.; test), et tu peux sans doute t'en passer.
    Par ailleurs, le fait de représenter des matrices "creuses" par des tableaux à deux dimensions plein me paraît un peu curieux. Si tu ne connais pas à l'avance la taille de la structure de donnée utiliser pour stocker les éléments, une liste paraît plus adaptée qu'un tableau; et pourquoi avoir deux dimensions ?

    Edit : je n'avais pas fait attention, ce n'est pas une matrice de dimensions n et p, mais un tableau (à une dimension) de dimension n*p.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    J'aurais bien aimé faire avec les listes, mais dans le cours on nous impose de faire ça avec des tableaux.

    J'ai compris pour la boucle, mais comment stocker dans un tableau ? de taille n*p.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Ok, j'ai trouvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let creer n p =
    let remplissage n p = 
     let mat = Array.create (n*p) ({c=0.0;i=1;j=1}) in 
     let k = ref 0 in
     	for t=1 to n do
     		for d=1 to p do
     			mat.(!k)<-{c=0.0;i=t;j=d};
     			k:=!k+1
     		done;
     	done;
     
     
     mat in
    {nb_lig=n; nb_col=p; tab=remplissage n p};;
    A bientôt et merci!

  5. #5
    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
    Tu n'as pas besoin de déclarer explicitement k, puisqu'il est égal à (t-1)*p+d-1. Si tu indexais de 0 à N-1 comme tout le monde, ce serait même directement t*p+d.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Pour l'indexation j'ai respecté la définition des coefficient pour une matrice en algèbre linéaire (définis par l'indice de ligne et de colonne). Merci, beaucoup pour l'idée sur k, ça me permet de mieux travailler le produit de deux matrices!

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

Discussions similaires

  1. Calcul rapide des valeurs propres d'une matrice creuse
    Par gsagnol dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/12/2007, 23h37
  2. Code pour matrice creuse (sparse matrix)
    Par Xavier dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/11/2007, 17h41
  3. Reshape d'une matrice creuse
    Par levit dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/07/2007, 13h46
  4. Matrices creuses de double
    Par panda31 dans le forum C
    Réponses: 7
    Dernier message: 25/04/2006, 09h46
  5. Matrice creuse
    Par lamar dans le forum C
    Réponses: 16
    Dernier message: 10/12/2005, 00h55

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