Salut,
j'ai une série de vecteurs que leurs noms fini par un numéro (genre a100,a101,a102...). Je souhaite faire une boucle et utiliser la succession des numéro dans une boucle pour optimiser mon code! merci de proposer une solution
Salut,
j'ai une série de vecteurs que leurs noms fini par un numéro (genre a100,a101,a102...). Je souhaite faire une boucle et utiliser la succession des numéro dans une boucle pour optimiser mon code! merci de proposer une solution
Bonjour,
As-tu pensé à regarder la FAQ ?
==> http://matlab.developpez.com/faq/?pa...ion_var_A1A2AN
"Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."
Merci pour la réponse,
J'ai le la FAQ et j'ai compris qu'il faut écrire B{1} au lieu de B1 pour incrémenter. j'ai appliqué sur mon code mais il ne reconnait pas la forme!
mon code:
et le resultat de la compilation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for w=1991:2007 if (R(h,1)==w) janv{w}=[janv{w} R(h,3)]; end
mes vecteurs c'est de janv1991 jusqu'à janv2007??? Cell contents reference from a non-cell array object.
Error in ==> SWI_mat at 367
janv{w}=[janv{w} R(h,3)];
merci
Déjà, il te manque un end qui termine ta boucle for, est-ce que ça change quelque chose ?
Oui je sais que ça manque un end! mais c'est pas la cause du problème voyons
en fait, la boucle if est loin d'être terminée c'est pour ça j'ai pas tout copié mais le end existe bien évidemment
Bonjour,
Il suffit de lire ce que renvoit MatLab pour comprendre la source de l'erreur : tu essayes de concaténer une variable de type cellule avec une autre qui visiblement est tout autre chose, un scalaire sans doute ou une matrice peut-être.
Regarde les fonctions :
ainsi que ce lien pour voir ce qui te conviendrait le mieux dans ton cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 help num2cell help mat2cell
"Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."
Tu as quoi dans ta variable janv ?
Tes variables janv1991...janv2007 ne vont pas se transformer par magie en janv{1991} ... janv{2007}.
Il aurait fallu dès le départ créer un tableau de cellules plutôt que de créer ces variables.
Pourrais-tu nous montrer plus de code ?
A mon avis c'est améliorable (la boucle n'est peut-être même pas nécessaire).
La variable janv1991 .. janv 2007 sont des vecteurs qui contiennent des entiers.
voici le code:
j'ai besoin d'ajouter un entier pour chaque vecteur! pour cela il me faut l'incrémentation des noms à l'intérieur de la boucle. j'ai bien sur fait l'initialisation de tous les vecteurs qui existent! merci pour la réponse ^^'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if (R(h,2)==1) janv=[janv R(h,3)]; for w=1991:2007 if (R(h,1)==w) janv{w}=[janv{w} R(h,3)]; end if isempty(janv{w}) janv{w}=zeros(1,1); end end w=1991;
Je t'ai demandé ce qu'est la variable janv.
Au début tu fais :
on ne sait pas à quoi a été initialisé janv mais je dirais [] et si R(h,3) est une valeur ou un tableau de nombres de taille 1*n
Code : Sélectionner tout - Visualiser dans une fenêtre à part janv=[janv R(h,3)];
alors janv va être un tableau de nombres.
Du coup si par la suite tu essayes de l'utiliser comme tableau de cellules forcément ça ne va pas fonctionner.
As-tu compris cette phrase :
Tes variables janv1991...janv2007 ne vont pas se transformer par magie en janv{1991} ... janv{2007}.
Je crois pourtant avoir compris
janv est un autre vecteur qui n'a rien a voir avec les vecteurs que je veux incrémenter! j'ai initialisé janv et janv1991 .. janv 2007.
je veux juste incrémenter les vecteurs janv1991 .. janv2007 (en utilisant la succession des chiffres 1991 .. 2007) de façon a ajouter une variable a chaque fois dans ces VECTEURS! (matrice a une colonne )
voici le code complet:
a supposé que "janv{w} permet de faire l'incrémentation.
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 dir_fich=pwd; dir_sat='C:\Documents and Settings\st\Bureau\ERS\swi\'; feval('cd',dir_sat); filename='lonlat.txt'; fid=fopen(filename); C=textscan(fid,'%n%f%f','delimiter',',','headerLines',1); fclose(fid); gridp=C{1}; lat=C{3} ; lon=C{2}; Result=[]; janv=[]; fev=[]; mar=[]; avr=[]; mai=[]; juin=[]; juill=[]; aout=[]; sept=[]; oct=[]; nov=[]; dec=[]; janv1991=[]; janv1992=[]; janv1993=[]; janv1994=[]; janv1995=[]; janv1996=[]; janv1997=[]; janv1998=[]; janv1999=[]; janv2000=[]; janv2001=[]; janv2002=[]; janv2003=[]; janv2004=[]; janv2005=[]; janv2006=[]; janv2007=[]; R1=0; g=0; w=1991; dossier=dir; nom_fich=dossier(4).name; HUM=fopen(nom_fich); CellERS=textscan(HUM,'%f%f%f%f%f','delimiter',',','headerLines',6); fclose(HUM); anneeERS=CellERS{1}; moisERS=CellERS{2}; jourERS=CellERS{3}; HumERS=CellERS{4}; noisehum=CellERS{5}; %on se'n sert pas R=[anneeERS,moisERS,HumERS]; l=size(R,1); for h=1:l if (isnan(R(h,3))~=1) R1=R1+R(h,3); g=g+1; if (R(h,2)==1) janv=[janv R(h,3)]; for w=1991:2007 if (R(h,1)==w) janv{w}=[janv{w} R(h,3)]; end if isempty(janv{w}) janv{w}=zeros(1,1); end end w=1991; SWImoy=R1/g; q=1; w=1991; for w=1991:2007 for q=1:12 IND{w}(q)=(mean(janv{w})-SWImoy)/STD(q); end end
merci.
Aïe mes yeux
Conseil : indente ton code : CTRL+A puis CTRL+I dans l'éditeur, ce sera plus lisible.
Ce que tu dois comprendre de l'objectif des tableaux de cellules c'est que tu NE dois PAS créer toutes ces variables qui :
1. ne servent à rien
2. ne sont pas facilement utilisables
Tu devrais par exemple faire :
Pour la suite j'avour que c'est tellement pas clair que je n'ai pas trop regardé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 %Pour les mois : mois = cell(1,12);%on crée un tableau de cellules vides de taille 1*12 %Pour les annees vannees = 1991:2007; janv = cell(1,length(vannees ));%on crée un tableau de cellules vides de la même taille %que le vecteur des années
Ah si ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 feval('cd',dir_sat);%QUELLE HORREUR ! %s'ecrit cd(dir_sat); %Et encore mieux il faut éviter de faire des CD et utiliser les noms complets filename = fullfile(dir_sat,'lonlat.txt');
Bien Bien vous avez résolu tout sauf mon problème
merci pour le soutien pareil
Euh...ben ton problème n'est pas clair du tout en fait...
Je ne comprends pas ce que tu veux faire avec tes données.
Je te dis juste comment les créer de façon "intelligente" (a priori car si ça se trouve tu pourrais même simplement utiliser un tableau de nombres, mais comme tout ça n'est pas très clair...)
Bon je tente une dernière chance
On oubli le code pour le moment, il suffit juste de savoir que j'ai des vecteurs (janv1991, janv1992,janv1993, ... ,janv2007) initialisés vides.J'ai besoin de faire une boucle et les utiliser avec un code optimisé bien sur! de ce fait j'ai besoin de savoir comment jouer sur les chiffres successifs 1991,1992,1993...,2007 dans le nom des vecteurs lui même! c'est à dire passer d'un vecteur à un autre juste en incrémentant la boucle. Je sais que c'est un peu délicat mais j'ai besoin juste de la commande qui permet de reconnaitre un chiffre dans un nom d'une variable qui est ici un vecteur.
mais pourquoi veux-tu créer ces vecteurs ????
Ce n'est PAS DU TOUT efficace.
On t'explique depuis le début que tu devrais utiliser un tableau de cellules plutôt que plein de variables différentes.
Entre utiliser janv1991, ...janv2007 et :
la différence est que la seconde solution est EFFICACE puisque ensuite tu peux boucler facilement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 vannees = 1991:2007; janv = cell(1,length(vannees ));%on crée un tableau de cellules vides de la même taille %que le vecteur des années
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for nA = 1:length(vannees) janv{nA} = sprintf('contenu de l''annee %d',nA); end janv{1} janv{4} %...
Palsajicoco, pourquoi demandes tu de l'aide si quand on t'en donne tu la refuses?
La boucle de Caro-Line est evidemment la solution a adopter ! le nom de tes vecteurs sera change exactement de la maniere que tu souhaites...
Bonjour,
Je sais que je vais me faire taper sur les doigts mais si tu tiens vraiment à utiliser ta méthode, il existe la fonction
Je souligne tout de même que la solution de Caroline est bien mieux
Code : Sélectionner tout - Visualiser dans une fenêtre à part help eval
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager