WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Vermeidung globaler Variablen

 

rooky
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 20.12.2013, 06:15     Titel: Vermeidung globaler Variablen
  Antworten mit Zitat      
Hallo,
Harald ein Jedi Meister hier im Forum hat mich darauf aufmerksam gemacht, dass ich doch die globalen Variablen in meinem Code vermeiden sollte. Da hat er recht, aber wie? Hier habe ich einen Auszug aus meinem Code den ich auch erklären werde:
- Ich lade einen Datensatz .mat und mache daraus einen surf plot in einem figure. In dem Figure habe ich auch noch einen Slider und ein popupmenu
- der Slider dient dazu in dem geladenen Datensatz durch zu gehen und jeweils einen neuen surf pot zu machen. Das sieht dann aus wie eine Animation
- das popup dient dazu einen anderen Datensatz zu laden mit dem ich dann mit dem Silder wieder durchgehen kann.

Code:
function globalstest
global Falles
load('satzA.mat') % dauert 2 sec
% aus dem load kommen dat1,dat2,matrixA

[Y,X] = meshgrid(dat1,dat2);
for j=1:15
for i=0:71
Falles(:,:,i+1,j)=mean(double(matrixA(:,:,1+i*7:7+i*7,j)),3);
end
end

fh=figure(1);
BUpop0=uicontrol('Style', 'popup',...
           'String', 'A|B|C',...
           'Callback', {@mypop0,X,Y},...
           'Position', [5 10 breite 15]);
BUSlider =uicontrol('style','slider','Min',1,'Max',52,'Value',1,...
    'Callback',{@mySlider1,X,Y,BUpop0},...
    'position',[100    10    300    13]);

surf(X,Y,Falles(:,:,1,1));

function mySlider1(hObj,ev,X,Y,BUpop0)      
 global Falles
SliderState = get(hObj,'Value');

surf(X,Y,Falles(:,:,ceil(SliderState),2));

function mypop0(hObj,ev,X,Y)
global Falles
    popStatev = get(hObj,'Value');
    popState0 = get(hObj,'string');
    popState0=cellstr(popState0);

 load('/satz',popState0{popStatev},'.mat');  

for j=1:15
for i=0:71
eval(strcat('Falles(:,:,i+1,j)=mean(double(matrix',popState0{popStatev},'(:,:,1+i*7:7+i*7,j)),3);'))
end
end  

surf(X,Y,Falles(:,:,1,popStatev));
 

Ich vermeide im Moment im Slider (function mySlider1) irgend etwas zu laden weil es zu lange dauert deshalb verwende ich globale Variablen (Falles)

Kann ich das auch ohne global Falles scahffen?

Danke
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.12.2013, 09:53     Titel:
  Antworten mit Zitat      
Hallo,

du kannst das Falles an die zusätzlichen Argumente anhängen:

Code:
BUSlider =uicontrol('style','slider','Min',1,'Max',52,'Value',1,...
    'Callback',{@mySlider1,X,Y,BUpop0, Falles},...
    'position',[100    10    300    13]);

Die Callback-Function muss es dann entsprechend entgegennehmen:
Code:
function mySlider1(hObj,ev,X,Y,BUpop0, Falles)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.12.2013, 12:51     Titel: Re: Vermeidung globaler Variablen
  Antworten mit Zitat      
Hallo rooky,

Was soll denn das:
Code:
for j=1:15
  for i=0:71    eval(strcat('Falles(:,:,i+1,j)=mean(double(matrix',popState0{popStatev},'(:,:,1+i*7:7+i*7,j)),3);'))
  end
end

Statt die Daten mit LOAD direkt in den Workspace zu importieren und dann total verwurmt per EVAL darauf zuzugreifen, ist es viel effizienter, klarer, weniger fehleranfällig und schneller, wenn Du den Output von LOAD verwendest:
Code:

Dann kannst Du Dir das leiduige EVAL sparen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 20.12.2013, 15:43     Titel:
  Antworten mit Zitat      
Hallo und danke erst mal.
zu Jan: was soll das mit dem eval.
Ich weiss selber das das bloed ist, aber ich kann im popup einen anderen datensatz (andrer Name usw.) laden. Einmal sind es bei mir Temperaturen, einmal Spannungen. Dafuer gibt es andere .mat Dateien die ich laden muss (jede hat ca. 100MB)
zu Harald: Falles in den callback
das hab ich am Anfang natuerlich versucht, aber Falles aendert sich halt wegen des popup (Spannung Temperatur). Was passiert dann: Ich lade am Anfang die Spannungen uebergebe Falles an den slider und animiere alles durch. Geht super. Jetzt lade ich mit dem popup die Temperaturen und wenn ich jetzt den Slider benutze springt der wieder auf die Spannungen! Das ist ja das Problem warum ich die globalen Variablen verwende.
Kompliziert ich weiss
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.12.2013, 15:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Kompliziert ich weiss

An sich nicht, ich hatte es nur nicht verstanden. Dann so:

Wenn Falles gesetzt / verändert wird:
Code:
setappdata(fh, 'Daten', Falles);

Wenn es abgefragt werden muss:
Code:
Falles = getappdata(fh, 'Daten');


Was eval angeht, stimme ich Jan zu (und ich hätte auch darauf aufmerksam gemacht, wenn es mir ins Auge gefallen wäre). eval/evalin lässt sich nahezu immer vermeiden. Das sollte man auch tun, um so schwer lesbaren und schwierig zu debuggenden Code zu vermeiden. Versuch doch mal, Jans Tipp umzusetzen - es müsste meines Erachtens funktionieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 20.12.2013, 16:35     Titel:
  Antworten mit Zitat      
Hallo Ihre beiden,
das hab ich jetzt alles so umgeschrieben.
Es funktioniert super und ich hab auch noch was gelernt.

Danke fuer Eure Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.12.2013, 00:00     Titel:
  Antworten mit Zitat      
Hallo rooky,

Prima!
Dann hat das Forum sich ja mal wieder gelohnt. Schön.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.