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 :

Réorganisation d'un programme en fonctions


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Réorganisation d'un programme en fonctions
    Bonjour à tous,

    Je bute sur un problème depuis des heures et j’aimerais bien un avis extérieur pour avancer sur le sujet parce que là je commence à désespérer.
    J’ai rédigé un programme de traitement d’image de quelques centaines de lignes. Afin de simplifier sa lecture je l’ai réorganisé en fonctions.

    Malheureusement cela marche au début et bloque au bout de la 6e créée.
    Ce qui pose problème est que la fonction devrait donner en sortie plusieurs variables type cell array de dimension 1*15 dont chaque cellule contient un vecteur de dimension 1*800, mais elle sort maintenant des cell array contenant un scalaire (dim 1*1). Ce scalaire correspond à la dernière valeur des vecteurs obtenus précédemment.

    J’ai par la suite essayé de lancer la fonction en dehors du programme principal qui l’appelait. J’ai donc fait tourner ce dernier en le faisant s’arrêter avant la fonction qui posait problème afin d’avoir les même conditions d’utilisation et les mêmes grandeurs d’entrée pour ma fonction. Puis j’ai lancé la fonction dans la fenêtre de commande et j’obtiens les valeurs voulues (cell array 1*15 contenant des vecteurs 1*800).
    Et bien sûr cela marche aussi si j’extrais le code de la fonction et que je les lance à part.

    Je ne vois donc pas du tout ce qui change entre le cas où je lance la fonction manuellement et celui où le programme l’appelle puisque dans mes deux essais la fonction est lancée dans des conditions qui semblent les mêmes.

    Si vous pouviez ce serait sympa parce que là je suis bloqué.

    Merci d’avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Sans code, je vois mal ce que l'on pourrait te dire
    Vu que cette fonction semble fonctionner correctement, as-tu vérifié les précédentes?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    En effet le code peut aider.
    Je mets à la suite dans un premier temps le code du programme principal jusqu'à la fonction qui pose problème (ligne finale) et dans un second temps le script correspondant à la fonction en elle même.

    Le but de la fonction est en gros de calculer les ordonnées des points d'une droite dont on connait un point de coordonnées (long,lat) et l'angle qu'elle réalise avec l'horizontale ( teta). On fait cela pour 15 droites.


    Et oui toutes les fonctions précédentes fonctionnent. Elles renvoient les bonnes informations.

    Je ne sais pas si tout cela est clair et si le code est bien lisible.
    Et merci Winjerome pour ta réponse.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    %Trouver l'image de laquelle est extraite l'analyse de
    %l'allumage
    structureok = input('\n Calculer la structure?:(y/n)  ','s');
     
    if structureok=='y'
     
    [Framea,NFL]=allumage(Frame);
    %NF=NFL(1);
     
    %Analyse de l'image
     
    [lat,long]=pictana(Frame,NFL);
     
     
    %Détermination de la structure
     
    [f,frb,f2,d2,d,b,afn,nfrf,f2i,d2s]=structure_finding(Framea,HEight,WIdth,long,lat);
     
     %Tracé de la structure
    structure_plot(Frame,d,d2,f,f2,b,WIdth,lat,long,afn)
     
    end
     
    %Erosion des images
     
    rdisk=3;%rayon du disque pour l'érosion
    [Frameb]=pictero(Framea,rdisk);
     
     
    %Déterminationdes coordonnées du bord inférieur gauche (interne)
    %de la structure
     
    big=[f2 b];%bord inférieur gauche
    bsg=[f f2];%bord supérieur gauche
    aig=abs(atan(abs((long-b)/(lat-f2)))*180/pi)/180*pi; %angle big/ignition
    asg=abs(atan(abs((long-f)/(lat-f2)))*180/pi)/180*pi;
     
    nfrb=min(find(frb>b));%trouver l'image a partir de laquelle la flamme atteint la limite basse
     
    angledeg=30; %angle de balayage
     anglerad=angledeg/180*pi;
     npt=15; %nombre de droites à considérer
     npt=(floor((npt-1)/2))*2+1; %je veux un nb de pts impair (pour avoir l'angle 0)
     timep=0.1;
    seuilang=min(nfrb,nfrf)-1;%lorsque la flamme atteint le haut ou le bas de la structure
     
      %Détermination des points pour le rayon de flamme
     
     X=(1:1:WIdth);%vecteur abscisse pour le calcul des droites
     
     [Yr,Y2r,teta,Y,Y2]=calcul_droites(WIdth,X,HEight,npt,anglerad,lat,long,aig,asg);


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    function[Yr,Y2r,teta,Y,Y2]=calcul_droites(X,WIdth,HEight,npt,anglerad,lat,long,aig,asg)
     
       figure(1);subplot(122);hold on;  
    for i=1:npt %npt=15, 15 droites ici.
        teta{i}=-anglerad+(i-1)*2*anglerad/(npt-1);
        Y{i}=(X-lat)*tan(teta{i})+long;
     
     
     plot(X,Y{i},'LineStyle','--','Color','b')
    end
     
    for i=1:npt
        Y2{i}=(X-lat)*tan(-aig+(i-1)*(aig+asg)/(npt-1))+long; 
     hold off;
    end
     
     
     for i=1:npt
        Yr{i}=round(Y{i});
     
        for k=1:length(Y{i})
            if Yr{i}(k)==0;
                Yr{i}(k)=1;
            elseif Yr{i}(k)<0 
                Yr{i}(k)=1;
            elseif (Yr{i}(k)-HEight)>0;
                Yr{i}(k)=HEight;
            end
        end
     
     end
     
      for i=1:npt
        Y2r{i}=round(Y2{i});
     
        for k=1:length(Y2{i})
            if Y2r{i}(k)==0;
                Y2r{i}(k)=1;
            elseif Y2r{i}(k)<0 
                Y2r{i}(k)=1;
            elseif (Y2r{i}(k)-HEight)>0;
                Y2r{i}(k)=HEight;
            end
        end
     
      end
     
     
    end

  4. #4
    Invité
    Invité(e)
    Par défaut
    Cela vient peut-être de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Yr,Y2r,teta,Y,Y2]=calcul_droites(WIdth,X,HEight,npt,anglerad,lat,long,aig,asg);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function[Yr,Y2r,teta,Y,Y2]=calcul_droites(X,WIdth,HEight,npt,anglerad,lat,long,aig,asg)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ca marche!! Je suis vraiment confus d'avoir posté pour une telle faute d'inattention. Mais en même temps je l'aurais pas trouvé seul donc je regrette pas, je ne cherchais vraiment pas ce genre de faute. Comme quoi, toujours vérifier la base.

    Merci encore pour ton temps.
    Bonne journée.

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

Discussions similaires

  1. Mettre a jour un programme en fonction de l'utilisateur
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/05/2007, 10h33
  2. Réponses: 1
    Dernier message: 28/03/2007, 15h33
  3. Réponses: 10
    Dernier message: 11/01/2007, 21h45
  4. Programmer une fonction joindre_fichier
    Par leCcsympas dans le forum Réseau
    Réponses: 5
    Dernier message: 03/12/2006, 19h51
  5. Réponses: 2
    Dernier message: 31/05/2005, 09h50

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