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

Workspaces und Variablen

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 18.04.2008, 15:12     Titel: Workspaces und Variablen
  Antworten mit Zitat      
Hallo,

ich hätte eine Verständnisfrage. Es geht um die Workspaces und die verwaltung der Variablen in WS.

Ich habe gelesen, dass es 3 verschiedene WS gibts.

Base WS für die Variablen erstellt in Command Window oder Script-M-Files.
Functions WS verwalten die Variablen die innerhalb von einer Funktion benutzt werden. Nach dem Return werden die Variablen gelöscht, so weit sie nicht global definiert sind.
Global WS ist nicht direkt benutzbar. Hier werden die globale variablen abgelegt.

Beispiel: ich habe eine main() funktion, die einen einstieg in das Programm darstelt. Dh. es gibt ein FunktionsWS für diese Funktion. und ich habe andere Funktionnen die von main aus aufgerufen werden. Die returnwerte dieser Funktionen landen aber nicht im WS von main() sondern im Base WS. Natürlich habe ich dann kein zugang zu diesen Variablen/Werten.

Frage: sind meine Annahmen korrekt? Kann man das Verhalten umgehen? Damit ich den Zugriff auf die Variablen bekomme?

Danke

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 18.04.2008, 16:06     Titel: Re: Workspaces und Variablen
  Antworten mit Zitat      
Hallo joekey,

hm, nein, die Annahmen sind nicht ganz korrekt. Wenn Deine Funktion lautet
Code:
function output = myfunction(input)
...
output =...


und Du rufst sie von main aus auf:
Code:
myoutput = myfunction(myinput);


dann steht Dir die Variable myoutput in main zur Verfügung, die denselben Inhalt hat, wie die Variable output in myfunction hatte. Meintest Du das mit "returnwerte"?

Im Base Workspace landen die Variablen von myfunction überhaupt nicht. Es sei denn, man wertet sie mit
Code:
explizit dort aus.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 18.04.2008, 16:39     Titel:
  Antworten mit Zitat      
Hallo Bijick,

danke für die Antwort. Ja, die "Returnwerte" hast du korrekt verstanden.

Ist es möglich mittels assignin auch WS von main() anzusteuern? So, dass die dynamisch erzeugte variablen in main WS erstellt werden? Weil genau das war mein Problem, ich hab die Werte nicht normal "returniert" sondern per assignin dynamisch zu einer Variabler gemacht. Somit sind sie im base WS gelandet, und ich hatte keinen Zugrif drauf.

Vielen Dank für die Erklärung.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 21.04.2008, 15:27     Titel:
  Antworten mit Zitat      
Hallo Joe,

wenn ich die Matlab-Hilfe richtig verstehe, geht das mit 'caller' anstelle von 'base':

Code:
assignin('caller', 'variable',value);


wobei 'variable' und value entsprechend gestetzt werden müssen, 'caller' aber exakt so stehenbleibt.

Mir ist allerdings nicht klar, warum Du die Variablen nicht einfach übergibst. Ist das nicht viel einfacher?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 22.04.2008, 13:35     Titel:
  Antworten mit Zitat      
Hallo Bijick,

danke für die Antwort. Du hast schon recht, es ist mit der Übergabe von veriablen einfacher. Ich erforsche momentan die möglichkeiten des Matlabs. Wenn ich den Einstiegspunkt des Programms in einem m-Script mache ist es kein Problem die einzelne Returnwerte als wariable zu übergeben. Problematischer wird es, wenn ich den Einstiegspunkt in einer m-Funktion (main.m) ausprogrammiere. So, wird eigentlich mein base-WS in den main-WS verlagert und ich muss alle Returnwerte in main-WS umleiten. Sonnst landen sie im base-WS und kann dann diese Werte vom main-WS nicht zugreifen.

Tja, klingt bischen kompliziert, ich weiss. Ist aber gut zu wissen wie es funktioniert.

Noch eine Frage hätte ich: Ich erstelle Objekte. Sagen wir, ich habe eine Stack-Klasse. Der Name des Objektes setzt sich zusammen von dem Wort 'sta' und dem Wert der Variablen compr. Das mache ich mit folgendem Code. Es läuft ohne Probleme.

Code:
assignin('base',['sta' int2str(compr)],class(this, 'cStack'));


