Verfasst am: 17.07.2013, 17:19
Titel: Matrizen-Einzelfelder in Struktur zu dem Vektor zusammfassen
Hallo allerseits!
Ich habe viele Daten in einer Struktur. Diese muss ich für hist-plot zu einem Vektor zusammenfassen.
Mit der for-loop dauert es zu lange. Kann man ohne for-loop bestimmte Stellen diese Matrizen zu einem Vektor zusammenfassen?
%Angenommen ich möchte die Daten aus Felder 1 und 3 extrahieren
% Möglichkeit 1: Dann kann man das direkt über Feldnamen machen
Feld1 = [S.Feld1]
Feld3 = [S.Feld3]
% Möglichkeit2 über STRUCT2CELL
C = struct2cell(S)
Ich dachte es gibt die Möglichkeit die Aufgabe über structfun zu lösen.
Damit es verständlicher wird:
Code:
% structur erzeugen for f=1:10 for m = 1:3
fieldName = ['f' num2str(f)];
matrixName = ['m' num2str(m)];
struc.(fieldName).(matrixName) = rand(3);
end end
Das funktioniert! vielen Dank!
Verstehe nicht ganz was bei cat and squeeze gemacht wird. Ich kenne die Funktionen leider noch nicht. Aber das werde ich nachholen.
Aber ganz allgemein wäre die Möglichkeit über structfun das lösen? Und was genau an dem Struktur unschön?
Danke!
Mfg
FeLe
An der Datenstruktur ist unschön, dass man zusammengehörige Werte mit komplizierten Funktionen zusammen suchen muss. Wie Du schon selbst herausgefunden hast, ist der Zugriff über eine FOR-Schleife bereits langsam.
STRUCTFUN läuft nicht besonders viel schneller, deshalb würde ich eher bei Dennys Vorschlag bleiben.
Die Wahl einer effizienten Daten-Representation ist generell schwierig. Was für die eine Aufgabe gut ist, bremst eine andere Aufgabe enorm aus. In einem Telefonbuch ist es sehr einfach herauszufinden, wieviele Namen mit A beginnen, aber ein Horror nach Namen zu suchen, die mit A aufhören. Bei komplizierten Daten ist ein Struct sehr hilfreich, da es Stunden an Debugzeit sparen kann den einzelnen Unter-Strukturen Namen zu geben, nämlich die Fieldnames. Aber rechentechnisch ist es natürlich effizienter aus allen Werten ein einziges riesiges Array zu erstellen.
Vielen Dank noch mal für ihre Hilfe!
Wie der Jan richtig gesagt hat, wenn ich alle Daten in einen Array rein tue, finde ich gar nichts mehr. Die Struktur präsentiert einen bestimmten Parameter, die Felder sind Einzel-DUTs, die Unter-Felder sind mehrere Ausgänge und die Matrix-Zellen präsentieren bestimmte Umgebungsbedingungen (Temperatur usw.).
Für mich erscheint die Sache mit Strukturen nicht ganz rund. Die Eingabe;
Ich wollte noch mal meine Wille strucfun zu nutzen kommentieren. Eine der wichtigsten Aufgaben ist die Pflege von dem Program und Anpassung. Wenn es einmalige Sache wäre, wäre es auch egal wie man zu der Lösug gekommen ist. Die Programmierung ist für mich Nebenbeschäftigung. Das heißt wenn ich nach paar Monaten wieder an das Programm ran muss, erschein für mich;
CAT und SQUEEZE sind aber grundlegend.
CAT fügt Arrays zusammen, und Du kennst CAT(1, X, Y) z.B. in der Form [X; Y] und CAT(2, X, Y) als [X, Y]. Hier werden automatisch die internen Funktionen VERTCAT und HORZCAT aufgerufen und die Schreibweise mit den eckigen Klammern dient nur der besseren Lesbarkeit.
SQUEEZE quetscht einfach nur diejenigen Dimensionen raus, deren Länge 1 ist. Es wird also aus einem [3 x 1 x 4 x 1 x 5] Array eines der Größe [3 x 4 x 5]. Das ist praktisch, wenn man z.B. von einem 3D-Array einen Mittelwert über die zweirte Dimension berechnet: mean([M x N x P], 2) ergibt ein [M x 1 x P] Array. Wenn man aber eine Matrix bekommen möchte, hilft SQUEEZE oder das equivalente: RESHAPE(Y, M, P).
Sehr hilfreich und deshalb essentiell für das Verständnis des Codes sind Kommentare. Am besten wird der Zweck jedes Abschnitts oder sogar jeder Zeile erklärt. Denn nur dann kann man hinterher beim Debuggen entscheiden, ob der Code das macht, was er soll. Wenn man aber nur den Code sieht, kann man nur noch raten, was er eigentlich machen soll und einen Fehler kann man dann nicht mehr erkennen.
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.