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

Variablen mit Schleife aus struct "auspacken"

 

JJ72
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 30.07.2009, 10:49     Titel: Variablen mit Schleife aus struct "auspacken"
  Antworten mit Zitat      
Hallo, ich rufe innerhalb einer Hauptfunktion (main_fun) eine Funktion (nennen wir sie mal prep_fun) auf, die einen struct (my_struct) zurückgibt. In diesem struct steht eine recht große Anzahl von Variablen. Es ist ein 1x1 struct, dessen Felder die Namen der Variablen sind, daneben die Werte.

Ich will in der Hauptfunktion (main_fun) die Variablen aus diesem struct nun wieder "auspacken" ohne sie explizit angeben zu müssen. Das Ganze sieht nun folgendermaßen aus:

Code:


function [] = main_fun ()
...
...
...
my_struct=prep_fun

K=fieldnames(my_struct);

for d=1:size(K,1)
    nam=K(d);   % Hol dir den Variablennamen, der ist dann ein Cell...
    nam=nam{1}; % ...weswegen er erst in einen String umgewandelt wird
    anw2=[nam,'=my_struct.',nam,';'];
    eval(anw2);
end
...
...

 


Das Ganze funktioniert, allerdings nicht, wenn main_fun ein static workspace ist:

??? Error using ==> main_fun
Attempt to add "var_1" to a static workspace.
See MATLAB Programming, Restrictions on Assigning to Variables for details.

Error in ==> main_fun at 28
eval(anw2);

In der Matlab Doku steht, dass man eval in solchen Workspaces vermeiden soll. Das wurde hier auch schon verschiedentlich beschrieben, ich habe allerdings keine Idee, wie ich das anders machen kann.

Es wäre sehr hilfreich, wenn es eine Lösung gebe, die die Variablen "auspackt" ohne deren Namen explizit angeben zu müssen.

Hat da jemand ne Idee?
Razz
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 30.07.2009, 11:20     Titel:
  Antworten mit Zitat      
Code:



MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 30.07.2009, 11:58     Titel:
  Antworten mit Zitat      
HHhhm, also ich habe es ne Weile probiert, komme aber nicht auf die Lösung, wie ich mittels arrayfun (bzw. structfun?) das ganze Lösen kann. Ich will ja folgendes machen:
Code:

my_struct.Var_A=1; %Ein struct mit Variablennamen und Werten
my_struct.Var_B=2;
my_struct.Var_C=3;
 


Diesen will ich dann automatisch auspacken, so dass ich hinterher die Variablen wieder als Variablen im Workspace habe, und den Struct nicht mehr brauche also wieder:
Code:

>> Var_A

Var_A =

     1

>> Var_B

Var_B =

     2
 


Es wäre cool, wenn du ein kurzes Minimalbeispiel zeigst, wie das mit arrayfun geht Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 30.07.2009, 13:19     Titel:
  Antworten mit Zitat      
ok... arrayfun trifft zwar vom Namen her, aber ist oofensichtlich doch schlechter geeignet für das was Du vor hast

Teste diese Einzeiler.

Wenn Du EVALIN benutzst, dann landen die Variablen Var_A usw. im Base Workspace, auch wenn der Aufruf aus Deiner main_fun stattfindet.
Code:
>> cellfun(@(x) evalin('base',[x '=my_struct.' x ]),fieldnames(my_struct))

Var_A =

     1


Var_B =

     2


Var_C =

     3




Falls Du dagegen die untere Zeile verwendest, dann werden die Variablen in der Funktion angelegt.
Code:
cellfun(@(x) eval([x '=my_struct.' x ]),fieldnames(my_struct))



MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 30.07.2009, 13:37     Titel:
  Antworten mit Zitat      
Hi, danke für die Antwort, das bringt ein Stück weiter, erzeugt aber noch fehler. Wenn ich deine erste Anweisung benutze, erhalte ich:

??? Undefined variable "my_struct" or class "my_struct.Var_A".

Error in ==> gettraining>@(x)evalin('base',[x,'=my_struct.',x]) at 31
cellfun(@(x) evalin('base',[x '=my_struct.' x ]),fieldnames(my_struct))

Error in ==> gettraining at 31
cellfun(@(x) evalin('base',[x '=my_struct.' x ]),fieldnames(my_struct))

??? Error while evaluating uicontrol Callback

Wenn ich die zweite Anweisung (die mit eval statt evalin anwende) erhalte ich wiederum, den Hinweis:

??? Error using ==> main_fun
Attempt to add "Var_A" to a static workspace.
See MATLAB Programming, Restrictions on Assigning to Variables for details.

Error in ==> main_fun>@(x)eval([x,'=my_struct.',x]) at 31
cellfun(@(x) eval([x '=my_struct.' x ]),fieldnames(my_struct))

Error in ==> main_fun at 31
cellfun(@(x) eval([x '=my_struct.' x ]),fieldnames(my_struct))

??? Error while evaluating uicontrol Callback


Hast du da eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 30.07.2009, 13:46     Titel:
  Antworten mit Zitat      
my_struct ist doch der eigentlicher Struct, aus dem die Variablen entpackt werden müssen!!! Der muss natürlich schon vorhanden sein, wenn Du den "entpacken" willst... Rolling Eyes

Code:
>> my_struct.Var_A=1; %Ein struct mit Variablennamen und Werten
>> my_struct.Var_B=2;
>> my_struct.Var_C=3;
>>
>> cellfun(@(x) evalin('base',[x '=my_struct.' x ]),fieldnames(my_struct))

Var_A =

     1


Var_B =

     2


Var_C =

     3

>>


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 30.07.2009, 13:57     Titel:
  Antworten mit Zitat      
Das krasse daran ist, my_struct IST vorhanden. Ich kann ihn mit
Code:

my_struct
 

am Bildschirm sehen. Auch die Fehlermeldung .....or class my_struct.Var_A....weist darauf hin. main_fun kennt die Var_A da noch nicht, wenn die Fehlermeldung so erstellt werden kann, dann bedeutet das, das my_struct an und für sich schon existiert, sonst könnte Matlab sozusagen gar nicht wissen, dass es eine Klasse gibt, die my_struct.Var_A heißt.

Das check ich net...
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.