Das Problem ist dass ich nicht lösen kann ist, dass ich dann auf dynamisch generierte Var/Objekt nicht vom Code zugreifen kann (sie ist ja nicht bekannt da kein Returnwert 'this' definiert ist). Enfach ausgedruckt, ich will auf einer Seite den namen des Objektes dynamisch generieren und gleichzeitig ein Returnwert mit dem Zeiger auf das entstandene Objekt ausgeben. Ist so was Prinzipiell möglich? Kennst du vielleicht den Weg?

Vielen DANK im voraus.

LG Joe

Stack Constructor:

Code:
function this = cStack(compr, type, size)

%creates stack object

this = struct(...
    'mCompr', compr,...     % compression of data
    'mType', type,...       % type of data
    'mSize', size,...       % size of stack
    'mData', []...          % data
    );

this = class(this, 'cStack'); %converts structure into an object
%assignin('base',['sta' int2str(compr)],class(this, 'cStack'));
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 22.04.2008, 14:44     Titel:
  Antworten mit Zitat      
Hallo Joe,

mit Klassen kenn ich mich nicht aus, aber eine Variable wäre ja über ihren dynamischen Namen ansprechbar. Also bei compr = 100 über den Namen sta100.

Hast Du schon den Befehl mit 'caller' ausprobiert? Würde mich interessieren.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 22.04.2008, 15:15     Titel:
  Antworten mit Zitat      
Hallo Bijick,

hier ein Beispiel für 'caller'. Es funktioniert gut. Ist ein bisschen umständlich, da man nicht direkt die Objekte sehen kann, resp. ich bin nicht draufgekommen wie ich mir direkt main-WS anschauen kann. Das Objekt wurde aber erstellt und auch der Name wurde dynamisch erzeugt.

Zu meiner vorigen Frage. Ja die Objekte sehe ich und ich kann auf sie über Konsole zugreifen. Da ich aber kein 'Zeiger' = this returniert habe, kann ich vom Script oder Funktionen nicht zugreifen. Versuche mal eine Variable dynamisch zu erzeugen und benutze sie dann gleich weiter im Code. Ob das klappen wird?

LG Joe

Main Funktion:

Code:
function [] = main()

% test des arguments 'caller' fur die funktion assignin

% hier rufe ich den konstruktor für den Stack
cStack(30,10,5);

% hier frage ich die dynamisch entstandene var 'sta30'
disp(sta30);

end


Stack Constructor (erstellt ein Objekt von der Klasse Stack)

Code:
function this = cStack(compr, type, size)

%creates stack object

this = struct(...
    'mCompr', compr,...     % compression of data
    'mType', type,...       % type of data
    'mSize', size,...       % size of stack
    'mData', []...          % data
    );

assignin ('caller',['sta' num2str(compr)],class(this, 'cStack'));
%assignin ('base',['sta' num2str(compr)],class(this, 'cStack'));
%this = class(this, 'cStack'); %converts structure into an object
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 22.04.2008, 16:58     Titel:
  Antworten mit Zitat      
Hallo Joe,

um eine lokale Variable dynamisch zu erzeugen, verwende eval statt assignin:
Code:

eval(['sta' num2str(compr) '= class(this, ''cStack'')']);
 


Die existiert dann aber nur im Workspace von cStack. War das die Frage?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 22.04.2008, 17:27     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mir schon gedacht, dass es ziemlich verwirrend ist, was ich da schreibe. Laughing also ich versuche es noch mal. Versuche mal die Testfunktion auszuführen. Einmal mit 'base'- und einmal mit 'caller'-Argument. Mit 'base'-Argument kannt du die Var sehen (sie befindet sich ja im base-WS) aber die funktion kann sie nicht weiter benutzen. Mit 'caller' argument wird die Funktion ausgeführt, aber man sieht die Variable nicht.

Frage: geht es, dass man eine dynamisch erstellte Variable sieht (base-WS) und gleichzeitig aber in andererm WS mit ihr arbeitet?

Danke LG Joe

Testfunktion:

Code:
function [] = test()

% test

% erstelt dynamisch eine var 'a'
createVar(14);

% benutzt var 'a' weiter !
b = a+100;

disp(b);

end


Dynamische erstellung der Var:

Code:
function [] = createVar(inData)

assignin ('base','a',inData); % base oder caller

end
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 23.04.2008, 11:15     Titel:
  Antworten mit Zitat      
Hallo Joe,

vielleicht habe ich es ja jetzt richtig verstanden. Smile

Also:

1. Es gibt einen Base-Workspace, den man vom Command Window und von Skripten aus ansprechen kann. Auch von Funktionen aus kann man über assignin Variablen dort ablegen.

