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 :

[Débutant] Fonction sur matrices


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [Débutant] Fonction sur matrices
    j'ai une fonction qui ne marche pas,pouvez vous me dire pourquoi
    car je donne L = ma matrice
    et qd je fais liste L ->problème
    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
    fonction [L{s,1},L{s,2}]= liste (L)
     
    if L==[Qx(1,1:n) ; Qy(1,1:n)]
     
    for a=1:n
    Qx(a,1)=Qx(1,a);
    Qy(a,1)=Qy(1,a);
    end
     
    for d=2:n
        for c=1:n+1-d
    Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
    Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
        end
    end
     
    eval (sprintf ('L%d%d=[Qx(1,1:n) ; Qy(1,1:n)]',s,1)) 
     
    for m=1:n
        for g=1:n
    Ls(1,g)=Qx(g,n+1-g);
    Ls(2,g)=Qy(g,n+1-g);
        end
    end
     
    eval (sprintf ('L%d%d=[Ls(1,1:m) ; Ls(2,1:m)]',s,2))
     
            else
                L==[Qx(1:n,1);Qy(1:n,1)]
     
                    for d=2:n
                          for c=1:n+1-d
                          Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
                          Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
                          end
                    end
     
                eval (sprintf ('L%d%d=[Qx(1,1:n) ; Qy(1,1:n)]',s,1)) 
     
                    for m=1:n
                            for g=1:n
                            Ls(1,g)=Qx(g,n+1-g);
                            Ls(2,g)=Qy(g,n+1-g);
                            end
                    end
     
                eval (sprintf ('L%d%d=[Ls(1,1:m) ; Ls(2,1:m)]',s,2))
     
    end
    merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par scraven
    eval (sprintf ('L%d%d=[Qx(1,1:n) ; Qy(1,1:n)]',s,1))
    D'après ce que t'as expliqué caro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L{s,2}=[Qx(1,1:n) ; Qy(1,1:n)]
    et les autres EVAL doivent aussi être modifiés.

    Ensuite, peux-tu nous donner des informations sur l'argument d'entrée L de la fonction et sur les variables Qx et Qy qui ne semblent pas être définies au début du code

  3. #3
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Ouille...
    Y'a plein de trucs bizarres...

    1/ je ne crois pas que tu aies le droit de faire :
    [L{s,1},L{s,2}]=
    comme argument de sortie de ta fonction.
    Et même si tu as le droit je ne vois pas bien l'intérêt.
    Mets plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    %fonction [L{s,1},L{s,2}]= liste (L)
    %il y a une typo dans ton texte d'ailleurs :
    %c'est function et pas fonction... :
    function S = liste (L)
     
    %ton code modifié avec les cell à la place des eval
     
    %et a la fin :
    S{1} = L{s,1};
    S{2} = L{s,2};
    Enfin c'est juste une proposition...

    2/ Ton L en entrée semble être un vecteur. On ne peut donc pas le transformer en cellule comme ça, il faut donc utiliser une autre variable pour faire les L{i,j} sinon ça va pas passer.

    Et sinon quand tu dis qu'il y a un problème, c'est bien de donner le message d'erreur donné par Matlab stp.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [débutant] fonction sur des matrices
    Voila j'ai un petit programme qui doit afficher des milieux de points que l'utilisateur rentre, il marche à part la fonction que j'ai rajouté dedans.
    J'ai essayé de suivre tes conseils caro,dis moi si c'est c'est bon ou pas stp.
    Merci d'avance

    fonction
    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
    function [S]=liste (z,w)
     
     
    L{z,w}=P;
     
                    for d=2:n
                          for c=1:n+1-d
                          Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
                          Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
                          end
                    end
     
    L{z,2*w-1}=[Qx(1,1:n) ; Qy(1,1:n)];
    disp('L{z,2*w-1}')
    disp(L{z,2*w-1})
     
                    for m=1:n
                            for g=1:n
                            Ls(1,g)=Qx(g,n+1-g);
                            Ls(2,g)=Qy(g,n+1-g);
                            end
                    end
     
    L{z,2*w}=[Ls(1,1:m) ; Ls(2,1:m)];
    disp('L{z,2*w}')
    disp(L{z,2*w})
     
    S{1}=L{z,2*w-1};    
    S{2}=L{z,2*w-1};
    et le programme
    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
    clear all
    close all
     
    %% on demande à l'utilisateur le nbre de points de controle
    n=input('Donnez le nombre de points de controle que vous désirez \n');
     
    %% on réalise une boucle car il y a n points de controle
    for a=1:n;
    Qx(a,1)=input(['Donnez l''abscisse du point de controle ' num2str(a) '\n']);
    Qy(a,1)=input(['Donnez l''ordonnée du point de controle ' num2str(a) '\n']);
    end
     
    %% on affiche les points de controle ds une matrice
    fprintf('P est la liste des points de controle\n');
    fprintf('colonne 1 gauche l''abscisse, colonne de droite l''ordonnée\n');
     
    for a=1:n
    Q1(1,a)=Qx(a,1);
    Q2(1,a)=Qy(a,1);
    end
    P=[Q1(1,1:n) ; Q2(1,1:n)]
     
     
    %% on fait une boucle pour calculer les milieux
     
    for d=2:n
        for c=1:n+1-d
    Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
    Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
        end
    end
     
    L{1,1}=[Qx(1,1:n) ; Qy(1,1:n)];
    disp('L{1,1}=')
    disp(L{1,1})
     
    for m=1:n
        for g=1:n
    Ls(1,g)=Qx(g,n+1-g);
    Ls(2,g)=Qy(g,n+1-g);
        end
    end
     
    disp('L{1,2}=')
    L{1,2}=[Ls(1,1:m) ; Ls(2,1:m)]; 
    disp(L{1,2})
     
    for z=2:n
      for w=1:2^z
      liste (z-1,w)
      end
    end

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Le premier message d'erreur me parait pourtant clair :
    ??? Undefined function or variable 'P'.

    Error in ==> liste at 4
    L{z,w}=P;

    Error in ==> prog at 50
    liste (z-1,w)
    Il te demande qui est ce P ??
    En fait ta fonction liste ne connait comme valeurs que celles que tu lui as passé en paramètres. Il ne connait pas les variables définies dans otn programme.
    Le plus simple serait de tout faire dans la même fonction en utilisant des nested functions

    Si ça te parait trop compliqué, il faut alors passer en paramètre de liste tous les parmètres du programme que tu vas utilisé (P,n,Qx,Qy...) mais ça me parait difficile. En plus il y a des variables que tu fais évolué dans liste (Qx,Qy) il faudrait donc les mettre en sortie de liste pour qu'ils soient pris en comtpe.

    Proposition en un seul bloc :
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    clear all
    close all
     
    %% on demande à l'utilisateur le nbre de points de controle
    n=input('Donnez le nombre de points de controle que vous désirez \n');
     
    %% on réalise une boucle car il y a n points de controle
    for a=1:n;
        Qx(a,1)=input(['Donnez l''abscisse du point de controle ' num2str(a) '\n']);
        Qy(a,1)=input(['Donnez l''ordonnée du point de controle ' num2str(a) '\n']);
    end
     
    %% on affiche les points de controle ds une matrice
    fprintf('P est la liste des points de controle\n');
    fprintf('colonne 1 gauche l''abscisse, colonne de droite l''ordonnée\n');
     
    for a=1:n
        Q1(1,a)=Qx(a,1);
        Q2(1,a)=Qy(a,1);
    end
    P=[Q1(1,1:n) ; Q2(1,1:n)]
     
     
    %% on fait une boucle pour calculer les milieux
     
    for d=2:n
        for c=1:n+1-d
            Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
            Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
        end
    end
     
    L{1,1}=[Qx(1,1:n) ; Qy(1,1:n)];
    disp('L{1,1}=')
    disp(L{1,1})
     
    for m=1:n
        for g=1:n
            Ls(1,g)=Qx(g,n+1-g);
            Ls(2,g)=Qy(g,n+1-g);
        end
    end
     
    disp('L{1,2}=')
    L{1,2}=[Ls(1,1:m) ; Ls(2,1:m)];
    disp(L{1,2})
     
    for z=2:n
        for w=1:2^z
            %liste (z-1,w,P)
            L{z,w}=P;
     
            for d=2:n
                for c=1:n+1-d
                    Qx(c,d)= 0.5 * Qx(c,d-1)+ 0.5 * Qx(c+1,d-1);
                    Qy(c,d)= 0.5 * Qy(c,d-1)+ 0.5 * Qy(c+1,d-1);
                end
            end
     
            L{z,2*w-1}=[Qx(1,1:n) ; Qy(1,1:n)];
            disp('L{z,2*w-1}')
            disp(L{z,2*w-1})
     
            for m=1:n
                for g=1:n
                    Ls(1,g)=Qx(g,n+1-g);
                    Ls(2,g)=Qy(g,n+1-g);
                end
            end
     
            L{z,2*w}=[Ls(1,1:m) ; Ls(2,1:m)];
            disp(['L{',num2str(z),',',num2str(2*w),'}'])
            disp(L{z,2*w})
     
            S{1}=L{z,2*w-1};
            S{2}=L{z,2*w-1};
        end
    end

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

Discussions similaires

  1. [unique] appliquer la fonction sur une matrice
    Par usto2005 dans le forum MATLAB
    Réponses: 7
    Dernier message: 02/10/2013, 15h46
  2. Fonction sur une matrice
    Par antoineleb dans le forum MATLAB
    Réponses: 0
    Dernier message: 27/06/2012, 13h43
  3. [débutant] opérations sur matrices
    Par bendamen dans le forum Langage
    Réponses: 8
    Dernier message: 10/05/2007, 07h50
  4. [LG]Symbole # (dièse) et fonctions sur les chaînes
    Par James64 dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2004, 15h19
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 10h46

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