Ce que tu ne sembles pas avoir compris, c'est que tu n'auras pas différentes variables classn1, classn2, classn3 mais un seul tableau de cellules classn dont tu accéderas aux éléments en faisant classn{1}, classn{2}, classn{3}
Version imprimable
Ce que tu ne sembles pas avoir compris, c'est que tu n'auras pas différentes variables classn1, classn2, classn3 mais un seul tableau de cellules classn dont tu accéderas aux éléments en faisant classn{1}, classn{2}, classn{3}
Ok, je comprends mieux. Je vais creuser un peu mes idées sous ce nouvel angle. Merci !
Bonjour,
Effectivement, j'ai creusé, et j'ai trouvé. Plus un seul eval dans mes programmes/fonctions à présent ! Merci de votre aide, elle a été précieuse.
Un question cependant : je voudrais initialiser class, un tableau de 20 cellules, chaque cellule contenant une matrice (n,10) ; de même avec ind, tableau de 20 cellules également, chaque cellule contenant un entier naturel.
Pour l'instant, je procède comme il suit :
Mais Matlab continue à me conseiller d'initialiser class et ind pour plus de rapidité d'exécution. Comment faire ?Code:
1
2
3
4 for i = 1:classnb class{i} = zeros; ind{i} = 1; end
Merci !
Une façon de faire:
Code:autreNomQue_class = cellfun(@(x) zeros(n,10),cell(10,1),'UniformOutput',false)
Une autre solution avec la fonction DEAL :
Mais j'ai un doute sur l'utilité des tableaux de cellules ici...Code:
1
2
3
4
5 classnb = 5; n = 20; [classn{1:classnb,1}] = deal(zeros(n,10)); [ind{1:classnb,1}] = deal(1);
Si toutes les cellules ont la même dimension, et que celle-ci ne change pas lors de l'exécution du code, pourquoi ne pas simplement utiliser des tableaux comme ceci :
Je n'ai pas repris le problème depuis le début, j'ai certainement dû manquer quelque chose.... :?Code:
1
2
3
4
5 classnb = 5; n = 20; classn = zeros(n,10,classnb); ind = ones(classnb,1);
Ok ok, je change le nom ... Mais ça ne semble rien perturber qua j'appelle ma variable class, qaund bien même il s'agirait d'une fonction Matlab ... Pourquoi changer son nom dans ce cas ?
Sinon, je n'ai pas précisé que classnb = 20 et que n est variable et inconnue de moi. J'ai donc des tableaux de matrices, d'où l'utilisation de cellules.
Pour ind par contre, il y aurait effectivement un manière plus simple de faire : je regarde ça.
Simplement pour te donner une bonne pratique de programmation sous MATLAB qui t'évitera de venir demander de l'aide ici quand tu rencontreras ce genre de problème :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 >> max = 1 max = 1 >> V = rand(1,5) V = 0.8147 0.9058 0.1270 0.9134 0.6324 >> max(V) ??? Subscript indices must either be real positive integers or logicals.
Alors, finalement ind n'est plus un tableau mais une simple matrice (merci Dut), et class est initialisé comme il suit (parce que je ne connais pas n et qu'il faut que j'initialise chaque class{i} sans quoi j'ai un problème de dimensions par la suite) :
Tout est juste ?Code:
1
2
3
4
5
6 class = cellfun(@(x) zeros,cell(10,1),'UniformOutput',false); for i = 1:classnb class{i} = zeros; end ind = ones(classnb);
Ou Indexing cannot yield multiple results
En ce qui concerne ton code, je ne vois plus l'utilité de mon code vu comment tu fais avec ta boucle par la suite :?
Autant faire
As-tu essayé de regarder la sortie de mon code? Voire décomposer ses étapes?Code:toujoursAutreNomQue_class(1:classnb) = {0};
Je te conseille de regarder la :faq: Qu'est-ce que la préallocation de mémoire ?
Effectivement. Il s'agissait jsute d'une erreur dans le nombre de cellules :
Merci !Code:
1
2 claass = cellfun(@(x) zeros,cell(classnb,1),'UniformOutput',false); ind = ones(classnb);
Autre chose : un nouveau problème vient de survenir : Matlab ne passe pas la boucle
Je voudrais dire que si l'une des cellules de claass vaut toujours zéro, alors on ignore la suite de la boucle et on passe à la cellule suivante. Comment faire ?Code:
1
2 for i = 1:classnb claass{i} ~= zeros
Cette ligne est équivalente à la mienne: claass(1:classnb,1) = {0};.
La syntaxe que tu utilises (bien qu'elle soit peu élégante :roll:) est bonne (avec un if devant si tu veux faire un test)... Donc quel est ton problème?
D'après ce que j'ai compris de ce que tu veux faire, ISEQUAL serait à mon avis plus adapté.
Remarque: zeros sans argument peut être remplacé par 0.
Je ne saurais pas dire où étais l'erreur, quoi qu'il en soit elle semble corrigée aujourd'hui. Merci à tous et bonne continuation !