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

Werte in 225er Schrittweite ablaufen

 

Geranie
Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.07.2013, 12:48     Titel: Werte in 225er Schrittweite ablaufen
  Antworten mit Zitat      
Hallo zusammen,

ich hab einen Datensatz, in welchem ich jeweils 225 Werte daraufhin abgleichen will, ob diese alle positiv oder alle negativ sind (was relativ häufig nicht der Fall sein wird, meistens werden die Werte gemischt auftreten). Ingesamt hat mein Datensatz fast 8 Millionen Werte.

Jetzt hake ich gerade schon an der berühmten For-Schleife, von der ich mal vermute, dass ich sie nutzen kann, damit immer die weiteren 225 Werte abgesucht werden? Wie mach ich Matlab das genau klar? Also, dass er nach der ersten Schleife bei Wert 226 weitermacht (und dann wieder für 225 Werte schaut, ob diese alle positive oder negativ sind).
Das Heraussuchen der Werte läuft wahrscheinlich einfach über:
Code:
find(data(k)>0 or <0)

oder so ähnlich?

Wäre über jede Hilfestellung dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.07.2013, 13:22     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Länge der Daten ein vielfaches von 225 ist, geht das recht einfach, kompakt und schnell:

Code:
data = randn(225*40000,1);
datare = reshape(data, 225,[]);
allpositive = sum(sign(datare)) == 225;
allnegative = sum(sign(datare)) == -225;
allsamesign = sum(sign(datare)) == sign(datare(1,:));


Wenn die Länge der Daten kein vielfaches von 225 ist, musst du dir sowieso überlegen, wie du den letzten Block behandelst.

Grüße,
Harald
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: 03.07.2013, 14:35     Titel:
  Antworten mit Zitat      
Hallo,

Oder:
Code:
data = randn(225*40000,1);
datare = reshape(data, 225,[]);
allpositive = all(datare > 0, 1);
allnegative = all(datare < 0, 1);


Ich meine, die letzte Zeile von Haralds Vorschlag funktioniert nicht:
Code:
data = [0, -1, 1];
allsamesign = sum(sign(data)) == sign(data(1));

BSXFUN wäre hier besser:
Code:
allsamesign = bsxfun(@eq, sign(data), sign(data(:, 1));

Aber dies würde es auch schon tun, wenn die beiden anderen Werte bereits berechnet sind:
Code:
allsamesign = allpositive || allnegative;

Die Kernaussage ist aber: Das geht gut mit FOR-Schleifen, aber einfache und schneller mit Matlab's vektorisierten Methoden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Geranie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.07.2013, 14:43     Titel:
  Antworten mit Zitat      
Hallo Harald!

Ja, der Datensatz ist ein Vielfaches von 225.

Dein Code läuft auch einwandfrei durch, nur stimmen die Zeitwerte irgendwie nicht überein.

Also, ich übergebe "allsamesign" dann an die Datumswerte (die zu diesen Werten, die ich auf positiv und negativ überprüfe gehören) und theoretisch müsste mir Matlab dann eigentlich 225 Zeitwerte ausgeben, die immer eine Viertelstunde ergeben. Hier bekomme ich aber unzusammenhängende Zeitwerte raus, also als Beispiel:
ich würde erwarten:
01.01.2013 00:00:00
alle Werte bis
01.01.2013 00:14:56

bekomme aber:
01.01.2013 01:55:00
und danach
01.01.2013 02:55:44

Mache ich da irgendeinen Fehler? Folgendermaßen habe ich allsamesign übergeben:
Code:
datestr(sfc_ra.time(allsamesign),0)


Vielen Dank schonmal an dich!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.07.2013, 15:04     Titel:
  Antworten mit Zitat      
Hallo,

Die Einträge in allsamesign beziehen sich auf den jeweiligen Block. Das siehst du auch, wenn du dir die Länge der Variable im Workspace ansiehst.

Das bedeutet, du musst dir auch aus dem Zeitvektor die entsprechenden Anfangs und Endzeiten ziehen:
Code:
anfang = sfc_ra.time(1:225:end);
ende = sfc_ra.time(225:225:end);


Wenn du in diese Vektoren indizierst, solltest du die richtigen Anfangs- und Endzeiten der jeweiligen Blöcke bekommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Geranie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.07.2013, 15:36     Titel:
  Antworten mit Zitat      
Oh mann, sowas hatte ich schon vermutet, aber irgendwie nicht geklärt bekommen!

Ich danke dir, jetzt läuft es mit der Indizierung und ich bekomme die gewünschten Daten ausgegeben. Herzlichen Dank!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Geranie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 09.07.2013, 12:23     Titel:
  Antworten mit Zitat      
Hallo zusammen!

Beim weiterrechnen ist mir aufgefallen, dass die allsamesign-Werte nicht stimmen. (Hier übrigens auch ein Danke an Harald für die Antwort im anderen Thread. Ich hatte direkt wieder for-schleifen im Kopf, dabei funktionierte auch dafür alles wunderbar mit reshape!)

Also, folgendes Problem: Für diese Funktion
Code:
allsamesign = sum(sign(datare)) == sign(datare(1,:));
 
bekomme ich eine 1x35136 Matrize, die für wahre Werte 0 und für falsche Werte 1 enthält. Nun habe ich aber bspw in allnegative eine 1 in der 4. Spalte stehen und in allsamesign eine 0. Ich habe die Werte überprüft und tatsächlich sind die 225Werte in Spalte 4 alle negativ.

Ich habe dann die anderen Codes von Jan ausprobiert.
Für
Code:
allsamesign = bsxfun(@eq, sign(datare), sign(datare(:, 1)));

bekomme ich eine 225x35136 Matrize, in er für jeden Wert eine 0 oder 1 steht. Aber auch hier wird für die 4.Spalte ab einem bestimmten Wert eine 0 angezeigt, obwohl diese eben alle negativ sind (wie gesucht).

Für
Code:
allsamesign = allpositive || allnegative;
bekomme ich den Fehler: Operands to the || and && operators must be convertible to logical scalar values.

Hat irgendwer eine Idee, was genau bei allsamesign falsch läuft? Allnegative und allpositive scheinen (zumindest für die Werte, die ich kontrolliert habe) zu stimmen.
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: 09.07.2013, 13:28     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Zitat:
Nun habe ich aber bspw in allnegative eine 1 in der 4. Spalte stehen und in allsamesign eine 0.

Das ist kein Widerspruch: "all amse sign" heißt ja nicht, dass die die 4. Spalte positive oder negativ ist, sondern dass alle Elemente der entsprechenden Zeile alle das gleiche Vorzeichen haben.

In meinem Code möchtest Du vielleicht noch ein all() ergänzen:
Code:
allsamesign = all(bsxfun(@eq, sign(datare), sign(datare(:, 1))), 2);

Später hatte ich dann einen Tipp-Fehler: Für Arrays muss es | heißen, während || für Skalare reserviert ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.07.2013, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

es hatte sich ein Tippfehler eingeschlichen. Ich meinte:
Code:
allsamesign = sum(sign(datare)) == 225*sign(datare(1,:));


Alternativ eben
Code:
allsamesign = allpositive | allnegative;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Geranie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 11.07.2013, 17:22     Titel:
  Antworten mit Zitat      
Vielen Dank euch beiden, ich habe es nun mit der 'und'-Verknüpfung gelöst und wieder etwas gelernt.

Danke!
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.