Verfasst am: 01.03.2013, 16:17
Titel: Ungleiche Anzahl an Daten Speichern/Laden
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).
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^^..
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:
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(:,:, 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,, 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!
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
Einstellungen und Berechtigungen
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
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.