Pour le compteur, pourrais-tu isoler le code en question?
(Je pense d'ailleurs t'avoir donné une réponse...)
Pour le compteur, pourrais-tu isoler le code en question?
(Je pense d'ailleurs t'avoir donné une réponse...)
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
En fait, tu m'avais donné une réponse mais comme ma question n'était pas claire, elle ne correspondait pas... Visiblement ce n'est toujours pas clair, je vais essayer de faire mieux.
Mon programme est capable de simuler 1 point et donc d'obtenir les sorties pour un point de fonctionnement. J'ai aussi inséré une option qui permet de faire varier un paramètre selon un pas et un nombre d'itérations, ce qui me permet de voir l'évolution d'une sortie quand cette entrée varie.
Tous mes résultats sont stockés dans ma variable 'results', qui est rendue globale via le SETAPPDATA - GETAPPDATA. A chaque pression sur le bouton simulation, que ce soit pour un seul point ou plusieurs, l'ensemble du yout est stocké dans une colonne de results. J'ai donc inséré un "compteur" 'cpt' qui m'indique le nombre de simulations effectuées et qui me permet ainsi, lors du traçage du graphe, de récupérer la (les) bonne(s) colonne(s) de 'results'.
Néanmoins, à partir de la 2e simulation, comme mes points dans 'results' sont x colonnes à droite, et que mon 'cpt' ne me donne qu'une valeur de fin de simulation, mon graphe ne rend pas les bons résultats. J'ai donc un problème dans la gestion de mon compteur. Idéalement, il faudrait qu'à chaque pression sur le bouton simulation, il soit réinitialisé à 1, de manière à écraser les résultats précédents et ainsi permettre le bon affichage du graphe.
En tapant ces quelques lignes, je me rends compte que ma méthode n'est pas idéale, mais je ne vois pas trop comment faire autrement.
Voici les bouts de code correspondants :
- au lancement de la fenêtre
- dans le simul_button
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cpt=1; setappdata(gcf,'Indice_compteur',cpt);
- dans le draw_button
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 data=getappdata(gcbf,'Data_in'); cpt=getappdata(gcbf,'Indice_compteur'); for j=1:28 results(j,cpt)=yout(j); end for k=1:32 data(k,cpt)=val(k); end %cpt=cpt+1; setappdata(gcf,'Results_history',results); setappdata(gcf,'Indice_compteur',cpt+1); setappdata(gcf,'Data_in',data);
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 abs=getappdata(gcbf,'Abscisse'); ord=getappdata(gcbf,'Ordonnee'); data=getappdata(gcbf,'Data_in'); results=getappdata(gcbf,'Results_history'); cpt=getappdata(gcbf,'Nb_it'); absn=char(getappdata(gcbf,'Abscisse_n')); ordn=char(getappdata(gcbf,'Ordonnee_n')); xval=zeros(cpt); yval=zeros(cpt); for a=1:cpt xval(a)=data(abs-1,a); end for b=1:cpt yval(b)=results(ord-1,b); end h=handles.axes1; plot(h,xval,yval);
Une petite remarque pour commencer, je pense que tu n'as pas besoin des boucles qui sont dans tes bouts de code:
peut être remplacé par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for j=1:28 results(j,cpt)=yout(j); end
Pour revenir à ton problème, je suis pas sûr de comprendre exactement ta problématique:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 results(1:28,cpt) = yout(1:28);
Quand tu cliques sur ton bouton "simul_button", tu effectues 1 pas de calcul ou une simulation? Et donc quelle est la taille de yout?
Si chaque incrémentation de cpt correspond à une simulation, ne serait-il pas plus judicieux de stocker les résultats de chaque simulation dans un tableau de cellules (ou tableau de structures) où chaque élément correspondrait à toutes les données que tu souhaites stocker pour chaque simulation?
Enfin, je propose une idée (ca permettra de voir si j'ai compris...ou pas ), pourquoi ne pas afficher la valeur de cpt dans ton interface (via un static) en donnant la possibilité à l'utilisateur de faire un "reset" (avec un pushbutton)?
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
Bon, je vais essayer de t'expliquer...
Mon modèle est en fait un modèle discret qui calcule les données de sortie d'un réacteur d'avion. En lui entrant l'altitude et de nombreux autres paramètres, il me donne entre autres la poussée du réacteur.
A chaque fois donc que je pousse sur le bouton simulation, un point est calculé, donc pour une valeur de chaque entrée, j'obtiens une valeur de chaque sortie.
Or, il est intéressant de pouvoir comparer une valeur de sortie à une valeur d'entrée lorsque cette dernière varie. J'ai donc inclus l'option suivante : je choisis une valeur d'entrée, je fixe sa valeur de départ, le pas et le nombre d'itérations que je veux. Je lance ma simulation qui contient une boucle si mon option est choisie. Cette boucle va calculer le point 1, augmenter la valeur choisie du pas, calculer le point 2, et ainsi de suite jusqu'à la valeur finale. A chaque pas, mon yout change (il ne s'agrandit pas je pense) et je stocke l'ensemble des sorties dans mes résultats (car elles sont presque toutes affectées par un changement d'une seule entrée). Ces résultats me permettent ensuite d'afficher sur mon graphe différentes courbes à la demande de l'utilisateur grâce au nombre d'itérations.
Mon problème vient du fait que j'aimerais pouvoir remettre à zéro mes résultats à chaque simulation (à chaque clic sur le bouton), mais comme ils se retrouvent dans 2 parties de code différentes, faire un reset dans l'une annule l'autre et vice versa... En plus, il semblerait que mon graphe garde une trace des courbes précédentes et donc après si je change les paramètres de simulation pour effectuer une 2e simulation, mes courbes sont totalement loufoques...
Voilà donc mon problème : arriver à gérer mo graphe en fonction des résultats, qu'ils soient pour une valeur unique ou pour une série de valeurs.
J'espère avoir été clair, si non dis-le moi et je recommencerai autrement.
Encore merci pour ton aide précieuse.
Je pense que ton premier problème au niveau du stockage des résultats de simulation vient du fait que yout est une matrice (et non pas un vecteur) et avec ton code il est peu probable que tu récupères les bons résultats (enfin ceux que tu souhaites).
Si tu remets à zéro tes résultats à chaque clic sur le bouton, pourquoi t'embêter avec un compteur?
Pour effacer ton axe, tu peux utiliser CLA.
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
Merci pour ces infos...
Mais là, j'ai un gros bug et je ne trouve pas d'où il vient...
Mon dernier problème provenait du fait que je suis en 64 bits. Donc tout fonctionnait très bien pour faire mes simulations et le seul problème résidait dans ma gestion du graphe... Pas de quoi s'en faire.
Mais voilà, depuis quelques fois où j'essaie de relancer mon fichier, une affreuse erreur arrive :
Je me suis donc dit : recompile le bazar et tout ira bien!
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 ??? Error using ==> loadlibrary at 441 Failed to preprocess the input file. Output from preprocessor is:'cl' n'est pas reconnu en tant que commande interne ou externe, un programme excutable ou un fichier de commandes. Error in ==> Simturb>simul_button_Callback at 127 loadlibrary(lib_name, ['Modele_1c', '.h']); Error in ==> gui_mainfcn at 96 feval(varargin{:}); Error in ==> Simturb at 42 gui_mainfcn(gui_State, varargin{:}); Error in ==> @(hObject,eventdata)Simturb('simul_button_Callback',hObject,eventdata,guidata(hObject)) ??? Error while evaluating uicontrol Callback
Mais non, il m'en veut :
Je suis désepéré... J'ai refait la commande
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ### Starting build procedure for model: Modele_1c ### Generating code into build folder: C:\Users\*****\Documents\*****\MA 2\TFE\Test 2\Modele_1c_ert_shrlib_rtw Making simulation target "Modele_1c_sfun", ... C:\Users\*****\Documents\*****\MA 2\TFE\Test 2\slprj\_sfprj\Modele_1c\_self\sfun\src>call "mexopts.bat" 'nmake' n'est pas reconnu en tant que commande interne ou externe, un programme excutable ou un fichier de commandes. ### Build procedure for model: 'Modele_1c' aborted due to an error.J'ai vérifié mon visual c++, j'ai relancé la procédure de compilation dans un nouveau dossier, rien n'y fait!
Code : Sélectionner tout - Visualiser dans une fenêtre à part mex -setup
Duf, peux-tu encore me sauver la vie?
As-tu fais une manipulation en relation avec VS ou MATLAB depuis, du genre une réinstallation ou quelquechose comme ca?
Il me semble que l'erreur peut être liée à l'installation du SDK Windows :-s
EDIT: L'erreur peut provenir du fait que l'option "x64 Compilers and Tools" n'était pas cochée lors de l'installation de Visual Studio, et donc que les outils de compilation 64bits ne sont pas installés
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
Je n'ai rien modifié depuis la dernière fois il me semble. Mais j'ai fait Windows Update, c'est peut-être de là que ça vient!
Je crois que je vais installer le tout dans une machine virtuelle 32 bits comme ça je n'aurai plus de problème... Je te tiens au courant.
Encore merci pour tes super conseils!
Tu n'as pas besoin d'une machine virtuelle si tu veux utiliser MATLAB en 32 bits, tu peux l'installer directement à côté de ta version 64 bits (c'est ce que j'ai fais sur mon poste pour éviter ce genre de problème)
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
Ah peut-être. Il me faut juste l'ISO 32 bits alors...
Mais il me faudra aussi Visual C++ 32 bits et tout!
Bonjour, bonjour,
Voici les nouvelles : j'ai eu réunion avec mon responsable, et tout se passe très bien selon lui. Après cette réunion, j'ai décidé de changer mon fusil d'épaule et de ne plus utiliser Simulink. Je vais exécuter mon modèle via des *.m plus traditionnellement.
J'ai pour cela refait une nouvelle IG qui reprend toutes mes fonctions. Ça fonctionne très bien.
J'ai pourtant une question : quelle est la syntaxe pour faire ceci?
M1, M2, M3, M4 sont des matrices placées dans une boucle for. La boucle les remplit. A la boucle suivante, elles sont réinitialisées. J'aimerais pouvoir stocker le contenu de chaque matrice dans une autre matrice à la fin de chaque boucle.
Mais ne connaissant pas le nombre de boucle (c'est l'utilisateur qui le choisit), j'aimerais pouvoir utiliser un code du genre :
Voilà, si quelqu'un a la solution...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for i=1:val % Code qui calcule M1, M2, M3, M4 RES1'i'=M1 % RES1'i' sera RES11 à la boucle 1, RES12 à la boucle 2, ... RES2'i'=M1 % RES2'i' sera RES21 à la boucle 1, RES22 à la boucle 2, ... % Idem pour M3 et M4 end
Si je ne suis pas clair, dites-le et je corrigerai.
D'avance merci.
Bonjour,
J'ai un peu lâché la discussion parce que ça me dépasse un peu en fait. Par contre, pour ta question :
: Comment créer des variables nommées A1, A2, A3, ..., AN ?
Cordialement,
ps: omg Winjerome, je t'ai littéralement coupé l'herbe sous le pied (j'ai eu le temps de voir que tu as posté exactement le même message juste après, avant que tu le supprimes)
Je ne réponds pas aux MP techniques. Le forum est là pour ça.
La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3
Ok merci, je vois comment je vais faire. Ca va être long mais j'y arriverai lol...
tachmou, si tu as des questions, n'hésite vraiment pas.
En ce qui me concerne, j'en ai encore une petite lol : dans mon interface graphique, j'ai inséré un objet "axes" afin d'y afficher une image jpg. Mon image s'affiche bien, mais elle est complètement écrasée et illisible. Comment puis-je la rendre lisible?
Infos image : fichier jpg, 491x218 pixels, 12.7 ko
Code d'affichage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 image1=imread('Mon image.jpg'); ha=handles.axes2; imshow(image1,'parent',ha);
Bonjour,
Ne t'inquiète pas pour moi, c'est juste que j'ai d'autres préoccupations en ce moment ^^.
Pour l'image, tu dois pouvoir spécifier les dimensions de ton axe avec la propriété "position". Je ne sais pas comment c'est fait dans matlab, mais ça ne me surprendrai pas que l'affichage des images aux mauvaises dimensions soit fait "à l'arrache" ce qui fait que ça devient "illisible" comme tu dis (du style une image 800x600 avec un pixel noir aux lignes et colonnes impaires, et blanche sur tous les autres pixels se transforme en une image totalement blanche sur un axe de 400x300 en prenant 1 pixel sur 2... au lieu d'appliquer un traitement approprié que je ne détaillerai pas ici... à moins qu'il y aie une option/propriété qui te permette de le faire au prix d'un certain temps de calcul ?)
Cordialement,
Je ne réponds pas aux MP techniques. Le forum est là pour ça.
La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3
Bonjour,
Merci pour les infos pour l'image, mais ça ne fonctionne toujours pas (à moins que cela ne vienne de mon image de base mais je doute). Si quelqu'un a une idée tant mieux, sinon ce n'est pas grave.
Par contre, j'ai encore une question : au moyen d'un bouton, je sauve mes résultats dans un fichier Excel via la commande
Cette commande est activée 16 fois lorsque le bouton est enfoncé (4 séries de données à inscrire sur 4 onglets du fichier). Comme ça prend un certain temps, et que l'on pourrait croire que la machine a fini ou ne travaille plus, j'aimerais afficher une barre de progès. Après recherches, j'ai trouvé la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part xlswrite(...);
Cependant, je ne vois pas comment l'inclure dans le code de mon IG à l'endroit de la sauvegarde, vu qu'à la base, cette commande est faite pour une boucle for.
Code : Sélectionner tout - Visualiser dans une fenêtre à part waitbar(...)
Quelqu'un a-t-til une idée?
D'avance merci!
La honte...
J'ai posé ma question avant de regarder sur ce forum.
Or ma réponse s'y trouve! Donc c'est bon, ma waitbar fonctionne du tonnerre!
Il ne reste que mon problème d'image...
Je vais essayer d'expliquer...
Mon image de base est une image *.jpg de dimensions 1692x973. Je l'ai donc diminuée pour obtenir une image de dimensions 491x218.
Dans mon IG, j'ai un objet Axes qui semble de dimensions 500x80 d'après la grille de l'utilitaire GUIDE.
J'aimerais donc que mon image soit lisible dans cet objet Axes... Mais pour le moment, elle est complètement écrasée,et l'objet apparaît bien plus petit en réalité que dans GUIDE...
Est-ce plus clair ou je recommence lol?
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