2. Es gibt die lokalen Workspaces von Funktionen. Variablen können über die Funktionsaufrufe ausgetauscht werden und mit assignin explizit in der aufrufenden Funktion ausgewertet werden.

Soweit alles bekannt und geklärt.

3. Es gibt den "globalen Workspace" (weiß nicht, ob der so heißt), in dem die globalen Variablen existieren. Diese kann man in allen Workspaces, in denen sie als global deklariert sind auswerten, ansprechen und sehen. Dies ist gerade die Möglichkeit, workspace-übergreifend zu arbeiten. Eine andere Möglichkeit halte ich für ausgeschlossen. Man könnte zwar die Variable in jedem Workspace einzeln lokal erzeugen, aber dann würde sie die Veränderungen, die nur in einem Workspace passieren, in den anderen nicht mitmachen. Das erlauben gerade die globalen Variablen.

Ich bin ja gespannt, ob ich Dir diesmal befriedigende Antwort geben konnte.


Ich persönlich würd es so machen (aber ich akzeptiere, dass Du etwas experimentieren willst):

Code:
function a = testvar

    name = 'str';
    a = createVar(name,14);
    b = a.str + 100;
    % oder: b = a.(name) + 100;
    disp(b);
end

function NewVar = createVar(varName,inData)

    NewVar.(varName) = inData;  
end


a ist jetzt eine struct-Variable, die dynamische Variablennamen (eigentlich Feldnamen) erlaubt. Wenn man die Funktion aus dem Command Window mit a = testvar aufruft, ist die Variable a auch im Base Workspace.

Alle Klarheiten beseitigt? Wink

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 25.04.2008, 08:32     Titel:
  Antworten mit Zitat      
Hallo Bijick,

erstmals vielen Dank für dein Gedult und alle Antworten.

Wir sind schon ganz nah dran und deine Lösung gefählt mir gut. Trotzdem habe ich noch eine Frage Confused :

Die dynamisch erstellte 'a.(name)' ist unter 'b' in globalen WS gespeichert. Mit a.(name) kann ich drauf zugreifen. Nehmen wir an, dass ich 4 Variable benötige, 'a.1', 'a.2', 'a.3', 'a.4'. Wie kann man dies so anstellen, dass diese auch unter 'a.1', 'a.2', 'a.3', 'a.4' im main WS erreichbar sind? Wobei die var durch eine for Schleife erstellt werden und die Zahl nach dem Punkt der Durchlaufzähler ist.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 25.04.2008, 10:40     Titel:
  Antworten mit Zitat      
Hallo Joe,

das ist ja echt knifflig. Ich bin schon wieder nicht ganz sicher, ob ich richtig verstehe... Smile

Wenn Du mit globalen Variablen arbeitest, heißen die überall gleich. Wenn also das struct 'a' im Base-Workspace und in allen Funktionen als global deklariert wird, so hat man überall Zugriff auf die Variable 'a.(name)'. Man sollte sie auch nicht in eine Variable 'b' umspeichern, da dann eine Veränderung nicht mehr in die anderen Workspaces übergeben wird. Oder man nennt sie überall b, aber dann ist der Name ja wieder nicht dynamisch erzeugt... Kurz gesagt:

Code:


in jede Funktion und ins Command Window schreiben.

Die andere Frage ist die nach den vier Feldern. Wenn die Namen allerdings wirklich nur aus Ziffern bestehen sollen, muss man cells statt structs nehmen. Die Feldnamen eines structs müssen die gleichen Anforderungen erfüllen wie Variablennamen. Ich bin jetzt nicht sicher, ob das nur ein Beispiel sein sollte, oder exakt so werden soll, also hier beide Lösungen:

Code:
% cell array a
for ind = 1:4
    a{ind} = ...
end

% struct a mit Feldern a1, ..., a4
for ind = 1:4
    name = ['a' num2str(ind)];
    a.(name) = ...
end


Wenn ich sehe, dass sich jemand Mühe gibt mit den Fragen, helfe ich gern.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 08.05.2008, 08:20     Titel:
  Antworten mit Zitat      
Hallo Bijick,

danke für deine Antwort. Also, die globalen variablen versuche ich möglichst zu vermeiden. Diese benutzte ich nur für die Pfadangaben (Log, Settings...).

Die Lösung mit Zellarrays gefählt mir am besten resp. sie ist für mich am besten geeignet. Die dynamischen Felder werde ich in der Zukunft auch benutzten, allerdings, ganz intensiv habe ich mit denen noch nicht aussenandergesetzt.

Ich bedanke mich für deine Unterstützung.

LG Joe
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.