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 faire pour remplir une matrice vide à la suite d'une boucle


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Comment faire pour remplir une matrice vide à la suite d'une boucle
    Bonjour, j'aimerais savoir comment effectuer l'opération suivante :

    Je dois effectuer 1000 fois l'estimation de coefficients de régression (entre autres), et les placer dans une matrice vide, dans le but ultime de calculer la moyenne de ceux-ci. (Il fallait auparavant générer les variables en question...)

    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
    %Création des variables
    N=50;  
     
    x1=randn(N,1);
     
    x2=randn(N,1);
     
    Et=randn(N,1);
     
    B0=0.5;
    B1=1.2;
    B2=0.8;
     
    y=B0+(B1*x1)+(B2*x2)+Et;
     
    T=N;
    K=2;
     
    %Création de la matrice X
    X = [ones(size(x1)),x1,x2];
     
    %Calcul des coefficient
    b=inv(X'*X)*X'*y;
    B=b';
     
    %Calcul des résidus
    e = y-X*b;
     
    %Calcul de la variance des résidus
    sigma2 = (e'*e)/(T-K);
     
    %Calcul de la variance des coefficients
    etype = sqrt(diag(var(b)));
     
     
     
    %Créaion de la des matrices de résultats
     
    Betas=NaN(size(b),m); 
     
    m=1000
    for i=(1:m);
        for j=(1:3)
     
     
    end;
    end;
    Comme vous le constatez mon problème se situe au niveau de la boucle, j'aimerais avoir des informations à propos de la syntaxe a utiliser. Ma matrice vide sera de 3x1000 étant donné que ma matrice des coeficients et de 3x1.

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir, et bienvenue sur le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Betas=NaN(length(b),m); 
    
    m=1000
    Attention de définir ta variable m avant de l'utiliser.

    Je te conseille dans un premier temps la lecture de Qu'est-ce que la préallocation de mémoire ?
    Préallocation qui est bien sûr extensible en 2D (NaN est aussi une solution, au même titre que zeros ou ones, à toi de voir selon le cas).

  3. #3
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Où se situe ton problème exactement ? Tu as une erreur ?

    Sinon, pour la programmation des boucles, je ne mettrais pas de point-virgule à la fin des lignes "for" et "end".

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 230
    Points : 352
    Points
    352
    Par défaut
    Ayant vu ton programme, je me suis permise d'y effectuer quelques modifications :

    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
     
    % Listes des constantes
    N=50;   % Taille des vecteurs d'entrées
    B0=0.5; % Valeur du coeff 0
    B1=1.2; % Valeur du coeff 1
    B2=0.8; % Valeur du coeff 2
    T=N;    % Affectation de la valeur N à la valeur T (utile ?)
    K=2;    % utilisé dans une formule 
    NbrCoeff = 3; % Correspond aux nombres de coeffs, à modifier s'il y en a plus ou moins
     
    %Création de la matrice de résultats 
    iter=1000;  % Nombre d'itérations souhaité
    Betas=NaN(NbrCoeff,iter);   % Initialisation de la matrice Betas
     
    for ind_iter=(1:iter)   
        % Vecteurs aléatoires (signaux d'entrées) modifié à chaque itération
        % Il est possible de les sortir de la boucle mais du coup, les colonnes
        % de Betas restent identiques
        x1=randn(N,1);
        x2=randn(N,1);
        Et=randn(N,1);
     
        % Formule liant les entrées à la sortie
        y=B0+(B1*x1)+(B2*x2)+Et;
     
        %Création de la matrice X
        X = [ones(size(x1)),x1,x2];
     
        %Calcul des coefficients
        b=inv(X'*X)*X'*y; % Obtention des coeff
        B=b'; % Passage en ligne (inutile si Betas est en 3x1000)
        Betas(:,ind_iter) = b; % Copie du résultat dans la colonne souhaitée
     
        %Calcul des résidus
        e = y-X*b;
     
        %Calcul de la variance des résidus
        sigma2 = (e'*e)/(T-K);
     
        %Calcul de la variance des coefficients
        etype = sqrt(diag(var(b)));
     
    end
    Tout ce qui correspond à des constantes ont été mises en début de programme.
    Ensuite, si tu veux estimer 1000 fois des coefficients, il est préférable d'avoir des vecteurs qui se modifient à chaque itération. J'ai donc passé x1, x2 et Et dans la boucle afin qu'ils soient modifiés à chaque passage dans la boucle.

    Comme tu as une modification à chaque itération, tu dois recalculer Y, ta matrice X,... donc ils sont placés dans la boucle.
    Du coup, tu as tes 3 coefficients dans B et tu peux les copier dans la matrice Betas.

    Après, j'ai peut-être mal compris le problème/demande.
    Je ne réponds pas aux questions techniques via MP. Le but du forum est de permettre de trouver des solutions ensembles pour aider un ensemble de personnes.

    Loi du Chaos Informatique
    L’informatique, ça tient du chaos : une fois ça marche, une fois ça foire, tu sais pas pourquoi, c’est juste que tu viens de changer de lobe sur l’attracteur étrange.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/03/2012, 21h06
  2. je ne sais comment faire pour remplir ma table de fait
    Par yougha dans le forum Alimentation
    Réponses: 2
    Dernier message: 18/01/2012, 15h26
  3. Réponses: 0
    Dernier message: 14/11/2011, 15h52
  4. Réponses: 12
    Dernier message: 18/04/2007, 19h13
  5. Réponses: 1
    Dernier message: 27/03/2007, 12h57

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