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 :

Difficulté pour faire tourner un programme en boucle


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Difficulté pour faire tourner un programme en boucle
    bonjour ,
    en fait je voulais vous poser une question j'ai une fonction (boot)
    et je voudrais faire tourner cette fonction n fois par exemple , j'ai fais la boucle suivante mais ca ne marche pas :

    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
    function y=iteration(x,n)
    %n nombred'itérations désirées
    %x vecteur des observations 
    for i=1:n
        y=boot(4,x);
        y(i)=y
     
    end
     
    sachant que la fonction boot est la suivante :
     
    function[Output]=boot(k,In)
    %       function[Output]=boot(k,In)
    %    
    %   Bootstrap  resampling  procedure  for  univariate  (In) 
    %   input data. For an input vector the  program  generates
    %   a bootstrap vector (of the size k), which elements  are
    %   the samples with replacement  from  the  input  vector.
    %   For an input  matrix  it generates a  bootstrap  matrix 
    %   (of the same numbers of columns as the  input  one  but 
    %   with k rows), which elements in columns are the samples 
    %   with  replacement from the columns of  the input matrix.
    % 
     
     
    [s1,s2]=size(In);     
      if s1==1,  
        Output=In(fix(s2*rand(1,k)+1)); 
      elseif s2==1  
        Output=In(fix(s1*rand(k,1)+1)); 
      else
             ind=fix(s1*rand(k,s2)+1)+ones(1,k)'*[0:s1:(s1*s2)-1];
             Output=In(ind);
      end;
    merci pour votre aide

  2. #2
    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 830
    Points
    14 830
    Par défaut
    Merci de donner le message d'erreur ou le résultat incorrect,
    cela permet pour les gens habitués de situer rapidement
    où se trouve le problème sans avoir à décortiquer le code

    Là rapidement je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:n
        y=boot(4,x);
        y(i)=y    
    end
    Tu écrases la variable y à chaque tour qui redevient donc un scalaire.
    A la fin ton vecteur y sera donc :
    y=[0 0 0 ... 0 boot(4,x)]
    Pour le comprendre fais tourner ton code sans les ; à la fin pour voir les valeurs.
    Donc ce serait plutôt directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:n
        y(i)=boot(4,x);   
    end
    Ceci dit si tu calcules à chaque fois la même chose tu peux aussi bien faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    y(1:n)=boot(4,x);
    %ou
    y=boot(4,x)*ones(1,n);
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    En fait le message d'erreur est le suivant quand j'exècute mon code, ici j'ai pris n=5 pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    y=iteration(x,5)
    ???  In an assignment  A(I) = B, the number of elements in B and
     I must be the same.
    alors que moi je voudrais tourner la fonction boot , qui normalement me donne un vecteur à chaque fois ( c'est une sorte de fonction de tirage avec remise ) , et mon problème est de pouvoir tourner cette fonction n fois , pour pouvoir obtenir les n vecteurs résultants .

  4. #4
    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 830
    Points
    14 830
    Par défaut
    Ce message d'erreur est référencé dans la
    In an assignment A(I) = B, the number of elements in B and I must be the same.

    Je te conseil aussi la lecture du tutoriel Gestion des matrices

    Manifestement tu as un travail à faire sur les dimensions de tes éléments.
    y(i) est forcément un scalaire donc si boot(4,x) te renvoie un vecteur et bien ça ne peut pas rentrer (en gros tu essayes de mettre 4 personnes sur un scooter 1 place )
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    J'ai beau essayé , en vain
    moi j'ai mis y(i) parce que je ne voyais pas d'autre solution pour prendre en compte le compteur i .
    Donc la question reste posée comment je peux avoir les résultats (qui sont des vecteurs )n fois . Please please help !!

  6. #6
    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 830
    Points
    14 830
    Par défaut
    2 solutions (qu'on trouve dans cette Comment créer des variables nommées A1, A2, A3, ...,AN ?) :

    Comme dans ton cas les vecteurs en sortie de boot sont toujours de la même taille, tu vas stocker chaque vecteur dans une ligne de la matrice (car y sera une matrice) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function y=iteration(x,n)
    %n nombred'itérations désirées
    %x vecteur des observations
     
    %initialisation => la matrice sera de taille n lignes * k colonnes
    k=4;%k est fixé
    y=zeros(n,k);
    for i=1:n
        %on assigne à la i ème ligne le vecteur sortie de la fonction boot
        y(i,:)=boot(4,x);
    end
    Pour accéder le ième vecteur par la suite tu feras tout simplement :
    Règles du Forum

    Adepte de la maïeutique

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    MERCI MERCI VOUS ETES GENIALE

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

Discussions similaires

  1. Réponses: 50
    Dernier message: 14/08/2014, 13h57
  2. Réponses: 4
    Dernier message: 27/06/2008, 08h35
  3. Réponses: 4
    Dernier message: 09/12/2005, 15h48
  4. En difficulté pour faire une requete
    Par Fonzy17 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/03/2005, 10h56
  5. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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