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

dynamischer Variablenname in der ABFRAGE

 

Barny.G
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2013, 14:29     Titel: dynamischer Variablenname in der ABFRAGE
  Antworten mit Zitat      
Hallo liebe Gemeinde,

ein kleines Problem stellt mich vor eine unschöne Programmieraufgabe:

Es existiert ein sehr großes Dataset (Struktur) in welchem immer wieder Vektoren "auftauchen", die ich benötige. Die Variablennamen der Vektoren sind eindeutig und unterscheiden sich nur in einer Zahl (Nummer). Siehe folgende Beispiel:

Zitat:
data.data.t_2311_000500100.X_02.t
data.data.t_2311_000500101.X_02.t
data.data.t_2311_000500102.X_02.t
... usw


Nun habe ich als Beipsiel mal einen code eingestellt, der zeigt, wie ich mir das Abfragen der Variablen vorstelle. Natürlich geht es so nicht...

Code:

for i=100:1:110
   X(:,i-99) =  ['data.data.t_2311_000500',num2str(i),'.X_02.t']
end


Kann mir jemand helfen und mir aufschreiben, wie ich sehr einfach diese (wirklich vielen) Vektoren unkompliziert abfragen kann?

Wie schon gesagt, die Variablennamen sind vorhanden...

Viele Grüße

Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.01.2013, 14:53     Titel:
  Antworten mit Zitat      
Hi,

Mach aus
Code:
for i=100:1:110
   X(:,i-99) =  ['data.data.t_2311_000500',num2str(i),'.X_02.t']
end


mal
Code:
for i=100:1:110
   X(i-99, :) =  ['data.data.t_2311_000500',num2str(i),'.X_02.t']
end

_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2013, 19:01     Titel:
  Antworten mit Zitat      
Hallo Seban,

leider ändert das noch nichts an meinem Problem. Ich möchte gern jeden einzelnen Vektor in die entstehende Matrix X einlesen und dafür eben eine Schleife nutzen, die sozusagen automatisch die ganzen Variablen durchgeht.

Kannst Du mir auch dazu eine Hilfestellung geben?

Hier mal ein Beispiel, wie ich mir das vorstelle - gegeben sind die Vektoren
Code:

v1 = [1 2 3 4];
v2 = [2 9 8 3];
v3 = [2 5 7 0];
v4 = [0 7 0 8];
v5 = [9 7 5 1];
% usw. Es sind in der Datenstruktur (siehe [i]ganz [/i]oben) mehr als 200 Vektoren.
 


Nun möchte ich diese gegebenen Vektoren in eine Matrix einlesen mit einer Schleife, in der einfach mit dem steigenden Inkrement der Variablenname um Eins erhöht wird:

Code:

for i=1:n
   X(i, :) =  ['v',num2str(i)]
end
 


Wie schon gesagt ist das nur ein schematischer Code, so wie ich das möchte, leider fehlt mir die Idee den Variablennamen direkt aufzurufen...

Viele Grüße

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2013, 19:15     Titel:
  Antworten mit Zitat      
Hallo Thomas,

so:
Code:
for i=1:11
   X(:,i) =  data.data.(['t_2311_000500',num2str(99+i)]).X_02.t;
end


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.01.2013, 19:31     Titel:
  Antworten mit Zitat      
Ach so, du möchtest

X =
1 2 3 4
2 9 8 3
2 5 7 0
0 7 0 8

erhalten. Ich dachte eine Liste der Namen der Vektoren. Sorry, falsch verstanden


@Sirius: Du hast mir ja gestern vollkommen zurecht in einem anderen Thread von eval abgeraten. Hier das zweite vereinfachte Beispiel kann man ja so lösen:

Code:
for i=1:n
    X(i, :) = eval(['v',num2str(i)]);
end


Wäre das in diesem Fall legitim? Man hat ja einen String vi, den man mit eval direkt auswerten kann. Oder würde man das auch besser anders lösen? (Auf das erste Bsp. umgemünzt, zu dem du die Lösung gerade gepostet hast, macht eval ja keinen Sinn, weil man da auf Strukturen zugreift; äquivalent zu gestern Smile )
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2013, 20:57     Titel:
  Antworten mit Zitat      
Hallo Sirius,

vielen Dank - genau das habe ich gesucht!! Jetzt kann ich den Datenwust auch schön durchforsten ohne mir die Finger zu brechen Very Happy

Viele Grüße

Thomas
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: 07.01.2013, 23:58     Titel:
  Antworten mit Zitat      
Hallo Seban,

Man würde unbedingt auf EVAL verzichten.
Wenn man bereits die Variablen v1, v2, v3, ..., v97 hat, gibt es keine bessere Lösung mehr. Deshalb muss man einen Schritt früher ansetzen und vermeiden, dass ein solcher Variablen-Wust entsteht.

Das dynamische Erzeugen von Variablen per EVAL hat 6 Nachteile:
1. Das Debuggen wird schwerer.
2. Der Code ist nicht einfach skalierbar. D.h. wenn man mit einem [1x97] Vektor rechnet, lässt sich das leicht auf einen [1x97000] Vektor erweitern. Bei einer v1, ...v97000 Liste wäre das bereits ein Horror.
3. Matlab bearbeitet Schleifen effizient durch die "JIT-Acceleration". Diese funktioniert aber nicht, wenn Variablen erst während des Programmlaufs dynamisch erzeugt werden.
4. Wenn man aus Versehen unerwartete Ausdrücke mit EVAL auswertet, können zerstörerische Dinge geschehen. Es ist unwahrscheinlich, dass in einem Programm plötzlich der String "format C:" an EVAL geliefert wird. Aber in einem EVAL-freien Code ist es eben nicht unwahrscheinlich, sondern unmöglich.
5. EVAL kann dazu führen, dass Code unterschiedliche Ergebnisse liefert, je nachdem ob er im Debug oder Nicht-Debug-Modus läuft:
Code:
eval('sin = 9');
sin(1)

Im Debug-Modus wird das Symbol "sin" als Skalar definiert und "sin(1)" ergibt 9. Im Nicht-Debug-Modus wird beim Einlesen des M-Files aber der Aufruf der Sinus-Funktion erkannt und 0.8415 ausgegeben.
Da aber jedes größere Programm Bugs enthält, darf das Debuggen nicht beinträchtigt werden.
6. EVAL ist unsexy. Wenn man in einem öffentlichen Forum eine Funktion diskutiert, die ein EVAL enthält, werden alle Profis erstmal ein komplettes Neu-Design empfehlen, selbst wenn einem die Quadratur des Kreises gelungen ist oder man ein np-vollständiges Problem in linearer Zeit lösen konnte. :-)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 08.01.2013, 21:58     Titel:
  Antworten mit Zitat      
Ok, dh im Grunde, wenn eval einem sinnvoll erscheint, hat man eine bessere Lösung wahrscheinlich bereits übersehen Very Happy

Vielen Dank für die ausführliche Erläuterung.
_________________

Richtig fragen
Debugging
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.