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

Auswahl und Aufteilung zusammenhängender Datenzeilen

 

throttle
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2016, 10:34     Titel: Auswahl und Aufteilung zusammenhängender Datenzeilen
  Antworten mit Zitat      
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):

Impulssignal Messvektor1 ...
0 Messwert
0 Messwert
0 Messwert_____
1 Messwert
1 Messwert
1 Messwert
1 Messwert
0 Messwert
0 Messwert
0 Messwert
0 Messwert
0 Messwert
... ...
0 Messwert_____
1 Messwert

Habe mir schon überlegt, eine Bedingung einzubauen, á la:
Code:
if Impulssignal(i,1) + Impulssignal(i-1,1) == 1 && Impulssignal(i,1) + Impulssignal(i+1,1) == 2

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.

Grüße
throttle
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2016, 11:19     Titel:
  Antworten mit Zitat      
Hallo,

verwende den diff Befehl und find - damit kannst du bestimmen an welcher Position auf eine 0 eine 1 folgt - Beispiel:

Code:

A=[1,1,0,0,1,1,1,0,0,0,1,0];
B=find(diff(A)==1)

B =

     4    10

 
Private Nachricht senden Benutzer-Profile anzeigen
 
throttle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 13:05     Titel:
  Antworten mit Zitat      
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? Embarassed

Aktuell:
Messwert 0
Messwert 0
... ...
Messwert 0
0 Messwert
0 Messwert

Gewünscht:
Messwert Messwert
Messwert Messwert
...


Grüße
throttle
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 14:46     Titel:
  Antworten mit Zitat      
Hallo,

noch eine Zwischenfrage - sind die Bereiche immer gleich lang? Oder unterschiedlich?

Lg
Private Nachricht senden Benutzer-Profile anzeigen
 
throttle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 15:03     Titel:
  Antworten mit Zitat      
Zitat:
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.

Grüße
throttle
Private Nachricht senden Benutzer-Profile anzeigen
 
gs
Forum-Century

Forum-Century


Beiträge: 172
Anmeldedatum: 17.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 16:01     Titel:
  Antworten mit Zitat      
Hi,
Das Ganze geht auch in einen 2-Zeiler abzuarbeiten

alle Einträge mit einer "1":
Code:
einzer = messwertmatrix(find(messwertmatrix(:,1)==1),2)



alle Einträge mit einer "0":
Code:
nuller= messwertmatrix(find(messwertmatrix(:,1)==0),2)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 11:53     Titel:
  Antworten mit Zitat      
gs hat Folgendes geschrieben:
Hi,
Das Ganze geht auch in einen 2-Zeiler abzuarbeiten

alle Einträge mit einer "1":
Code:
einzer = messwertmatrix(find(messwertmatrix(:,1)==1),2)



alle Einträge mit einer "0":
Code:
nuller= messwertmatrix(find(messwertmatrix(:,1)==0),2)


Grüße gs

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 14:26     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht kannst du es wie folgt angehen:

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));
 


Gruß Rob
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 14:28     Titel:
  Antworten mit Zitat      
Ums schöner zu machen kannst du die zwei Befehle bei C auch kombinieren:

Code:

C = [B(1) diff(B)];
 


Is aber nur Formsache Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
throttle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 14:03     Titel:
  Antworten mit Zitat      
Streng genommen genügt doch
Code:

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
 

Und während ich hier antworte, habe ich die Antwort für mein Problem gefunden:
Code:
for i = 1:N
    D(:,i) = A(Ind(i):Ind(i+1)-1);
end

Habe zu kompliziert mit bis zu 3 Schleifen gedacht.. das war mein Problem Very Happy

Danke für die Hilfe!

Grüße
throttle
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.