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 :

Comment distinguer 2 arguments optionnels de même classe


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut Comment distinguer 2 arguments optionnels de même classe
    Bonjour,

    La question est peut-être évidente mais je sèche depuis un moment:
    J'ai une fonction qui prend 2 arguments imposés et qui peut aussi avoir 1 ou 2 arguments optionnels dans un ordre indifférent:
    mafonction(A,B,C,d) ou mafonction(A,B,d,C), avec A,B,C matrices et d nombre
    J'étais entrain de réfléchir à comment coder cela avec varargin, mais il y'a un cas de figure problématique:
    Que faire si C est un tableau 1*1 ? comment le distinguer du nombre d?
    Pas avec class vu que class(C) et class(d) renverront tous 2 un 'double'
    Pas non plus avec size vu qu'on a dans les 2 cas 1*1...
    Avez-vous une solution?
    car comment distinguer alors les cas mafonction(A,B,C) et mafonction(A,B,d)?...

    merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut
    Je pensais m'en être sorti:
    Ahahhhhh
    ismatrix ne donne rien mais isscalar oui, ouf
    sauf que varargin donne un tableau de cellules, donc C et d seront... des tableaux

    Quelqu'un a une soluce?

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    salut

    matlab est un language matriciel, c'est à dire que tout est matrice
    un scalaire (d) est une matrice 1*1, donc impossible à différencier d'une matrice C 1*1

    après pourquoi permettre à l'utilisateur de changer l’ordre des arguments ?
    pourquoi ne pas imposer les écritures mafonction(A,B,C) et mafonction(A,B,[], d) par exemple?

    ou utiliser des paires d'arguments comme mafonction(A,B,'C',C,'d',d) ?

    Fabien

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Une autre solution consiste à utiliser une structure pour passer les arguments :

    Avec S.C et S.d les deux champs contenant les valeurs de C et d

    Tu peux tester les entrées comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ~isfield(S, 'C') || isempty(S.C)
     
    end
     
    if ~isfield(S, 'd') || isempty(S.d)
     
    end

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut
    Merci à tous deux
    je vais préférer la 1e méthode plus naturelle vu les utilisateurs que j'ai derrière..
    Mais comment imposer en argument 'C',C,'d',d, s'il vous plait ?

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    en faisant quelque chose comme :
    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 mafonction(A,B,varargin)
    sOptions = parserPropVal(varargin{:});
     
    % ton code
     
      % fonction qui parse les entrées
      function sOptions = parserPropVal(varargin)
        % Si le nombre d'argument n'est pas pair
        if mod(nargin, 2)
            error('Paire d''arguments non valide.');
        end
     
        % valeur par defaut
        sOptions.C = [];
        sOptions.d = nan;
     
        % Pour chaque paire Propriété/Valeur
        for idx = 1:2:numel(varargin)
           switch varargin{idx}
              case 'C'
                  sOptions.C = varargin{idx+1};
              case 'd'
                   sOptions.d = varargin{idx+1};
              otherwise 
                 error('Paramètre "%s" invalide.', varargin{idx});
           end
        end
      end
    end

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/02/2009, 15h40
  2. Réponses: 3
    Dernier message: 30/09/2008, 14h18
  3. Réponses: 6
    Dernier message: 27/08/2008, 13h58
  4. Comment attraper tous les noeud d'un même type dans un tableau
    Par lodan dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 01/04/2007, 16h36
  5. Traitement d'image, comment distinguer des types?
    Par inai dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 07/06/2005, 01h09

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