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

field names bei struct

 

steffen1187
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 19.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 07:56     Titel: field names bei struct
  Antworten mit Zitat      
Guten Morgen zusammen,

ich habe schon wieder ein kleines Problem für das ich über google / Forensuche leider noch keine Lösung finden konnte.

Ist es irgendwie möglich, fieldnames in einer struct mit Zahlen zu verwenden?

Wenn ich über rate=struct('400bar',[ ... die Definition vornehme wird der Fehler "Invalid field name "400bar"" ausgegeben. Sobald ich alle Ziffern wegnehme funktionierts. Natürlich könnte ich vierhundert ausschreiben, aber das muss doch schöner gehen, oder?

Grüße und Dank
Steffen
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.03.2012, 08:08     Titel:
  Antworten mit Zitat      
variablen namen müssen mit einem buchstaben anfangen soweit ich weis.
also machst du entweder bar400 oder v400bar oder irgendwie sowas in der art. wenn die zahlen fortlaufend sind könne man es auch als index verwenden oder so.
Private Nachricht senden Benutzer-Profile anzeigen
 
steffen1187
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 19.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 08:36     Titel:
  Antworten mit Zitat      
Cool, funktioniert, danke

wer hat sich n das so ausgedacht Rolling Eyes

edit: kaum funktionierts mach sich die nächste Frage breit...
ich hab die verschiedenen Drücke (sind nicht ganz periodisch) in einem cell array "drueck" abgelegt und möchte nun mit hilfe einer for Schleife nach und nach aus meiner struct die verschiedenen Druecke auslesen.

Code:

for d=1:size(druecke,2)
    max = 0;
    min = 0;
    for j=1:size(rate,2)
           rate{j}.druecke{d}
       

    end
end
 


nun rafft er nicht dass er als field name das Ergebnis von "druecke{d}" verwenden soll. Ich habe es auch schon mit druck = druecke{d} und rate{j}.druck versucht, das selbe Ergebnis...

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.03.2012, 09:30     Titel:
  Antworten mit Zitat      
versteh ich nicht. du hast in einem cellarray drücke gespeichert das drueke heist. sind das jetzt int werte oder was? dann hast du noch einen struckt der auch druecke heist und in dem sind ebenfalls drücke gespeichert. und du willst jetzt die werte des einen arrays als namen fürs andere verwenden?
blick ich nicht durch. mach mal n beispiel oder guck in der doch bei
"Returning Data from a Struct Array"
Private Nachricht senden Benutzer-Profile anzeigen
 
steffen1187
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 19.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 09:43     Titel:
  Antworten mit Zitat      
Also

ich habe Messwerte für Durchflussraten mehrere Objekte bei verschiedenen Drücken.

das cell array rate{eins,zwei} verweist auf die verschiedenen Messobjekte, die wiederum structs sind. In den structs wird auf die Variablen verwiesen, die die Messwerte dementsprechend verwalten.

eins = struct('bar400',[Var400barObj1],'bar800',[Var800barObj1])
zwei = struct('bar400',[Var400barObj2],'bar800',[Var800barObj2])

nun ist die Druckabstufung nicht regelmäßig, sodass ich in

druecke = {bar400, bar800} die verschiedenen Drücke liegen hab.

was ich ermitteln möchte ist für jeden Druck die Streuung zwischen den Injektoren, also die Differenz des kleinsten und das größten Werts. Das ist im Beispiel noch nicht implementiert.

Ich möchte also

Code:
for d=1:size(druecke,2)
    max = 0;
    min = 0;
    for j=1:size(rate,2)
           rate{j}.druecke{d}
       

    end
end


für den ersten Druck bar400 die Messwerte verrechnen, mir zunächst den größten und kleinsten Wert ermitteln (hierzu die innere Schleife mit den verschiedenen Messobjekten), die Differenz bilden, evtl auch die Prozentuale Abweichung und die Ergebnisse ablegen. Dann soll das selbe für den nächsten Druck geschehen.

mit rate{j}.druecke{d} will ich also zum Beispiel auf rate{1}.druecke{1} --> eins.bar400 zugreifen, danach auf zwei.bar400, dann drei.bar400 und sobald alle Objekte abgefragt wurden eins.bar800, zwei.bar800 etc.

Hierzu muss er jedoch verstehen, dass er im Objekt eins nicht nach dem field name "druecke" suchen soll, was er bislang jedoch anscheinend tut.

Ich hoff jetzt ist das Ganze etwas verständlicher
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.03.2012, 09:51     Titel:
  Antworten mit Zitat      
das steht glaub ich auch alles in der doc aber ich denke du meinst das hir
Code:
rate{1}.bar400=10;
rate{1}.bar800=20;
rate{2}.bar400=30;
rate{2}.bar800=40;
druecke={'bar400','bar800'}; %alternativ druecke=fieldnames(rate{1})
rate{1}.(druecke{1})

kleine anmerkung. du solltest nicht min und max definieren. die sind schon mit matlab internen funktionen belegt. so kannst du sie nicht mehr benutzen und musst die variablen erst löschen bevor das weider geht. deswegen sollte es vermieden werden variablen namen zu benutzen die schon von internen funktionen belegt sind. zb max min j i etc
Private Nachricht senden Benutzer-Profile anzeigen
 
steffen1187
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 19.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 10:02     Titel:
  Antworten mit Zitat      
D

Ah, die kleine verfluchte Klammer um (druecke{d}) wars Very Happy
Du bist mein Held!

der Rest war soweit eigentlich klar

danke für den Tip mit min/max, das selbe hab ich schonmal mit xlim verbockt...

Grüße
Steffen
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: 28.03.2012, 15:00     Titel:
  Antworten mit Zitat      
Hallo steffen1187,

Die Speicherung von Informationen im Variablennamen führt immer wieder zu Schwierigkeiten, da man dann ein programm nur mit großer Mühe erweitern kann. Wenn man z.B. bar10, bar20, bar100, ... verwendet, ist es aufwändig an allen Stellen im Programm noch ein bar15 einzufügen.
Eleganter und effizienter wäre z.B. ein Struct-Array:
barStruct(1).Pressure = 10;
barStruct(1).Value = xyz;
barStruct(2).Pressure = 20;
barStruct(2).Value = abc;
...
Dann kann man die Liste der "Variablen" automatisch um 500'000 Einträge ergänzen ohne am Programmtext irgendetwas ändern zu müssen.

Gruß, Jan
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.