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

Zeilenweise summieren

 

kraudi13
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 13:42     Titel: Zeilenweise summieren
  Antworten mit Zitat      
Hallo liebe Matlab-Gemeinde,

ich ich komme gerade bei einer vermeintlich leichten Aufgabe nicht mehr weiter.

Ich würde gern aus einer zweispaltigen Matrix Zeilenweise die zweite Spalte über einen definierten Bereich summieren, solang meine Bedingung für den Wert der Spalte 1 zutrifft. (1 bis 5 Zusammenfassen)

Code:

one_cell = 1;
one_interval = one_cell*5;
time_frame=0;
A = transpose(vertcat((1:7),(randi(100,1,7))));
start_frame=0;
end_frame = 5;
count=1;

while (time_frame >= start_frame && time_frame <= end_frame);
summe_A = sum(A,2);    
time_frame=time_frame+one_cell;
count = count + 1;
end


Am Ende bekomm ich aber leider immer wieder alle 7 Werte und nicht die ersten 5 raus und es wird (sicherlich durch die Summierung) pro Zeile auch die Anzahl der Zeile hinzuaddiert.

Ich freue mich über konstruktive Hinweise.

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


Harald
Forum-Meister

Forum-Meister


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

mir ist die Problemstellung nicht klar.
Ein Beispiel mit Input und erwartetem Output wäre hilfreich.

Vermutlich kann das Problem sehr kompakt mit logischer Indizierung gelöst werden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 17:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

aus der Matrix soll am Ende ein Wert pro 5 Sekunden stehen:

A{
1 | 3
2 | 6
3 | 7
4 | 9
5 | 3
6 | 1
7 | 2
}

Am Ende sollte das folgende rauskommen:

B{
1 (1-5) | 5,6
2 (6-7) | 1,5
}

Vielen Dank schon mal dafür!

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
blockNum = ceil( A(:,1) /5);
groupMeans = splitapply(@mean, A(:,2), blockNum)


Falls immer 5 Werte zusammengehören und es vollständige Blöcke gibt, kann man auch reshape verwenden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 22:05     Titel:
  Antworten mit Zitat      
Hallo zurück,

ich hab das Beispiel leider versucht zu simpel zu halten, als es letztendlich im Endergrebnis ausschauen soll.

Dahinter steht eine Zusammenfassung von Sekunden-Werten aus einer Herzfrequenz-Analyse, die ich gern auf minütliche Werte heruntergebrochen haben möchte.

Rohwerte:

Sekunden, Herzfrequenz
01,76
02,75
03,75
04,75
05,76
06,77
07,80
08,81
09,82
10,82
11,82
12,81
13,79
14,79
15,79

Jetzt würde ich gern den Bereich, der zusammengefasst wird, variabel vorher definieren können (bspw.: 10s oder eben 60s). Am Ende sollte dann, wie beschrieben, der Mittelwert pro Bereich resultieren.

In meinem ersten Code lief das im Grunde auch so durch. Zumindest durchlief es den definierten Bereich (count zeigte die richtige Anzahl der Durchläufe)
summe_A beinhaltete allerdings weiterhin alle Werte des Originalvektors.

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

hast du denn meinen Vorschlag mal auf deinem Datensatz versucht?
Natürlich musst du die 5 durch 60 oder auch N ersetzen, und N auf 60 setzen.

Deinen Ansatz kann ich nicht nachvollziehen.
A wird in der Schleife nicht verändert, und dann wird sich natürlich auch sum(A,2) nicht ändern.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 22:22     Titel:
  Antworten mit Zitat      
Ja hab ich. Und das funktioniert für einen vollständigen Datensatz auch gut. Allerdings misst das verwendete System mit einigen Sprüngen. Das Bedeutet, dass eine Minute manchmal 59, manchmal 49 Werte besitzt.

Beste Grüße
Tino
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: 16.12.2016, 22:25     Titel:
  Antworten mit Zitat      
Hallo kraudi13,

Das liegt am "summe_A = sum(A,2)", denn hier wird ja immer wieder über ganz A summiert.
Vielleicht meinst Du:
Code:
index = (time_frame >= start_frame && time_frame <= end_frame);
summe_A = sum(A(index));

Oder etwas in der Art.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 22:52     Titel:
  Antworten mit Zitat      
Da kommt am Ende leider nur 0 raus.

Es sollte so laufen, dass Zeile für Zeile gecheckt wird

1. Liegt der aktuelle Schleifendurchlauf innerhalb des definierten Zeitraumes
2. Wenn ja, summiere Zeile für Zeile
3. bis der definierte Zeitraum sein Ende erreicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Allerdings misst das verwendete System mit einigen Sprüngen. Das Bedeutet, dass eine Minute manchmal 59, manchmal 49 Werte besitzt.

Der Ansatz sollte damit umgehen können. Was passiert denn, wenn du ihn auf solche Messwerte anwendest? Könntest du so einen Datensatz zur Verfügung stellen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 23:41     Titel:
  Antworten mit Zitat      
Ja, natürlich. Siehe Datei hr_data.txt

Da passiert leider wirklich das beschriebene Problem, dass am Ende mit summe_A nichts als 0 rauskommt.

Beste Grüße

hr_data.txt
 Beschreibung:

Download
 Dateiname:  hr_data.txt
 Dateigröße:  5.01 KB
 Heruntergeladen:  311 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
kraudi13
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 15:09     Titel:
  Antworten mit Zitat      
Hallo zusammen,

eine weitere Lösung wäre noch übe reshape. Aber dann müssten alle fehlenden Samples der Sekunden gefüllt werden und das bekomme ich gerade auch nicht wirklich hin.

Beste Grüße
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: 17.12.2016, 16:40     Titel:
  Antworten mit Zitat      
Hallo kraudi13,

Dann zeige doch wenigstens, was Du versucht hast und erkläre, wo es noch hängt.

Ich zumindest verstehe das Problem immer noch nicht. Die Erklärung
Zitat:
Am Ende sollte das folgende rauskommen:

B{
1 (1-5) | 5,6
2 (6-7) | 1,5
}

lässt mich z.B. mit fragendem Unverständnis zurück. Ich verstehe die Notation nicht. Ist das ein Text-File?

Zitat:
Da kommt am Ende leider nur 0 raus.

Es sollte so laufen, dass Zeile für Zeile gecheckt wird

1. Liegt der aktuelle Schleifendurchlauf innerhalb des definierten Zeitraumes
2. Wenn ja, summiere Zeile für Zeile
3. bis der definierte Zeitraum sein Ende erreicht.

Aber genau das macht der von mir gepostete Ansatz - zumindest dalls Du ihn so einsetzt wie von mir gedacht. Wie Du das nun tatsächlich implementiert hast, zeigst Du aber noch nicht. Darum kann ich keine Verbesserungsvorschläge geben.

Der histcounts Befehl kann Daten in "Bins" einsortieren und mit accumarray order dem modernen splitapply bekommst Du auch Summen über die Bins. Mir wird nur nicht klar, wie Du die Intervalle definierst, ansonsten wäre das Problem wohl mit 2 Zeilen erledigt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 18.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 18:06     Titel:
  Antworten mit Zitat      
@Jan,

es klappt. Ich hatte in der Schleife in der dein vorgeschlagener Code lief einen kleinen Fehler drin und der hat am Ende die Summe 0 ergeben.
Jetzt passt es!

Besten Dank an euch für die Ausführungen!

Kraudi
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.