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

Variable im Struct finden und Position anpassen

 

FunkFreaker
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.06.10
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 02.11.2011, 15:46     Titel: Variable im Struct finden und Position anpassen
  Antworten mit Zitat      
Hallo zusammen,

um meine Messdaten in eine GUI einlesen zu können, ist es erforderlich, dass bestimmte Variablen in ihrem Namen angepasst werden. Ich habe dazu ein Skript geschrieben, welche die entsprechenden Variablen selektiert und umbenennt. Folgendes Problem tritt auf: Aufgrund von kamerabasierten Daten, die manchmal nur teilweise aufgezeichnet wurden, kann es sein, dass die Positionen der anzupassenden Variablen (hier: Geschwindigkeit des Ego-Fzgs und dessen Radgeschwindigkeiten) sich innerhalb der Matrix verändern.

Code:
[filename, pathname] = uigetfile('*.mat', 'Select a MATLAB code file','MultiSelect','on');

i=size(filename);
ii=i(2);

for iii=1:ii
tic    
open(fullfile(pathname,char(filename(iii))));
Parameter=ans;
struct_var=fieldnames(Parameter);



Staufahrten=struct('xp_rad_hl_t114',Parameter.(struct_var{809}),'xp_rad_hr_t114',Parameter.(struct_var{810}),'xp_rad_vl_t114',Parameter.(struct_var{811}),'xp_rad_vr_t114',Parameter.(struct_var{812}),'xp_fzg_t103',Parameter.(struct_var{742}),'t103',Parameter.(struct_var{749}),'t114',Parameter.(struct_var{813}));

save(fullfile('D:\Studium\Studienarbeit\Fahrversuche\MAT-Files_Stauversuche',['Stau_',char(filename(iii))])); %Hier ANB_FP-Nr._FZG-Nr_ einfügen  UND Ausgabe ordner ändern
clear ans;
toc
end;


Das heißt, die Positionen in der struct_var ändern sich, wenn ich mehrere Files gleichzeitig bearbeiten möchte, zudem ändert sich natürlich auch die Zeitvariable, z.B. '..._t114' . Die ursprüngliche Matrix hat 822 Zeilen und die Geschwindigkeiten kommen erst ziemlich spät. Gibt es eine Möglichkeit die fünf Geschwindigkeiten UND deren zwei Zeiten (für alle 4 Räder gleich + Egofzg) in ihrer Position innerhalb des Structs zu verändern, sodass die Positionen in der struct_var z.B. 1,2,3,4 und 5 für die Geschwindigkeiten und 6 und 7 für die Zeiten lauten? Vielen Dank für Eure Hilfe!!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.11.2011, 16:30     Titel:
  Antworten mit Zitat      
Hallo,

natürlich gibt es diese Möglichkeit, durch Indizierung.
Code:
struct_var(neue_stellen) = struct_var(alte_stellen);


Dazu musst du aber trotzdem noch wissen, an welcher Stelle die relevanten Einträge ursprünglich stehen, was dir vermutlich erstmal nicht weiterhilft.

Wenn du weißt, welche Feldnamen du brauchst, kannst du sie vielleicht direkt verwenden, anstatt sie aus struct_var auszulesen?

Bei Daten dieser Komplexität empfehle ich dringend, sich vorher zu überlegen, wie man sie verwenden will, und sie möglichst übersichtlich zu speichern.

Zitat:
zudem ändert sich natürlich auch die Zeitvariable, z.B. '..._t114'

Ich verstehe nicht, was du damit sagen willst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 02.11.2011, 16:30     Titel:
  Antworten mit Zitat      
Hallo,
ist leider unklar was du zu erreichen versuchst.
Vielleicht das Ganze nochmal anhand eines Beispiels erklären.
Private Nachricht senden Benutzer-Profile anzeigen
 
FunkFreaker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.06.10
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 03.11.2011, 16:20     Titel:
  Antworten mit Zitat      
Zitat:

Zitat:
Zitat:
zudem ändert sich natürlich auch die Zeitvariable, z.B. '..._t114'


Ich verstehe nicht, was du damit sagen willst.


Die Kamera meines Messfahrzeugs kann bis zu 8 Objekte detektieren und aufzeichnen. Werden, wie in meinem Fall, nur 7 Objekte erkannt, fallen alle weiteren Parameter, die das 8. Objekt betreffen, weg. Dementsprechend sinkt die Anzahl der aufgezeichneten Parameter, dementsprechend sinkt auch die Anzahl der aufgezeichneten Zeitparameter. Bei 8 detektierten Objekten gibt es 117 Zeitparameter.

Zitat:
Wenn du weißt, welche Feldnamen du brauchst, kannst du sie vielleicht direkt verwenden, anstatt sie aus struct_var auszulesen?


Ja, die Namen sind mir bekannt, allerdings wird der Name immer mit dem zugeordneten Zeitparameter versehen, welcher ja leider variabel ist.

Ich würde das Problem nun mit einer if-else Bedingung lösen (für jede Anzahl der detektierten Objekte), weiß aber den korrekten Syntax für die Bedingung nicht. Mein Ziel: Wenn das array an der Stelle {785,1} den Inhalt t110 hat, dann..., sonst....
Code:
[filename, pathname] = uigetfile('*.mat', 'Select a MATLAB code file','MultiSelect','on');

i=size(filename);
ii=i(2);

for iii=1:ii
tic    
open(fullfile(pathname,char(filename(iii))));
Parameter=ans;
struct_var=fieldnames(Parameter);


