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 :

Création d'une "class" en matlab=>marche pas !


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Points : 38
    Points
    38
    Par défaut Création d'une "class" en matlab=>marche pas !

    Bonjour à tous,
    je n'arrive pas à comprendre le fonctionnement des class sous matlab. Apparemment, ça ne fonctionne pas comme en Java par exemple.
    J'ai bien sur essayer de trouver un tuto, j'ai emprunté 2 bouquins, mais au final, je ne pige pas pourquoi j'ai cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? Undefined function or method 'isColone' for input arguments of type 'double'.
     
    Error in ==> Signal>Signal.Signal at 23
               if (isColone(signal)==0)
    Bon, je comprend bien que ma fonction n'est pas def, mais pourtant, SI, je l'ai définie.
    Je vous envoie mon code, en espérant que qqn arrive à me faire comprendre mon erreur.
    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
    classdef Signal
        %Signal: crée un Signal représenté par un vec colone.
     
        % Contenu:  signal: signal échantillonné (vec colone)
        %           fréquence échantillonnage: Fe
        %           axe temporel: axe_temps
        %           axe frequentiel: axe_freq
        %           nombre de point: nbp    
     
        properties
            signal;
            Fe;
            axe_temps;
            axe_freq;
            nbp;     
        end
     
     
        methods
     
    %_____Constructeur
            function obj = Signal(signal,Fe)
                if isColone(signal)
                    obj.signal=signal;
                else
                    obj.signal=signal';
                end
     
               obj.nbp=length(signal);
               obj.Fe=Fe;
               obj.axe_temps=(1:obj.nbp)/Fe; %pour un vec de nbp points, la durée total d'observation est de n/fe (s)
               obj.axe_freq=(1:obj.nbp)*Fe/obj.nbp; %la FFT sur un axe 0->N se retrouve sur un axe 0->Fe       
         end
    %_____FinConstructeur
     
     
    %_____Permet de savoir si un vecteur est colone ou pas: retourn1 si vec colone 0 sinon   
        function bool = isColone(s)
                tempo=size(s);
                if isequal(tempo(2),1)
                    bool= 1;
                    return;
                else
                    bool= 0;
                    return;                       
                end          
        end
     
        end
    end %class
    J'en profite pour vous demander un petit coup de main:
    lorsqu'on crée une méthode dans une classe, je ne comprend pas comment on accède à l'objet courant (en java, c'est this par exemple).

    Par avance merci

  2. #2
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    répondre à une de tes questions reviens à répondre à la deuxième.
    en fait tu cherches à faire une méthode statique, il faut donc le lui dire.
    Sinon il est obligatoire de passer l'objet comme argument de la fonction, ce qui fait que cela dépend de la façon dont tu l'appelles pour remplacer le this
    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
    classdef Signal < handle % je le fais comme ça, je pense que c'est mieux.
        %Signal: crée un Signal représenté par un vec colone.
     
        % Contenu:  signal: signal échantillonné (vec colone)
        %           fréquence échantillonnage: Fe
        %           axe temporel: axe_temps
        %           axe frequentiel: axe_freq
        %           nombre de point: nbp    
     
        properties
            signal;
            Fe;
            axe_temps;
            axe_freq;
            nbp;     
        end
     
     
        methods
     
    %_____Constructeur
            function obj = Signal(signal,Fe)
                 obj.construct2(signal, Fe); % c'est débile mais c'est pour l'exemple
    % construct2(obj, signal, Fe);    
         end
    %_____FinConstructeur
     
            function construct2(tata, signal, Fe) % tata représente l'objet sur lequel tu appelles ta fonction => this
     
                if Signal.isColone(signal)
                    tata.signal=signal;
                else
                    tata.signal=signal';
                end
     
               tata.nbp=length(signal);
               tata.Fe=Fe;
               tata.axe_temps=(1:tata.nbp)/Fe; %pour un vec de nbp points, la durée total d'observation est de n/fe (s)
               tata.axe_freq=(1:tata.nbp)*Fe/tata.nbp; %la FFT sur un axe 0->N se retrouve sur un axe 0->Fe   
    end
     
    end
     
    methods (Static = true)
    %_____Permet de savoir si un vecteur est colone ou pas: retourn1 si vec colone 0 sinon   
        function bool = isColone(s)
                tempo=size(s);
                if isequal(tempo(2),1)
                    bool= 1;
                else
                    bool= 0;                      
                end          
        end
     
        end
    end %class
    remarque : pas besoin des return en matlab je pense.
    tu peux aussi toujours faire un fichier externe avec ta méthode isColone. au passage il doit y avoir plus simple pour s'assurer d'avoir une colonne mais il se fait tard...

    pour comprendre comment ça marche tu peux utiliser la documentation et un peu d'huile de coude.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Points : 38
    Points
    38
    Par défaut
    @tubaas:
    merci beaucoup, je vais étudier ton code! Peux-être que je comprendrai mieux qu'avec la doc, parce que je ne trouve pas que ce chapitre soit bien expliqué pour les débutants!

    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Points : 38
    Points
    38
    Par défaut
    c'est re moi

    alors j'ai encore un petit problème avec ce code: il me génère une erreur que je n'arrête pas de voir depuis 2 jours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> s=Signal3(vec,10)
    ??? Error using ==> Signal3
    Too many input arguments.
    Je ne pige pas pourquoi il trouve qu'il y a trop d'arguments?
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >> s=Signal3()
    s = 
      Signal3 handle
      Properties:
           signal: []
               Fe: []
        axe_temps: []
         axe_freq: []
              nbp: []
    Oui, mais moi, mon constructeur es censé fonctionner avec des arguments...

    A oui, juste une mini modif sur le fichier que tu m'as corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %_____Constructeur
            function obj = Signal(signal,Fe)
                obj.Fe=Fe;
                obj.construct2(signal, Fe); % c'est débile mais c'est pour l'exemple
                 
    % construct2(obj, signal, Fe);    
         end
    %_____FinConstructeur
    J'ai ajouté "obj.Fe=Fe;" sinon matlab me disait: "The function return value "obj" might be unset" en me soulignat obj en rouge.

    Une dernière question aussi: tu dis:
    Sinon il est obligatoire de passer l'objet comme argument de la fonction
    Comment matlab sait que l'objet obj dans mon cas, est justement obj. Je pense que le premier argument que l'on donne représente toujours l'objet nn?
    Et justement, si on ne veut pas mettre d'objet en premier argument, il faut que la méthode soit static=true n'est-ce pas?

    Par avance merci

  5. #5
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    je ne reproduis pas tes erreurs
    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
    a=1:10;
    b=Signal(a,1)
     
    b = 
     
      Signal handle
     
      Properties:
           signal: [10x1 double]
               Fe: 1
        axe_temps: [1 2 3 4 5 6 7 8 9 10]
         axe_freq: [0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1]
              nbp: 10
     
      Methods, Events, Superclasses
    as-tu essayé un copier-coller du code ?
    il faut normalement que ta classe dérive de handle. sinon on a bien défini un constructeur à 2 arguments.
    en ce qui concerne
    "The function return value "obj" might be unset" en me soulignant obj en rouge
    ceci doit être un M-Lint je suppose mais je ne l'ai pas trouvé dans ma version (au pire il devrait être orange et non rouge).
    (Tu peux regarder dans File -> Préférences ->MLint pour régler ceux que Matlab affichera)

    sinon pour ta dernière question effectivement le premier argument que tu passes est toujours l'objet et tu as deux syntaxes pour ce faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj.mafonction(...)
    mafonctione(obj,...)
    les deux syntaxes sont équivalentes donc Matlab va travailler sur l'objet qui lui est passé comme premier argument.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Points : 38
    Points
    38
    Par défaut
    Effectivement ton code marche.
    J'ai mal fait un truc avant.

    En tout cas merci beaucoup pour tes explications! Ca m'a aidé!
    Mais, je pense que d'ici là, j'aurai d'autres questions

    En attendant merci!

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

Discussions similaires

  1. [eZ Publish] création d'une nouvelle classe
    Par easyjava dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/12/2007, 08h28
  2. création d'une dll (classe c++)
    Par TheShadow dans le forum MFC
    Réponses: 4
    Dernier message: 10/04/2006, 16h21

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