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 :

Variable appears to change size on every loop iteration - préallocation


Sujet :

MATLAB

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Variable appears to change size on every loop iteration - préallocation
    Bonjour à tous,je voudrais votre avis sur ce code.Nb j'utilise matlab R2012a.
    Je veux transformer ce code matlab en langage C,pour cela je fais appel à l'outil coder de matlab.
    Voici les deux codes:

    Le fichier contenant la fonction
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    function [y,Y,E,xbar,Delta,Eder,Etrue,SNRspars,sigmanoise]= mygenerdatatest(M,N,nb_pic,NoiseLevel)
    %#codegen
    coder.inline('never');
    % time samples
    Tau = 0:N-1; Tau = Tau(:);
     
    DeltaTau = 0.5;
    Tau = min(max(0,Tau+DeltaTau*(rand(N,1)-1/2)),N-1);
     
    %frequences sur la grille
    Theta = (0:M-1)/M; Theta = Theta(:);
     
    %position of peaks
    if(nb_pic==4)
        pos = [100 150 200 400];
    elseif(nb_pic==6)
        pos = [100 150 200 250 300 400];
    else
        q = randperm(M);
    	pos = q((1:nb_pic));
    end
     
    %perturbation
    Delta = zeros(M,1);
    if(nb_pic==4)
        Delta(pos) = [0.1 -0.4 -0.3 0.2]/M;
    elseif(nb_pic==6)
        Delta(pos) = [0.1 -0.4 -0.3 0.2 -0.1 -0.2]/M;
    else
        Delta(pos) = (0.1/M).*ones(M,1) ;      
    end
     
    %frequences
    Nu = Theta + Delta;
    o = Nu(pos);
     
    %modulus of peaks
    if(nb_pic==6)
        Al = [0.5 0.9 1 0.7 0.8 0.6]';
    elseif(nb_pic==4)
        Al = [0.5 0.9 1 0.7]';
    else
        Al = ones(nb_pic,1);
    end
     
    %phase of peaks
    fi = rand(nb_pic,1).*(2*pi);
     
    %exact sparse signal we want to estimate
    xbar = zeros(M,1);
    for ind = 1:length(o)
        ocur = o(ind);
        xbar(Nu == ocur) = Al(ind)*exp(1i*fi(ind));
    end
     
    %exact cisoid (before adding noise)
    sig = 0;
    %xx(k)=zeros(1,nb_pic);
    for k =1:nb_pic;
        xx(k)= zeros(1,nb_pic);
    end
    for k = 1:nb_pic
        %xx(k)= zeros(1,nb_pic);
        xx(k) = Al(k)*exp(1i*fi(k));
        sig = sig + xx(k)*exp(1i*2*pi*Tau*o(k));
    end
     
    %IFFT linear operator
    E = exp(1i*2*pi*Tau*Theta');
     
    %derivative
    Eder = ((1i*2*pi*Tau/M)*ones(1,M)) .* exp(1i*2*pi*Tau*Theta');
     
    % exact frequency matrix
    Etrue = exp(1i*2*pi*Tau*Nu');
     
    %observation
    Y = sig(:);
    sigmanoise =  std(Y) * 10^(-NoiseLevel/20);
    z = randn(2*N,1);
    y = Y + (sigmanoise/sqrt(2)) * (z(1:N,1) + 1i * z(N+1:end,1));
     
    SNRspars = 20*log10(min(Al)/sigmanoise);
     
    end
    Le fichier test ie fichier qui lance le programme en qlq sorte comme un main
    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
    %#codegen
     
    M = 500;%Number of points in the fft
    N = 50; %Number of observations
    nb_pic = 4; %Number of peaks
    NoiseLevel = 30;
    % fonction
    [y,Y,E,xbar,Delta,Eder,Etrue,SNRspars,sigmanoise]= mygenerdatatest(M,N,nb_pic,NoiseLevel);
     
    % affichage
    fprintf(1,'grid error = %g\n',norm(Y-E*xbar))
    fprintf(1,'linearization error = %g\n',norm(Y-(E+M*(ones(N,1)*Delta').*Eder)*xbar))
    fprintf(1,'modelling error = %g\n',norm(Y-Etrue*xbar))
    fprintf(1,'SNR = %g dB\n',SNRspars)
    fprintf(1,'sigmanoise = %g\n',sigmanoise)
    Dans ce script il y a erreur que je n'arrive pas à résoudre pour lancer le coder de matlab.

    Pour lancer le coder, matlab veut que tout les scripts sont transformer en fonction,j'ai essayé et c'est écrit là en haut,ensuite quand je fais appel à coder il y a encore une erreur qui dit que la variable xx(k) doit être définit mais je n'y arrive pas à le faire et la génération ne peut pas se faire.
    Alors si quelqu'un a une idée s'il vous plaît aidez moi,merci beaucoup

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    il y a une erreur au niveau de la définition de xx.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k=1:nb_pic;
        xx(k)= zeros(1,nb_pic);
    end
    Tu définies un scalaire comme étant égal à un vecteur.
    Tu n'as pas besoin de boucle... Je suppose que tu souhaites définir un xx comme étant un vecteur nul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xx(1:nb_pic)=zeros(1,nb_pic);
    devrait convenir.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Merel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xx(1:nb_pic)=zeros(1,nb_pic);
    Plutôt

    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merel> il faut utiliser les indices car les fi aussi sont des vecteurs.
    si on fait xx(1:nb_pic)=zeros(1,nb_pic); ça marche pas le compilateur de MATLAB n'accepte pas il souligne encore xx(k) en rouge.De plus si tu regardes bien en haut il y quelque code similaire à ce dernier en haut mais MATLAB accepte mais pour xx(k) je trouve pas de solution jusque là.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par andryran Voir le message
    il souligne encore xx(k) en rouge.
    En rouge ou orange ? Et quel est le message ?
    Si c'est l'avertissement
    might be growing inside a loop
    Le code de Merel / Dut règle justement ce "problème" et pour le comprendre je t'invite à lire ceci.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Et oui il me répond the variable 'xx' appears to change size on every loop iteration. Consider preallocation for speed.Nb et il affiche en orange pour warning maintenant.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Même réponse donc :
    Citation Envoyé par Winjerome Voir le message
    Le code de Merel / Dut règle justement ce "problème" et pour le comprendre je t'invite à lire ceci.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    J'ai déjà fait le préallocation mais pourquoi le compilateur marque en orange encore le xx(k)? c'est pas encore suffisant le bloc que j'ai alloué ou autres problèmes encore?

  9. #9
    Invité
    Invité(e)
    Par défaut
    As-tu fait cette préallocation avant ou après la ligne d'erreur ?

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    avant le warning,mais j'ai lu sur le lien parlant de la pré-allocation que je cite " Utilisée avec des matrices de petites tailles, sa mise en place peut être plus longue que l'ensemble des affectations des éléments de la matrice."
    Si tu as une idée le cette pré-allocation peut tu m'envoyer.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par andryran Voir le message
    Si tu as une idée le cette pré-allocation peut tu m'envoyer.
    Ce n'est ni plus ni moins ce qui t'a été conseillé dès les début par Merel.
    Citation Envoyé par andryran Voir le message
    mais j'ai lu sur le lien parlant de la pré-allocation que je cite " Utilisée avec des matrices de petites tailles, sa mise en place peut être plus longue que l'ensemble des affectations des éléments de la matrice."
    Tu ne l'as donc pas appliqué ? Alors c'est normal que tu obtiennes toujours ce message.
    Si tu estimes que ce n'est pas nécessaire, garde à l'esprit que ce n'est qu'un avertissement.

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    De ce fait ça n'affecte pas le résultat si je lance le coder avec cet avertissement?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Non. Si nb_pic est grand cela peut juste engendrer un ralentissement, comme expliqué dans la FAQ.

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    justement nb_pic = 4 c'est pas suffisant mais je vais augmenter cette valeur par une autre,merci pour ton aide.

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    xx = complex(zeros(1,10));
    for k = 1:nb_pic
        xx(1:nb_pic)=zeros(1,10);
        xx(k) = Al(k)*exp(1i*fi(k));
        sig = sig + xx(k)*exp(1i*2*pi*Tau*o(k));
    end
    Merci à vous c'est presque résolu avec la pré-allocation.

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

Discussions similaires

  1. Variable x ne change pas dans une boucle
    Par Krower dans le forum Excel
    Réponses: 2
    Dernier message: 28/06/2015, 22h28
  2. Remettre a zero une variable quand on change d'annee
    Par Latimer dans le forum Langage
    Réponses: 18
    Dernier message: 23/04/2015, 17h11
  3. Ecriture variable dans fichier change résultat
    Par deadhand dans le forum Fortran
    Réponses: 11
    Dernier message: 16/07/2010, 14h19
  4. Erreur "For loop variable simple local varaible"
    Par Yepazix dans le forum Langage
    Réponses: 13
    Dernier message: 17/09/2005, 22h09
  5. Variable qui change après un DispatchMessage
    Par SekYo dans le forum Windows
    Réponses: 9
    Dernier message: 30/09/2004, 16h22

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