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

eval umgehen

 

vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2013, 13:30     Titel: eval umgehen
  Antworten mit Zitat      
Hallo,

ich habe folgenden funktionsfähigen Code, der die Werte von "vals" den strings von "names" zuordnet:

Code:

names = {'Druck'  'Temp'};
vals = {[1, 2] [3, 4]};

for j=1:size(names,2)
    expression=sprintf('%s', cell2mat(names(j)), '=[', num2str(vals{j}),']');
    eval(expression);
end;
 


Jetzt ist mMn diese Lösung mit eval nicht die Beste. Gibt es eine Möglichkeit eval zu umgehen und das ganze etwas eleganter zu gestalten?
Freue mich über eure Anregungen.

Gruß
Vega

P.S.: names und vals kommen von einem anderen Programm....
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 16.12.2013, 14:06     Titel:
  Antworten mit Zitat      
Hallo,
du könntest das in ein Struct schreiben und die Strings in names als dynamische Feldnamen benutzen.
Code:
for j=1:size(names,2)
    data.(names{j}) = vals{j};
end;

Zugriff auf die Daten gibt es dann mit data.Temp und data.Druck.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Themenstarter

Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2013, 15:53     Titel:
  Antworten mit Zitat      
Hallo Nras,

das sieht schon besser aus als meine Lsg. Jetzt ist schon mal der eval Befehl entfallen, aber dennoch eine Zusatzfrage:
Gibt es noch eine Möglichkeiten das ich den Inhalt von names als array Variable definiere und dieser Variable dann vals zuordne?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 16.12.2013, 16:36     Titel:
  Antworten mit Zitat      
Hallo,

so dynamisch erzeugte Variablennamen kann man (meines Wissens nach) nur mit eval erzeugen. Und für die Weiterverarbeitung dieser Variablen, wird das dann auch eher schwierig, wenn du vorher nicht weißt, wie die Variablen heißen werden. Wenn die Namen aber immer gleich sind (z.b. immer nur Temp und Druck), dann könntest du die im Matlabfile selbst erzeugen.

Der Umgang mit den dynamischen Feldnamen von Structs hingegen ist sehr komfortabel.

Wenn du alle möglichen Vorkommenden Namen kennst, ginge noch soetwas:
Code:
possible_names = {'Druck', 'Feuchte', 'Temp'};
names = {'Druck'  'Temp'};
vals = {[1, 2] [3, 4]};


for j=1:size(names,2)
    if strcmp(names{j},'Druck')
        Druck = vals{j};
    elseif strcmp(names{j},'Feuchte')
            Feuchte = vals{j};
    elseif strcmp(names{j},'Temp')
            Temp = vals{j};
    else
            warning('nichts gefunden')
    end
end
 

Da schaut man, welcher der möglichen Namen drankommt und weist dem dann die passenden Werte aus vals zu. Schön ist das allerdings auch nicht und vor allem nicht dynamisch erweiterbar mit unbekannten Einträgen in names.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Themenstarter

Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2013, 18:32     Titel:
  Antworten mit Zitat      
Hallo,

die zweite Variante ist aus dem von dir genanntem Nachteil nicht sinnvoll.
Wenn man dynamisch erzeugte Variablennamen nur mit eval erzeugen kann werden ich wohl deine erste Variante weiter verfolgen. Vor allem da diese im Vgl. zu meiner Lsg. bei größeren Daten um den Faktor 10^5 schneller ist!
Besten Dank für deine Hilfe!

Viele Grüße
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: 16.12.2013, 20:43     Titel: Re: eval umgehen
  Antworten mit Zitat      
Hallo vega1013,

Statt der Schleife ist hier auch CELL2STRUCT hilfreich.

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

Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2013, 17:40     Titel:
  Antworten mit Zitat      
Hallo Jan,

wenn auch etwas verspätet, aber vielen Dank auch dir noch für den Hinweis.
Habe es jetzt so umgesetzt, ist nach meinem Empfinden die eleganteste Lsg...

Gruß vega
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 - 2025 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.