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 :

utilisation de Varargin [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 16
    Points
    16
    Par défaut utilisation de Varargin
    Bonjour à tous !
    Alors voilà, je modifie et complète une fonction qui existe déjà Spectral_settings pour relier le tout à mon interface graphique.
    Je crée donc une nouvelle variable capt qui représente un signal à ouvrir.

    Capt dépend de l'endroit où l'utilisateur clique sur une image de l'interface graphique.
    Voilà comment est défini capt :

    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 capteur(hObject, eventData)
     
    global X3 capt
     
    % Définition du point courrant
    hAxes = get(hObject, 'Parent');
    point=get(hAxes, 'CurrentPoint');
     
    % Découpage de l'image
    S = size(X3);
    nr = floor(S(1)/10);
    nc = floor(S(2)/10);
     
    % Définition des capteurs
    capteurs={'Track1','Track31'};
     
    % Test et lancement de l'analyse : la position des capteurs est à définir pour chaque TP
    if  (ceil(point(1,1)/nr)==1 && ceil(point(1,2)/nc)==1)   %capteur micro, lance track1 (en haut à gauche)
        capt=capteurs(1);
        analyse_micro
    elseif (ceil(point(1,1)/nr)==1 && ceil(point(1,2)/nc)==8)  %capteur accelero, lance track31 (en bas à droite)
        capt=capteurs(2);
        analyse_micro
    end
     
    end
    Ce qui appelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %Affichage du graph correspondant à la valeur par défaut
    load mes_78.MAT;
    plot(10*log10(autosp(12800, capt)),'parent',axespectre);
    La fonction autosp appelle Spectral_settings que voilà (ou en tout cas le début):

    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
    global menu_vitesse_rotation menu_ponderation menu_nb_pt menu_overlap ...
        menu_padding menu_format menu_amplitude menu_disparam menu_sensibilite ...
        strlistvitesse strlistpond listnbpt listoverlap listpadd strlistformat ...
        strlistamplitude listdisparam listsensib valeur_fmin valeur_fmax nchan capt
        % duree listduree menu_duree
     
     
    if ~exist('varargin')
        error('Cette procedure est réservée aux fonctions autosp, crossp, matsp');
    end
     
    % vérification échantillonage
    if class(ech)~= 'double' | length(ech) > 1
        error('Le premier argument doit etre la fréquence d''echantillonage (scalaire)');
    end
     
     
    % Initialisation des variables
    vit = cell2mat(strlistvitesse(get(menu_vitesse_rotation,'Value')));
    win = strlistpond(get(menu_ponderation,'Value'));
    np = listnbpt(get(menu_nb_pt,'Value'));
    % duree = listduree(get(menu_duree,'Value'));
    overlap = listoverlap(get(menu_overlap,'Value'));
    zpad = listpadd(get(menu_padding,'Value'));
    format = strlistformat(get(menu_format,'Value'));
    amplitude = strlistamplitude(get(menu_amplitude,'Value'));
    disparam = listdisparam(get(menu_disparam,'Value'));
    sensib = listsensib(get(menu_sensibilite,'Value'));
    frange = [str2double(get(valeur_fmin,'String')),str2double(get(valeur_fmax,'String'))];
     
     
    % récupération des parametres passés dans varargin
    for i = 1:2:length(varargin)
        if isstr(varargin{i})
            switch varargin{i}
                case 'win'
                    win = varargin{i+1};
                    if ~isstr(win) error('Erreur fenetre de pondération'); end
                case 'duree'
                    duree = varargin{i+1};
                    if ~isnumeric(duree) error('Erreur durée de fenetre temporelle'); end
                case 'np'
                    np = varargin{i+1};
                    if ~isnumeric(np) error('Erreur nombre de points'); end
                case 'disparam'
                    disparam = varargin{i+1};
                    if disparam ~= 0 && disparam ~= 1 error('Erreur : disparam = 0 ou 1'); end
                case 'overlap'
                    overlap =  varargin{i+1};
                    if overlap > 99 || overlap < 0 error('Erreur : 0 < overlap < 99'); end
                case 'amplitude'
                    amplitude = varargin{i+1};
                    if ~isstr(amplitude) error('Erreur amplitude'); end
                case 'format'
                    format = varargin{i+1};
                    if ~isstr(formout) error('Erreur format'); end
                case 'zpad'
                    zpad = varargin{i+1};
                    if ~isnumeric(zpad) error('Erreur zero-padding'); end
                case 'sensib'
                    sensib =  varargin{i+1};
                    if ~isnumeric(sensib)  error('Erreur de sensibilité'); end
              % case 'capt'
                    %capt = varargin{i+1};
                case 'frange'
                    frange =  varargin{i+1};
                    if ~isnumeric(frange)  error('Erreur : frange incorrect');
                    elseif length(frange) ~= 2 error('Erreur : frange incorrect');  end
                otherwise
                    error(['Parametre ' varargin{i} ' inconnu. Parametres connus : ''capt'',''np'', ''duree'', ''win'', ''overlap'', ''amplitude'', ''disparam'', ''sensib'', ''frange'', ''zpad''']);
            end
    Voici mon problème :

    Si je ne mets pas les deux lignes :
    % case 'capt'
    %capt = varargin{i+1};
    et que je remplace capt par Track1 dans la fonction plot

    varargin est 1x1 cell = [1x64000 double]
    et tout se déroule comme il faut dans la suite du programme.

    Mais si j'utilise la variable capt, et que je rajoute ces lignes,
    varargin est : 1x1 cell= [1x1cell]

    et la suite du programme ne fonctionne pas
    (exemple d'erreur par la suite : Conversion to double from cell is not possible.)


    Est-ce que vous voyez pourquoi varargin change de type si je rajoute capt ou non ?

    (en sachant que dans les autres variables il y a aussi des tableaux de string qui sont définis de la même manière que capteurs ... )


    Merci d'avance .. ça commence à être un peu trop difficile pour moi !

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

    Quel est le prototype de la fonction autosp ? Les entrées/sorties ?
    Que contient capt dans la ligne du plot ?

    Je ne vois pas en quoi le rajout ou pas de la ligne capt = varargin{i+1}; change varargin...

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Voilà comment est défini autosp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [asp, freqs] = autosp(ech, varargin)

    tracer ceci ne pose pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(10*log10(autosp(12800, Track1)),'parent',axespectre);
    Moi non plus je ne vois pas trop pour être honnête .. du coup j'ai l'impression de passer à côté de quelque chose ..

  4. #4
    Invité
    Invité(e)
    Par défaut
    Au vu des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    capteurs={'Track1','Track31'};
    capt=capteurs(1);
    capt=capteurs(2);
    plot(10*log10(autosp(12800, capt)),'parent',axespectre);
    plot(10*log10(autosp(12800, Track1)),'parent',axespectre);
    est-ce Track1 ou 'Track1' ?
    Ce n'est pas la même chose : l'un est une variable, l'autre une chaine de caractères.

    Attention class(ech)~= 'double' est incorrect, il faut utiliser strcmp(class(ech),'double'), ou isa(ech,'double')

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    aïe .. tout le problème est là je suppose..

    J'ai plusieurs fichiers.mat

    mes_montee2.MAT
    mes_78.MAT
    mes_153.MAT

    Et chacun contient un Track1 et un Track31
    (j'aurai peut-être du commencer par ça excusez moi)

    Je voudrais faire une seule fonction que je veuille tracer track1 ou track31, d'où l'utilisation de la variable capt.

    Mais si dans la fonction capteur j'écris capt=track1 par exemple :
    ??? Undefined function or variable 'Track1'.
    Ce qui est normal puisque je n'ai pas fait load mes_blabla.MAT

    Comment faire alors pour qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(10*log10(autosp(12800, capt)),'parent',axespectre);
    j'arrive à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(10*log10(autosp(12800, Track1)),'parent',axespectre);
    Merci d'avance .. (et pour les corrections aussi !)

  6. #6
    Invité
    Invité(e)
    Par défaut
    D'une manière générale, préfère la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneVariable = load('monfichier.mat');
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    load('monfichier.mat')  
    % ou 
    load monfichier.mat
    Les variables contenues dans le .mat sont alors les champs de la structure retournée.
    Dernière modification par Invité ; 11/07/2012 à 16h24.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Merci Jérome, j'ai mis beaucoup de temps mais j'ai réussi !

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

Discussions similaires

  1. utilisation de varargin pour des répertoires
    Par Hew dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/04/2008, 16h51
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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