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 :

Problème de renvoi du paramètre d'une fonction


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème de renvoi du paramètre d'une fonction
    Bonjour,

    je tiens à préciser que je mon niveau en Matlab est "basique"...

    Je ne vais pas rentrer dans les détails de mon projet, mais voici mon problème:

    Voilà ma fonction principale:

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    %Code de la partie principale du programme
     
    function [Mat] = Main ()
     
    %Fichier sortie : Mat : matrice de décision de taille variable selon nombre
    %de sites à considérer
     
    %Lecture du fichier excel
    [num, txt, tab] = xlsread('Test.xls');
    %Copie des valeurs numériques dans une matrice
    for i=1:size(num,1)
        for j=1:size(num,2)
            mat(i,j)=num(i,j);
        end
    end
     
    %Informations
    nombre_sites = input('nombre sites / colonnes  ? ');
    nombre_criteres = input('nombre critères / lignes ?');
     
    %Déclaration du tableau de matrices
    %Taille du tableau selon nombre critères
    [nx,nz] = size(num);
    TabMat=zeros(nx,nz,nz);
     
    %Type critères
    for i=1:nombre_criteres %Boucle sur les critères
        %Test de la colonne contenant le type de critère
        if (num(i,nombre_sites+1) == 1) 
            %Affectation de la matrice au tableau général
            critereI(nombre_sites,i,TabMat,mat);
        elseif (num(i,nombre_sites+1) == 2)
            l = input('paramètre l ?');
            %Affectation de la matrice au tableau général
            critereII(nombre_sites,i,l,TabMat,mat);
        elseif (num(i,nombre_sites+1) == 3)
            m = input('paramètre m?');
            %Affectation de la matrice au tableau général
            critereIII(nombre_sites,i,m,TabMat,mat);
        elseif (num(i,nombre_sites+1) == 4)
            q = input('paramètre p?');
            p = input('paramètre q?');
            %Affectation de la matrice au tableau général
            critereIV(nombre_sites,i,q,p,TabMat,mat);
        elseif (num(i,nombre_sites+1) == 5)
            s = input('paramètre s?');
            r = input('paramètre r?');
            %Affectation de la matrice au tableau général
            critereV(nombre_sites,i,s,r,TabMat,mat);
        elseif (num(i,nombre_sites+1) == 6)
            sigma = input('paramètre sigma ?');
            %Affectation de la matrice au tableau général
            critereVI(nombre_sites,i,sigma,TabMat,mat);
            disp(TabMat(1,1,3));
        elseif (num(i,nombre_sites+1) == 7)
            %Affectation de la matrice au tableau général
            critereVII(nombre_sites,i,TabMat,mat);
        else
            disp('Problème : critère inconnu, vérifiez le fichier excel')
        end
    end
     
    %Calcul de la matrice de décision
    Mat=CalculIC(TabMat,nombre_sites, nombre_criteres);
     
     
    %Ecriture du fichier excel en sortie
    xlswrite('test_sortie', Mat);
    J'ai codé chacune des fonctions "critere" dans un fichier .m à part, mais je ne vais en donner qu'un:
    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
     
    function [TabMat] = critereVI (nombre_sites,n,sigma,TabMat,mat)
    %Programmation du calcul type VI
    %n : numéro du critère
    MatX = []; %Matrice contenant la différence f(b)-f(a)=x
    for i=1:nombre_sites     
        for j=1:nombre_sites
            if (i==j)
                MatX(i,i)=88; %Nombre indiquant case impossible
            else
                MatX(i,j)=mat(n,j)-mat(n,i);
            end
        end
    end
     
    for i=1:nombre_sites
       for j=1:nombre_sites
           if (i==j)
                TabMat(n,i,i)=88; %Nombre indiquant case impossible
           else
                TabMat(n,i,j)=1-exp((-MatX(i,j)^2)/(2*(sigma^2)));
           end
        end
    end
     
    disp(TabMat(1,1,3));

    Voilà mon problème:
    ma fonction "critereVI" est censée prendre en paramètre le tableau 3D "TabMat" (qui me sert à "ranger" mes différentes matrices renvoyées par chaque fonction "critere"), et renvoyer le même paramètre en sortie après modification!

    Le problème est qu'à chaque fois, mon tableau "TabMat" est vide, pourtant, après avoir fait quelques tests, la fonction "critere" enregistre bien des valeurs dans le tableau, c'est donc lors du renvoi dans la fonction principale qu'il y a un problème...

    Je ne vois pas ce qui cloche, pouvez vous m'aider?
    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    quand tu appelles ta fonction critereVI dans ton fichier principal, tu ne précise pas dans quel variable doit être stocké le résultat, c'est normal que tu n'aies rien dans TabMat... A chaque appel tu dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabMat = critereVI(nombre_sites,i,sigma,TabMat,mat);
    par exemple.
    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.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour, et merci d'avoir répondu aussi vite!

    Il s'avère que dans ma recherche de solutions, j'avais déja essayé ce que vous proposez, et comme cela me donne le même résultat, je pensais que ça n'avait pas d'influence


    J'ai donc corrigé la syntaxe dans mon programme, mais néanmoins, j'ai toujours le même problème

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Finalement, je ne sais pas pourquoi, mais en relancant une deuxième fois le programme, il semble que ça tourne désormais sans soucis...bon, l'important c'est que ça marche après tout


    Encore merci!
    Bonne fin de journée

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Comment tu t'es aperçu que ta variable TabMat est vide?
    Dans on code, disp(TabMat(1,1,3)) affiche le résultat attendu?

    Tu peux aussi utiliser des breakpoint dans ton code pour arrêter le code sur certaines lignes et vérifier le contenu des variables.
    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.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Effectivement, j'ai mis "disp(TabMat(1,1,3))" dans le code de la fonction "critèreVI" car j'étais sûr que cette valeur n'était pas nulle (les mathématiques ne mentent pas :p)

    J'ai mis exactement la même chose juste après l'appel de la fonction dans le programme principal et cela me renvoyait zéro ; comme il n'y avait pas d'étape entre les deux, l'erreur venait forcément de là! (système D )

    J'utiliserais les "breakpoints" la prochaine fois, merci de l'info!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2010, 16h08
  2. Problème avec paramètre d'une fonction (classe)
    Par clement.analogue dans le forum Langage
    Réponses: 8
    Dernier message: 23/03/2010, 08h13
  3. problème de paramètres dans une fonction
    Par morgan54 dans le forum VBA Access
    Réponses: 5
    Dernier message: 12/05/2008, 16h53
  4. Réponses: 4
    Dernier message: 22/03/2008, 12h06
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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