???if struct_var{785,1} 't110'???
   
      Staufahrten=struct('xp_rad_hl_t110',Parameter.(struct_var{781}),'xp_rad_hr_t110',Parameter.(struct_var{782}),'xp_rad_vl_t110',Parameter.(struct_var{783}),'xp_rad_vr_t110',Parameter.(struct_var{784}),'xp_fzg_t99',Parameter.(struct_var{714}),'t99',Parameter.(struct_var{721}),'t110',Parameter.(struct_var{785}));


else
   
      Staufahrten=struct('xp_rad_hl_t114',Parameter.(struct_var{809}),'xp_rad_hr_t114',Parameter.(struct_var{810}),'xp_rad_vl_t114',Parameter.(struct_var{811}),'xp_rad_vr_t114',Parameter.(struct_var{812}),'xp_fzg_t103',Parameter.(struct_var{742}),'t103',Parameter.(struct_var{749}),'t114',Parameter.(struct_var{813}));
 
end;
   
save(fullfile('D:\Studium\Studienarbeit\Fahrversuche\MAT-Files_Stauversuche',['Stau_',char(filename(iii))])); %Hier ANB_FP-Nr._FZG-Nr_ einfügen  UND Ausgabe ordner ändern
clear ans;
toc
end;
 


Kann mir da jemand einen Tipp geben? Vielen Dank schonmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 03.11.2011, 17:09     Titel:
  Antworten mit Zitat      
Hallo

Für deine IF-Bedingung kannst STRCMP nutzen, um einen String-Vergleich durchzuführen.
Code:

path2save  ='D:\Studium\Studienarbeit\Fahrversuche\MAT-Files_Stauversuche';

[filename, pathname] = uigetfile(    ...
   '*.mat'                          ,...
   'Select a MATLAB code file'      ,...
   'MultiSelect' ,    'on'          );

for iii=1:size(filename,2)
   tic
   Parameter  = load(fullfile(pathname,filename{iii}));
   struct_var = fieldnames(Parameter);
   
   
   if strcmp(struct_var{785,1}, 't110')
     
       Staufahrten = struct(                                 ...
          'xp_rad_hl_t110' ,  Parameter.(struct_var{781})   ,...
          'xp_rad_hr_t110' ,  Parameter.(struct_var{782})   ,...
          'xp_rad_vl_t110' ,  Parameter.(struct_var{783})   ,...
          'xp_rad_vr_t110' ,  Parameter.(struct_var{784})   ,...
          'xp_fzg_t99'     ,  Parameter.(struct_var{714})   ,...
          't99'            ,  Parameter.(struct_var{721})   ,...
          't110'           ,  Parameter.(struct_var{785})   );    
     
   else
     
      Staufahrten = struct(                                 ...
         'xp_rad_hl_t114'  ,  Parameter.(struct_var{809})   ,...
         'xp_rad_hr_t114'  ,  Parameter.(struct_var{810})   ,...
         'xp_rad_vl_t114'  ,  Parameter.(struct_var{811})   ,...
         'xp_rad_vr_t114'  ,  Parameter.(struct_var{812})   ,...
         'xp_fzg_t103'     ,  Parameter.(struct_var{742})   ,...
         't103'            ,  Parameter.(struct_var{749})   ,...
         't114'            ,  Parameter.(struct_var{813})   );
     
   end;  
   
   save(fullfile(path2save,['Stau_',char(filename(iii))]));
   toc
end
 

Zitat:
Ja, die Namen sind mir bekannt, allerdings
wird der Name immer mit dem zugeordneten Zeitparameter versehen, welcher ja leider variabel ist

Vielleicht kannst du das mit REGEXP lösen.
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: 03.11.2011, 17:11     Titel:
  Antworten mit Zitat      
Hallo FunkFreaker,

Ich vertsehe die Frage immer noch nicht.

Zitat:
Ja, die Namen sind mir bekannt, allerdings wird der Name immer mit dem zugeordneten Zeitparameter versehen, welcher ja leider variabel ist.

Wenn ich das richtig verstehe, werden Tags wie '_t114' an die Namen der Felder gehängt. Es ist immer unpraktisch, Index-Information in den Namen von Variablen zu packen. Der Zugriff auf solche Felder ist offenbar auch hier ein Problem.

Dein Code sieht wegen der großen Menge fast gleicher Variablen-Namen undebugbar aus. Ich glaube nicht, dass man ein Programm erweitern oder warten kann, das solche Zeilen enthält:
Code:
Staufahrten = struct('xp_rad_hl_t114', Parameter.(struct_var{809}), 'xp_rad_hr_t114', Parameter.(struct_var{810}), 'xp_rad_vl_t114', Parameter(struct_var{811}), 'xp_rad_vr_t114',Parameter.(struct_var{812}), 'xp_fzg_t103', Parameter.(struct_var{742}), 't103', Parameter(struct_var{749}), 't114', Parameter.(struct_var{813}));


Mir wird nicht klar, was "den Inhalt t110 hat" genau bedeutet. Meinst Du vielleicht:
Code:
if strcmp(struct_var{785,1}, 't110')

?

Nebenbei:
Code:
% char(filename(iii))  % Effizienter und hübscher:
filename{iii}


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.06.10
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 03.11.2011, 17:26     Titel:
  Antworten mit Zitat      
@denny: Vielen Dank, es scheint funktioniert zu haben... obwohl ich die Funktion vor 1 Stunde auch schon ausprobiert habe, scheinbar gabs dort einen Fehler meinerseits.
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.