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

Ungleiche Anzahl an Daten Speichern/Laden

 

niccnacc
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2013, 16:17     Titel: Ungleiche Anzahl an Daten Speichern/Laden
  Antworten mit Zitat      
Hi!

Ich hab eine eher generelle Frage zu Matlab/Octave:
Ich mach von zig Messungen eine FFT und muss die gefundenen Frequenzen speichern. Genauer sind das 3-5 mal die Hauptfrequenz, 3-7 mal 2 weitere Frequenzen und dann noch zusätzliche Frequenzen, die meistens nicht nötig sind.
Alle diese Frequenzen müssen über der "ID" geplottet werden. ID ist die Messbedingung, zB Geschwindigkeit.

Also zum Schluss brauch ich das Mittel aller Werte der Hauptfrequenz als Plot über der Geschwindigkeit. Gleiches mit den andren.
Da Matrizen ja keine leeren Felder enthalten können hab ich an ein Structure gedacht - eine falsche Wahl?

Mein Struct sieht etwa so aus:

Code:

data.Geschwindigkeit = Skalar
data.f1 = [Matrix mit 3-5 Werten]
data.f2 = [Matrix mit 3-5 Werten]
...
 


Dass zB f1 nicht gleich der Mittelwert ist, hat den Grund, dass zB Standardabweichung auch interessant ist, und zugänglich bleiben muss.

Da das mein estes Struct ist, bin ich mir nicht sicher, ob das so doll ist so..
Ich speichere die Werte dann mit data(1).f1 = [....];

Laden funkt aber nur über ziemlich blöde Schleifenkonstrukte, weil die verschiedenen f1 verschieden viele Werte haben.
Deshalb die Frage: Sieht jemand eine bessere Ordnung für ein Struct, oder eine einfachere Lösung diese Datensätze zu speichern/laden? Ideal wäre zum Beispiel eine Anordnung, wo ich nach dem Laden des structs nur noch ges = data.Geschwindigkeit eingeben muss, und alle ges. in einer Matrix hab. Selbes für mean(f1).

Danke für jeden Hinweis/Anregung/Kritik!
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: 01.03.2013, 23:51     Titel:
  Antworten mit Zitat      
Hi,

Poste doch mal Beispieldaten und wie du das bisher umsetzt. Dann ist deine Datenstruktur leichter zu verstehen und dir wird schneller geholfen.

Für Skalare ginge es schon mal so:
Code:
data.Geschwindigkeit(1) = 45;
data.Geschwindigkeit(2) = 30;


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
niccnacc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2013, 11:05     Titel:
  Antworten mit Zitat      
Code:
octave:20> data
data =

  1x2 struct array containing the fields:

    re
    f1
    amp_f1
    f2
    amp_f2
    f3
    amp_f3
    f_other
    amp_other

octave:21> data.f1
ans =

   0.56764   0.60195   0.63626   0.67057

ans =

   0.70037   0.74414   0.76916
 


Also re ist nur ein Skalar - die Testbedingung. Ich muss dann f1 und amp_f1 getrennt über re plotten.
Das Problem, wie man sieht, ist dass f1 einmal 4, einmal 3 Werte haben können muss.
data.f1 wär genau das, was ich brauch -> also alle f1 laden. Dieser Befehl geht aber nur mit ans, wenn man ne Var. zuordnet wird nur der letzte Eintrag zugeordnet.

Deine Empfehlung wäre perfekt - genau das, was ich suche, wenns mit Vektoren funktionieren würde. Für ein Skalar kann ich dann data.re(1), re(2)... machen, und hab alle re in einem Vektor - sehr gut. Aber leider muss ich die zugehörigen Vektoren auch erkennen können. Also zB wenn amp_other mal leer ist, dann darf nicht das nächste re benutzt werden, sondern immer zusammengehörige (ich hab ja dann für einen re Wert kein other).

Bisher, wie gesagt hab ich lauter Objekte des Structs aufgemacht: Also data(1).f1 = [Vektor] und dann data(2).f1 = [Vektor andrer Größe]. Ist das die Einzige Art mit dem umzugehen? Hab sogar schon an dynamische Felder mit Regex zum Extrahieren gedacht, aber das scheint doch reichlich weit gegriffen^^..
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: 02.03.2013, 11:44     Titel:
  Antworten mit Zitat      
Moin,

structfun könnte weiterhelfen. Müsstest du mal nachlesen, hab ich heute leider keine Zeit zu.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
niccnacc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2013, 12:19     Titel:
  Antworten mit Zitat      
Seban hat Folgendes geschrieben:
Moin,

structfun könnte weiterhelfen. Müsstest du mal nachlesen, hab ich heute leider keine Zeit zu.

Grüße


Ah, daran hab ich nicht gedacht, weil ich ursprünglich jeden Wert rauspicken wollte, aber wenn ich damit Mean, aber auch Std-Deviation rausholen kann, dann ist das eh, was ich such!

Die Dokumentation für C++ zB is ja nicht einfach - weils so streng ist. Aber Matlab = unlesbar. Muss mich ws erst gewöhnen, dass es nicht so ordentlich ist, wie andere Sprachen.
Jedenfalls:
Code:

KLA = structfun(@mean, data)

octave:17> KLA(1,1,:)
ans =

ans(:,:,1) =  3500
ans(:,:,2) =  3200
ans(:,:,3) =  3225
ans(:,:,4) =  3250

 


Das wären genau alle Geschwindigkeitswerte, die ich brauche. Nun wieder der selbe kack: das kann man nicht plotten, weil nicht einfach die Werte drinstehen, sondern aus irgendeinem Grund dieses ans(:,:,Smile 3-D Matrix-Gebilde. Ich weiß nichtmal, wie das kommt, geschweige denn, wie ich das auf einen ordentlichen Vektor zurrechtstutzen kann.
Nach dem Input und der mean Funktion muss der Output ein Vektor aus Zahlen sein, also 1xN, wobei N die Anzahl der Werte ist. diese befinden sich offenbar in KLA(r,1,Smile, wobei r der index des gewünschten Feldes ist. Die gewünschte form wäre oben zB: a = [3500, 3200, 3225, 3250]; oder transponiert, sofern man das wieder transponieren kann.

Jemand vielleicht ein Stichwort, nach dem ich hier suchen kann?
Wie heißt dieses komische Konstrukt mit ans(:,:,i) ? Was kann das etc.? Link, oder Hinweis sehr willkommen!
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: 04.03.2013, 02:02     Titel:
  Antworten mit Zitat      
Hallo niccnacc,

Ich kenne mich nicht mit Octave aus. Unter Matlab erzeugt X(1, 1, :) ein 3D-Array, und das ist natürlich auch gut so. Per RESHAPE oder SQUEEZE Befehl bekommt man daraus eine Matrix, bei der eine Dimension die Länge 1 hat (also einen Vektor).

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.