Verfasst am: 29.06.2016, 10:34
Titel: Auswahl und Aufteilung zusammenhängender Datenzeilen
Hallo zusammen, ich habe ein Problem.
Ich habe mehrere Vektoren (gleicher Länge) mit Messwerten.
Ein Vektor beinhaltet dabei ein sich wiederholendes Impulssigal.
Mein Ziel ist es, die Vektoren der Messwerte in Abhängigkeit des Impulssignals so zu organisieren, dass für jeden Messvektor eine neue Matrix entsteht (ähnlich der reshape-Funktion), deren Spalten die Werte von der jeweils ersten 1 bis zur letzten 0 eines Abschnitts beinhaltet.
Ein extrahierter Beispielbereich (zwischen den Unterstrichen):
Allerdings habe ich Probleme das in die Syntax einzubetten und dies für den ganzen Vektor und für alle vorhandenen Vektoren durchzuführen.
Darüberhinaus könnte es mit den Matrixdimensionen Probleme geben, da nicht davon ausgegangen werden kann, dass alle 11100000....-Abschnitte die selbe Länge haben.
Ich hoffe, ihr könnt mir helfen.
Falls ich eine Lösung dafür übersehen habe, wäre ich auch für Verweise dankbar.
Vielen Dank! Das hat mir schon gut weitergeholfen.
Allerdings habe ich noch ein kleines Problem mit der Extrahierung der Daten.
Ich habe nun die Startpositionen (Ind), ihre Anzahl und die Längen (Laengen) der betreffenden Bereiche. A ist der Ursprungsvektor mit allen Messdaten. Jetzt wünsche ich mir eine Matrix B, in der die Bereiche Spalte für Spalte aufgelistet werden. Dabei habe ich folgende Schleifen verwendet:
Code:
B = zeros(Laengen(1),length(Ind)-1);
for i = 1:length(Ind)-1 for j = 1:Laengen(1) for k = Ind(i):Ind(i+1)-1
B(k-(Laengen(1)+1),i) = A(k);
end end end
Die Bereiche stimmen, sie stehen auch in den richtigen Spalten, allerdings werden diese nicht von oben aufgefüllt. Nach Ende des ersten Bereichs in Spalte 1 geht die Auflistung in der nächsten Spalte UND nächsten Zeile weiter. Wie kann ich die Spalten wieder von Beginn an auffüllen lassen?
noch eine Zwischenfrage - sind die Bereiche immer gleich lang? Oder unterschiedlich?
Bei den aktuellen Werten ist das zwar der Fall, kann aber bei künftigen Daten nicht garantiert werden, also wahrscheinlich eher nicht.
In diesem Fall würde ich als Länge die Länge des größten Bereichs wählen. Lassen sich dann die leeren Zeilen mit NaNs besetzen? Nullen würde ich vermeiden wollen, da die eine Nachbereitung der Daten verfälschen würden, oder ist das bei NaNs auch der Fall?
Wären sie gleich lang könnte ich i-mal die Länge abziehen. Hätte jetzt aber gedacht, dass das einfach ein Fehler in meiner Schleife ist.
Das ist nicht das, wonach ich suche. Ich möchte die Zeilen nicht in 1er und 0er aufteilen, sondern Bereiche der ersten 1 zur letzten 0 extrahieren.
Daher ist der Befehl von ro_mat schon genau das, wonach ich gesucht habe.
Was die Speicherung der Bereiche in einer Matrix angeht habe ich jedoch nach wie vor keine Lösung.
Meine vorhandene:
Code:
for i = 1:Bereiche
for j = Ind(i):Ind(i+1)-1
B(j-i*Laengen(i)-1,i) = A(j);
end end
ist darauf angewiesen, dass die Bereiche stets gleich lang sind, wovon jedoch nicht auszugehen ist.
Wie kann ich Vektoren (Spalten) ungleicher Länge in einer Matrix ablegen?
Du bekommst ja nach der Anwendung der
find
und
diff
Befehle eine Matrix (ich habe sie B genannt) die dir die Bereichsübergänge anzeigen! Aus dieser Matrix kannst du ja dann den Bereich mit der größten Anzahl extrahieren! Damit würde ich mir mal eine Matrix erstellen die du dann Spaltenweise mit den Bereichen füllst!! Also wenn:
Code:
B = [4, 10, 20, 28];
C(1) = B(1);
C(2:length(B)) = diff(B);
MAT = nan(max(C), length(B));
oder? In deinem Beispiel möchte ich die Zeilen bis zur 4 gar nicht berücksichtigen, da diese keinen vollständigen Abschnitt darstellen, daher muss die Matrixbreite der Anzahl der Indizes-1 sein.
Damit erhalte ich die Präallokation meiner Matrix mit
Code:
B = find(diff(A)==1)+1; % Indizes mit erster 1
N = length(B)-1; % Anzahl vollständiger Abschnitte
C = diff(B); % Länge der Abschnitte
D = nan(max(C),N); % Präallokierte NaN-Matrix mit Bereichsbreite und max. Länge
Habe zu kompliziert mit bis zu 3 Schleifen gedacht.. das war mein Problem
Danke für die Hilfe!
Grüße
throttle
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.