Appel variable dynamique sous Matlab

Résolu/Fermé
Joe - 2 mars 2009 à 16:00
 Ereizsil - 3 oct. 2013 à 17:46
Bonjour à tous,

Je viens de créer des variables dynamiques à la manière de Sacabouffe, en utilisant la fonction eval telle que :

for p=1:100,
eval(['A' num2str(p) ' = fonction de p']);
end;

qui me donne cent variables A1...A100

Je souhaiterais faire appel à ces variables dans une boucle for. Et c'est là que je bloque au niveau de la syntaxe... Je pensais à une expression du genre :

for j=1:q
if sprintf(A%g,j)>seuil
blablabla
end
end

Pouvez vous m'éclairer ?

6 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
2 mars 2009 à 16:30
Salut

À la manière de Sacabouffe ? :-D
Je pense pas que ce soit ma manière ; à mon avis c'est plutôt classique. ;-)

Pour ton truc, tu procèdes tout pareil :
for j=1:q
if eval(['A' num2str(j)]) > seuil
blablabla
end
end
C'est tout !

Ciao
0
Je viens d'essayer, cela fonctionne comme tu le dis. Merci bien !
En fait, je me rends compte que mes variable An seront des tableaux.
A partir de là, j'ai trouvé comment récupérer une valeur dans ces tableaux.

Voici mon exemple :

n=1;
eval(['A' num2str(n) ' = [3,5,8]'])
x=eval(['A' num2str(n)])
x(2)

Cependant, y a t'il possibilité de raccourcir le code en effectuant les opérations des deux dernières lignes en une seule du type eval(['A' num2str(n)]) (2) ?

Je viens d'essayer mais j'obtiens un message d'erreur.

En tous cas, merci beaucoup pour l'aide apportée.
Bonne après midi
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
2 mars 2009 à 17:18
Pas de quoi ;-)

Pour ton autre question, y a bien ça
eval(['A' num2str(n) ' = [3,5,8] ; x = A' num2str(n) '(2);']);
Mais ça a pas grand intérêt, c'est la même chose que ce que t'as écrit en quelque sorte.
C'est que t'as pas besoin des An ? Juste des An(2) ?
Sinon, donne l'expression des An pour voir, ça sera peut-être plus parlant que l'exemple court que t'as donné. Parce que là, en faisant directement x=5;, ça va encore plus vite. :-D
Mais bon, j'imagine que c'est bien différent pour ton code et que tu peux pas le faire...

Bon après-midi à toi aussi
0
En fait, dans ma boucle for de 1 à n, je vérifie une condition sur les An(2) ... et je ne sais comment écrire ça :

if (tirage<proba) && (An(2)>seuil)
blabla
end

D'où ma question concernant la possibilité de réduire les 2 dernières lignes de mon bout de code du précédent message en une seule ... et c'est là que je vois pas trop comment faire !

Si quelqu'un a la solution ou des tuyaux ,je suis preneur !
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
2 mars 2009 à 17:33
Ah OK ! C'est tout !
Bon bon... J'avais pas du tout compris ce que tu voulais faire du coup.
Ben y a juste à rajouter la chaîne de caractères qu'il faut dans le eval alors.
if (tirage < proba) && (eval(['A' num2str(n) '(2)']) > seuil)
blabla
end
C'est bien ça ?
Bon après-midi à toi aussi !
0
Haaaaaaaa ça sent bon !
J'avais un problème de parenthèses en fin de compte. Je pense que tu as résolu le problème !

Je te remercie vivement pour ton aide, je suis très agréablement surpris pour ma première participation à un forum !

Bonne soirée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
2 mars 2009 à 17:52
Beh y a pas de quoi ! :-D
Et pis content que t'aies apprécié ta première sur un forum. ;-)
À bientôt peut-être !
0
Bonjour,

J'avais le même souci que Joe et ai en partie trouver ici la réponse dont j'avais besoin.
Cependant, mon problème n'est toujours pas complètement résolu, j'espère donc que vous pourrez continuer à m'aider !

Alors voilà :

J'ai crée, grâce à la fonction eval(), une série de structures (21) dont les noms sont MatJ1, MatJ2... MatJ21. Chaque structure contient une matrice que l'on atteint par MatJX.d

Mon problème est que je veux maintenant pourvoir réatteindre ces matrices et calculer les coefficients de corrélation correspondants (CoefJ1... CoefJ21).

J'ai essayé de réutiliser la fonction eval et mon code ressemble à quelque chose comme ça :

for i=1:nbrJour

Jour=GrJour.g.i(i,:);

eval ('CoefJ' Jour '= corrcoef (MatJ' Jour '.d*MatJ' Jour '.d'' )');

end

Sachant que la variable Jour est de type string



En tous cas, tel quel, ça ne fonctionne pas... Alors si quelqu'un avait une idée ou pouvait m'expliquer ce qui ne va pas... Ce serait magnifique !
0