|
|
Variablen mit Schleife aus struct "auspacken" |
|
JJ72 |
Forum-Anfänger
|
|
Beiträge: 19
|
|
|
|
Anmeldedatum: 22.06.09
|
|
|
|
Wohnort: Karlsruhe
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 10:49
Titel: Variablen mit Schleife aus struct "auspacken"
|
|
|
|
|
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:
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?
|
|
|
|
|
outsider |
Forum-Meister
|
|
Beiträge: 806
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: München
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 11:20
Titel:
|
|
|
|
JJ72 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 19
|
|
|
|
Anmeldedatum: 22.06.09
|
|
|
|
Wohnort: Karlsruhe
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 11:58
Titel:
|
|
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:
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:
Es wäre cool, wenn du ein kurzes Minimalbeispiel zeigst, wie das mit arrayfun geht
|
|
|
outsider |
Forum-Meister
|
|
Beiträge: 806
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: München
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 13:19
Titel:
|
|
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.
Falls Du dagegen die untere Zeile verwendest, dann werden die Variablen in der Funktion angelegt.
MfG
|
|
|
JJ72 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 19
|
|
|
|
Anmeldedatum: 22.06.09
|
|
|
|
Wohnort: Karlsruhe
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 13:37
Titel:
|
|
|
|
|
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?
|
|
|
outsider |
Forum-Meister
|
|
Beiträge: 806
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: München
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 13:46
Titel:
|
|
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...
MfG
|
|
|
JJ72 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 19
|
|
|
|
Anmeldedatum: 22.06.09
|
|
|
|
Wohnort: Karlsruhe
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 30.07.2009, 13:57
Titel:
|
|
Das krasse daran ist, my_struct IST vorhanden. Ich kann ihn mit
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...
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|