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 :

Problème de déclaration de variable [Débutant]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut Problème de déclaration de variable
    Bonjour à tous

    Ca parait bête mais ça fait un bon moment que je suis la dessus:

    J'ai un problème de déclaration de variables.
    En gros, ma variable "Value" est du type cell et s'agrandit au fur et à mesure de mon programme.

    A la fin, Value = 6x17 cell

    La variable se rempli de la façon suivante : Value = [Value, B{1}];, ou B est une variable du type 2x1 cell.

    Jusque là, pas de problème.

    Pour gagner du tps et de l'espace, je voudrais utiliser la pré-allocation de mémoire, c'est à dire déclarer ma variable Value avec une grande taille, du genre 20x20.

    J'écris donc au début de mon programme la déclaration :
    mais j'ai l'erreur
    ??? Error using ==> horzcat
    CAT arguments dimensions are not consistent.

    Error in ==> prog at 62
    Value = [Value, B{1}];
    Je comprend l'erreur:
    Value et B sont deux "cell" de taille différente

    Alors je déclare aussi B pour que Value et B soit de la même taille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Value = cell(20);
    B = cell(20);

    Résultat : Même erreur.

    Je ne comprend pas pourquoi ça ne passe pas si c'est bel et bien un problème de taille et de format.

    Merci d'avance!

    CG

  2. #2
    Expert confirmé
    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
    Par défaut
    Si tu pré-alloues, tu n'as plus besoin de faire de concaténation...
    Et pourquoi ne pas pré-allouer directement à la bonne valeur ?
    Je suppose que tu faisais ta concaténation dans une boucle avec un itérateur.

    Par contre pour t'aider plus il faudrait un peu plus d'infos sur ton code d'origine, en particulier la taille de B{1} (6*n je suppose ?)
    Je verrai un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Value=cell(6,17);
    for iter=deb:pas:fin %ta boucle ça peut être un while aussi
       %calculs
       Value(:,iter)=B{1};%je met le vecteur colonne B{1} (si taille=6*1) dans la iter ième colonne de Value
    end

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    Salut,

    tu pense qu'on manque d'information pour t'aider à résoudre ton probleme

    Tu peux poster une partie de ton code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    % Attention : cell(20) est de taille 20*20 !
    Value = cell(1,20);
     
    for u=1:20
        B = [{u} ; {u+1}];
        Value(u) = B(1);
    end
    ++

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    salut!

    Caro, j'ai essayé ce que tu proposes et j'ai une autre erreur :
    ??? Conversion to cell from char is not possible.

    Error in ==> dave_02 at 63
    Value(:,i) = B{1};
    Voila donc un peu plus d'explications sur ce que fait mon programme:

    1-ouvre un fichier texte
    C'est un fichier de données numériques du genre:

    colonne1 colonne2 colonne3
    3 sec 2 Km 8 °
    21 sec 45 km 34 °
    1 sec 0.23 Km 11 °


    Dans un premier tps B=ligne 2 en vue d'extraire les unités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B = strread(tline,'%s','delimiter','\t'););
    (entre chaque colonne c'est une tabulation)

    donc B=
    3 sec
    2 Km
    8 °


    puis pour séparer les valeurs et les unités:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:length(B)
        B = strread(B{i},'%s');
        Value = [Value, B{1}];
    end
    résultat:
    B=
    '3'
    'sec'
    etc...

    et Value se rempli au fur et à mesure des 1ers éléments de B.

    J'espère que c'est un peu plus clair comme ça!

  5. #5
    Expert confirmé
    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
    Par défaut
    Ce code fonctionne ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:length(B)
        B = strread(B{i},'%s');
        Value = [Value, B{1}];
    end
    Parce que là, dès la 1ère boucle tu écrases ta variable B => choisis un autre nom de variable pour le B noté en rouge.

    Sinon je repose une question : tu es sur que Value est de taille 6*17 à la fin ? ça me parait étrange (ou alors c'est que avec l'exemple que tu as donné il ferait 3*3 mais qu'en réalité tu as 6 colonnes...).

    Je suppose que dans ton code entier tu as une double boucle : une pour lire chaque ligne en plus de celle que tu nous montre ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Je pensais faire plus clair en limitant les noms de variables sur le forum. Apparemment c'est loupé!

    En fait concernant la taille de la variable Value:
    Dans l'exemple que j'ai donné, Value = 3*3 cell effectivement.
    La nombre de lignes de Value dépend du fichier texte à partir duquel on extrait les données. Ca peut aller jusqu'à 1000 lignes!

    Concernant le code que j'ai fourni, je suis d'accord avec le fait que j'écrase la variable B.

    Le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tline = fgetl(fid);
     
    A = strread(tline,'%s','delimiter','\t');
     
    for i=2:length(A)
        B = strread(A{i},'%s')
        Unit = [Unit, B{2}];
        Value = [Value, B{1}];
    end

    Je suis en train de creuser la piste de mr_samurai mais ça tatonne!

  7. #7
    Expert confirmé
    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
    Par défaut
    Le problème pour la pré-allocation c'est qu'a priori tu ne connais pas à l'avance ton nombre de ligne dans ton fichier, non ?
    Donc c'est impossible dans ce cas de déterminer à l'avance la taille de Value et Unit.

    De plus dans ton code tu ne remplis qu'une seule ligne : comment crées-tu par la suite ta matrice avec les autres lignes ?

    Une idée (sans pré-allocation), basée sur ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    j=1;
    while ~feof(fid)
       tline = fgetl(fid);
     
       A = strread(tline,'%s','delimiter','\t');
     
       for i=2:length(A)
         B = strread(A{i},'%s')
         Unit{i,j} = B{2};
         Value(i,j) = str2num( B{1});%conversion en numérique
       end
       j=j+1;
    end
    Donnerait sur ton exemple la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Unit={'sec,'km','°';'sec,'km','°';'sec,'km','°'}
    Value=[3 2 8;21 45 34;1 0.3 11]
    Après peut-être que tu pourrais lire ton fichier en une seule fois avec textscan ? Dans ce cas tu aurais accès directement aux nombres de lignes.

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

Discussions similaires

  1. Problème de déclaration de variables
    Par philou7176 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/01/2009, 18h18
  2. Problème de déclaration de variable
    Par popy67 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 15/01/2009, 13h09
  3. Réponses: 2
    Dernier message: 15/11/2007, 15h15
  4. [Configuration] Problème de déclaration de variable en php5
    Par domray dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/04/2007, 01h22
  5. Réponses: 8
    Dernier message: 03/11/2006, 15h55

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