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

struct- fields kürzen

 

Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 12:24     Titel: struct- fields kürzen
  Antworten mit Zitat      
Hallo,

ich habe in einem struct Messwerte, die in einzelnen fields gespeichert sind, d.h. 100 fields mit jeweils 8000 Messwerten (also 8000 Zeilen und eine Spalte). Ich möchte jedoch die ersten 500 nicht verwenden, sondern nur die letzten 7500. Wie kann ich nun im gesamten den struct bearbeiten, ohne jedes Feld einzeln bearbeiten zu müssen.
Komme da nicht dahinter.

Danke!

Linda


General_Griboz
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 23.05.2017, 12:47     Titel:
  Antworten mit Zitat      
Was meinst du mit nicht verwenden? Wenn du sie einfach löschen willst, dann funktioniert das:

Code:
struct.fieldname(1:500,:)=[];


Dann löscht er die ersten 500 und alle anderen Zeilen rutschen im Index jeweils nach oben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 12:52     Titel:
  Antworten mit Zitat      
Danke für Deine Antwort.
Ja, löschen ist in Ordnung, aber so muss ich ja den fieldname immer neu eingeben. Ich möchte einfach alle fields im struct (mit dem Namen "Messwerte" z.Bsp.) genau gleich bearbeiten. Ist dies auch möglich? So müsste ich nicht alle Tabellen einzeln anklicken.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.05.2017, 13:36     Titel:
  Antworten mit Zitat      
Hallo Linda,

Code:
F = fieldnames(S);  % If S is your struct
for iField = 1:numel(F)
  S.(F{iField})(1:500, :) = [];
end

Das nennt sich "dynamic fieldnames".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 15:16     Titel:
  Antworten mit Zitat      
Okay, das habe ich nun so angewendet und kriege folgende Fehlermeldung: Matrix index is out of range for deletion.
Versucht das hiermit die fields selbst zu löschen?
Ich möchte wirklich nur die Zeilen der Inhalte der Fields löschen.

Echt komisch, dass es hiermit immer noch nicht will.
 
Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 17:27     Titel:
  Antworten mit Zitat      
Vielleicht erkläre ich mein Problem noch mal genauer:

Ich habe Vektoren, die jedoch als Fields in einem struct gespeichert sind. Die haben eine Länge, die ich kürzen will, weil die ersten 500 Messwerte eben unbrauchbar sind. Mit dem oberen Code funktioniert es leider nicht. Es ruft mir die Felder auf, aber verändert nicht deren Zeilenlänge.

Ich krieg das Problem trotz stundenlangem Durchlesen und Testen von Vorschlägen nicht gelöst.
 
General_Griboz
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 23.05.2017, 17:31     Titel:
  Antworten mit Zitat      
Dein Problem liegt vllt darin, das es keine Zeilenvektoren sind, sondern Spaltenvektoren. Dein Vektor sieht wahrscheinlich so aus 1x8000 und nicht 8000x1. wenn dem so ist, dann versuch mal das:

Code:
F = fieldnames(S);  % If S is your struct
for iField = 1:numel(F)
  S.(F{iField})(:, 1:500) = [];
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 17:42     Titel:
  Antworten mit Zitat      
Leider nicht. Es ist ein 8000x1 Vektor.
 
General_Griboz
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 23.05.2017, 17:52     Titel:
  Antworten mit Zitat      
Dann poste doch mal bitte deinen Code, den du schon hast und sag in welcher Zeile der Fehler auftritt. Denn mit dem Beispiel funktioniert es.

Code:
S.field1(1:100,1)=0;
S.field2(1:100,1)=0;
 F = fieldnames(S);  % If S is your struct
for iField = 1:numel(F)
  S.(F{iField})(1:50,:) = [];
end
 


Er löscht die ersten 50 Zeilen in field1 und field2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Linda

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2017, 12:09     Titel:
  Antworten mit Zitat      
Code:
SNames=fieldnames(S);


for i=1:numel(SNames)
    % übergebe den Feldnamen i an die temporäre Variable temp
    temp= S.(SNames{i});
   
    % tem soll die letzten 7500 punkte behalten
    temp=temp(length(temp)-7499:length(temp));
   
    % Rückgabe der Werte
     S.(SNames{i})=temp;
end



So hat es jetzt geklappt. Smile

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.05.2017, 14:14     Titel:
  Antworten mit Zitat      
Hallo Linda,

Das ist seltsam, denn eigentlich ist das genau das, was mein Code auch tat.

Code:
SNames=fieldnames(S);
for i =1 :numel(SNames)
     S.(SNames{i}) = S.(SNames{i})(501:end, :);
end


Zitat:
Matrix index is out of range for deletion.

Das heißt, dass eines der Felder weniger als 500 Elemente enthält. Aber dann sollte dein Code auch nicht funktionieren.

Vielleicht hast Du meinen Code nicht exakt kopiert und mal "i" statt "iField" verwendet?

Aber egal, hauptsache es läuft jetzt.

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 - 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.