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

Grosse Matrix in Bins (Zeitstempel) unterteilen

 

RatioTM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 19.02.2020, 18:21     Titel: Grosse Matrix in Bins (Zeitstempel) unterteilen
  Antworten mit Zitat      
Hallo,

ich habe eine grosse Matrix wobei in Ausschnitt davon wie folgt aussieht:
Code:

A=
[737752.954791667   8.97425000000000
737752.954803241   3.58876000000000
737752.954814815   24.2254000000000
737752.954849537   40.2881000000000
737752.954861111   96.5793000000000
737755.652986111   2.56704000000000
737755.652986111   2.87958000000000
737755.652986111   3.24325000000000
737755.652986111   3.58876000000000
737755.652997685   1.62712000000000]
 


Ich moechte diese Matrix in mehrere Zeitstempel von 1 sekunde laenge unterteilen, wobei jedes mal wenn eine Zeit angezeigt wird, dies einem "count" entspricht. Dies habe ich wie folgt gemacht:

Code:

n_start= round(min(A(:,1))*24*60*60);
n_end=round(max(A(:,1)*24*60*60));

timestamp= (n_start:1:n_end)/(24*60*60);
timestamp= transpose(timestamp);
B= histcounts(A(:,1),size(timestamp(:,1),1));
B= transpose(B);
 


Dies ergibt eine Matrix anderer Laenge, die anzeigt, wie viele counts innerhalb der einen Sekunden schritte gezaehlt wurden. Beispielhaft wuerde das so aussehen:

B=[1 3 6 0 0 0 0 0 0 0 0 0 2]

Soweit so gut und funktioniert in gezeigtem Beispiel auch hervorragend. Mein Ziel ist jedoch, dies auf eine sehr grosse mxn Matrix anzuwenden (ein beispiel ist im Anhang zu finden), wobei ich eine Matrix der Groesse mxn wiederum als Ergebnis erhalte, die fuer jede einzelne Spalte selbiges anzeigt, wie oben im vereinfachten Beispiel gezeigt. Ich habe hier nullen und einsen in der Matrix wobei eine '1' einen count bedeutet.

Was ich versucht habe:

- multiplizieren der Spalten mit Spalte 1 (die die Zeit angibt), dann anwenden von histcounts. Wegen der vielen nullen fuehrt dies jedoch zu falschen Zahlen (26500 oder aehnliches, wobei typischerweise zwischen 1 und ~10 counts herauskommen sollten).
Mein falscher Ansatz (der mir falsche Ergebnisse liefert) ist hier zu sehen:
Code:

C= histcounts(example(:,1),size(timestamp(:,1),1));
for i=2:size(example,2)
C= [C; histcounts(example(:,i),size(timestamp(:,1),1))];

end
 


- Eine weitere Idee ist das Zusammenfassen jeder einzelnen Spalte als double matrix in einer cell matrix. Anschliessend koennte man die Zeilen mit einer null loeschen und in einer schleife histcounts auf jede einzelne double matrix anwenden um sie danach wieder in eine double matrix zu legen (da histcounts in ein sekunden schritten geht, muesste es am Ende gleich lange matrizen wieder ergeben). Das kommt mir jedoch sehr aufwendig vor was die rechenleistung angeht. Gibt es herfuer eine elegantere Loesung?

Besten Dank fuer eure Hilfe!

example.mat
 Beschreibung:

Download
 Dateiname:  example.mat
 Dateigröße:  3.07 MB
 Heruntergeladen:  206 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

mir ist noch nicht klar, was letztlich das Ergebnis sein soll.
Generell würde ich timetable empfehlen. Es ist gut möglich, dass die Problemstellung mit retime gelöst werden kann.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 20.02.2020, 02:00     Titel:
  Antworten mit Zitat      
Es handelt sich hier um Daten, die von einem Detektor erzeugt wurden. Dieser Detektor kann nicht simultan messen, das heisst: Jeder Zeitpunkt in obiger Matrix A entspricht einer Messung. Die Zahl rechts neben der Zeit (A(:,2)) stellt die gemessene Groesse der detektierten komponente dar, wobei diese Messung immer gleich ist (es gibt 256 Groessenbins, die konstant sind. Die Zahl zeigt dabei den Groessenbin an).
Misst der Detektor keine Komponente, so wird kein weiterer Datenpunkt erzeugt. Das bedeutet: Jeder Zeitpunkt in A entspricht einer Detektion, wohingegen A(:,2) die Groesse anzeigt. Der Detektor misst mit einer Zeitaufloesung im millisekundenbereich. Dementsprechend kann es Events geben, bei denen beispielsweise 10 Detektionen in einer Sekunde erfolgt sind, genau so, wie es Zeitraeume geben kann, bei denen ueber mehrere tausend sekunden gar nichts gemessen wurde, wobei der naechste Zeitschritt in A eben erst wieder die naechste Detektion zeigt.

retime kann ich problemlos (und tatsaechlich schneller als oben aufgezeigt mit histcounts) auf die beispielhafte Matrix A anwenden:

Code:

dt=datestr(A(:,1));
dt = datetime(A);
TT_A= timetable(dt,A(:,2));
A_counts= retime(TT_A,'secondly','count');

 


Meine Problemstellung geht allerdings etwas weiter: Ich moechte alle counts nach Groessenbins sortieren und anschliessend die Anzahl der counts pro sekunde pro Groessenbin ausrechnen. Das heisst im Beispiel oben:

aus A wuerde eine Matrix der Form

Code:


A=
[
time             1.62712        2.56704        3.24325     3.58876  ...    96.5793
737752.954791667   0    0    0   ... 0
737752.954803241   1    0    0   ...0
737752.954814815   0   0     1   ...0
737752.954849537       ...
737752.954861111      
737755.652986111  
737755.652986111  
737755.652986111  
737755.652986111  
737755.652997685   ]

 


Wobei die erste Zeile der Header hier ist (Groessenbin jeder Spalte und Zeit). 0 ist kein count pro Zeit, 1 entspricht einem count im jeweiligen Groessenbin. Daraus ergibt sich letztlich beispielsweise eine Matrix, wie ich sie ich in meinem Thread oben angehaengt habe.

Retime wuerde hier jetzt den Zeitvektor abwandern und die Gesamtcounts pro Sekunde zaehlen, was jedoch zu selbigem Ergebnis fuehren wuerde, wie oben bei A gezeigt. Ich moechte retime allerdings auf alle 256 Groessenbins individuell anwenden. Durch multiplikation mit dem Zeitvektor erhalte ich beispielsweise eine Matrix der Form

Code:


A=
[
time             1.62712        2.56704        3.24325     3.58876  ...    96.5793
737752.954791667   0    0    0   ... 0
737752.954803241   737752.954803241      0    0   ...0
737752.954814815   0    0    737752.954814815 ...0
737752.954849537       ...
737752.954861111      
737755.652986111  
737755.652986111  
737755.652986111  
737755.652986111  
737755.652997685   ]

 


Ich habe derzeit die Befuerchtung dass ich in jeder Spalte einzeln die Werte mit 0 loeschen muesste (in einer cell matrix? wuerde das ueberhaupt funktionieren?), dann histcounts oder retime anwenden muesste und anschliessend zurueck in eine double matrix konvertieren muesste, um retime (oder histcounts) individuell auf jede Spalte anzuwenden. Das wuerde aber da ich sehr viele dieser grossen Matrizen habe sehr viel rechenkapazitaet beanspruchen fuer eine im Grunde simple Problemstellung...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2020, 10:31     Titel:
  Antworten mit Zitat      
Hallo,

mein Eindruck ist, dass du statt 'count' bei retime eine eigene Funktion verwenden solltest, in der histc oder histcounts aufgerufen wird. Allerdings bin ich mir immer noch nicht 100% im klaren, was genau gemacht werden soll.

Insbesondere: warum würde man mit einem Zeitvektor multiplizieren wollen? Wie kommt die erste Zeile in der Matrix A zustande?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

ich denke, das Problem ist simpler zu loesen:

ich moechte im Grunde fuer eine Matrix der folgenden Form:

Code:

A= [1 2 3 4 5
0 9 8 4 3
1 3 4 7 8
77 2 15 0 9
 


Alle Zeilen aufsummieren, die nach einem bestimmten Zeitschritt in der Zeile vorkommen
und dem HEADER (erste reihe) entsprechen. Also sowas, wie:


Code:

n_start= round(min(welas_(:,1))*24*60*60);
n_end=round(max(welas_(:,1)*24*60*60));
timestamp= (n_start:1:n_end)/(24*60*60);
timestamp= transpose(timestamp);  % 1 sekune Zeitstempel

sum(A(1:timestamp,2)==A(1,1))  % erster Zeitschritt
sum(A(1:timestamp2)== A(1,1))   % zweiter Zeitschritt und so weiter bis zum letzten Zeitschritt...

sum(A(1:timestamp,3)== A(1,2)   % Zweite Spalte (und so weiter)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 20:24     Titel:
  Antworten mit Zitat      
Hallo,

ich denke, das Problem ist simpler zu loesen:

ich moechte im Grunde fuer eine Matrix der folgenden Form:

Code:

A= [1 2 3 4 5;
0 9 8 4 3;
1 3 4 7 8;
77 2 15 0 9]
 


Alle Zeilen aufsummieren, die nach einem bestimmten Zeitschritt in der Zeile vorkommen
und dem HEADER (erste reihe) entsprechen. Also sowas, wie:


Code:

n_start= round(min(welas_(:,1))*24*60*60);
n_end=round(max(welas_(:,1)*24*60*60));
timestamp= (n_start:1:n_end)/(24*60*60);
timestamp= transpose(timestamp);  % 1 sekune Zeitstempel

sum(A(1:timestamp,2)==A(1,1))  % erster Zeitschritt
sum(A(1:timestamp2)== A(1,1))   % zweiter Zeitschritt und so weiter bis zum letzten Zeitschritt...

sum(A(1:timestamp,3)== A(1,2)   % Zweite Spalte (und so weiter)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 20:41     Titel:
  Antworten mit Zitat      
im Grunde genommen suche ich so etwas (der Code funktioniert nicht):

Code:


n=1;
test=[];
for i=1:size(timestamp,1)
for j=1:size(A,1)
for n=1:size(A,2)
while timestamp(i)<A(j,1)
test(i,n)=sum(A(1,n)==A(j,n));
end
end
end
end


 
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 21:21     Titel:
  Antworten mit Zitat      
Ein Beispiel waere folgende Matrix:

Code:
A=[0.500000000000000   1   1.50000000000000   0.500000000000000;
1   2   3   4;
1.50000000000000   1   4.50000000000000   6;
2   4   1.50000000000000   8;
2.50000000000000   5   1.50000000000000   10;
3   6   1.50000000000000   12;
3.50000000000000   7   10.5000000000000   14;
4   8   12   16];
d= transpose(1:1:10);


ich wuerde hier jetzt fuer jeden Zeitschritt (d) der im Bereich des Zeitschritts (A(:,1)) liegt sehen wollen, wie viele Werte in den Spalten von A (A (i,Smile) den Werten in der ersten Reihe der jeweiligen Spalte entsprechen (A(:,j)).

Meine Loesung hierzu waere etwas, was so (oder so aehnlich) aussaehe:

Code:
test=[];
for i=1:size(d,1)
for j=1:size(A,1)
for n=1:size(A,2)
while d(i,1)<A(j,1)
test(i,n)=sum(A(1,n)==A(j,n))
i=i+1;
end
end
end
end


Leider funktioniert dieser Ansatz jedoch nicht ganz wie erhofft (das Ergebnis ergibt eine Matrix mit 3 nullen, dabei waere in obigem Fall mein Ziel, eine Matrix mit der Laenge d und der Spaltenanzahl A zu erhalten, die in jeder Zeile anzeigt, wie viele Werte pro Zeitstempel der ersten Zeile in A entsprochen haben)...
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 21:50     Titel:
  Antworten mit Zitat      
Also ich glaube, der loop geht schon in die richtige Richtung, allerdings habe ich irgendwo einen Denkfehler drin. Mit

Code:

for i=1:size(a,1)
for j=1:size(d,1)
for n=1:size(d,2)
while a(i,1)<d(j,1)
test(i,n)=sum(d(1,n)==d(j,n))
n=n+1;
if n==size(d,2)
 i=i+1;
end
end
end
end
end

 


komme ich der ganzen Sache schon etwas naeher. Allerdings ist die Art und Weise, wie ich mit i,j und n hochzaehle noch nicht korrekt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

gib doch bitte für diese einfachen Matrizen an, wie das Ergebnis genau aussehen soll. Nicht in Worten, sondern in Zahlen.
Ich verstehe nicht, warum du diese mehrfachen Schleifen verfolgst, wenn du doch gesagt hast, dass der Ansatz mit Timetables dich fast zum Ziel gebracht hat. Da ich immer noch nicht genau weiß, was du eigentlich erreichen willst, kann ich dir leider keine genauere Unterstützung geben.
Wenn du unbedingt bei den Schleifen bleiben willst, kann ich nur empfehlen, das Schritt für Schritt im Debugger durchzugehen, um die Fehler zu finden und korrigieren zu können.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 24.02.2020, 23:29     Titel:
  Antworten mit Zitat      
Hallo,

Ich bin absolut offen dafuer, die Problemstellung ohne Schleifen zu loesen (sofern dies moeglich ist).
Hier ein Zahlenbeispiel, was zeigt, was mein Ziel ist. Ich habe die Matrix "time", welche eine Zeitmatrix ist. Dazu habe ich eine Matrix A und eine Matrix "Zeit" (in obigen Kommentaren in A enthalten in Spalte 1). Die Matrix "Zeit" ist der Zeitstempel zu "A". Hinzukommend habe ich eine Matrix "Groesse" (die in oberem Beispiel in Zeile 1 in A enthalten war).
Code:

time=transpose(1:1:3);
zeit= transpose(1:0.5:3);
Groesse=[1   2   3   4   5];
A= [1     2.5     3     4.5        6
1.5        1.4      3     2.4     5
1           2     2.6      2.3    2.9
2.5        2     2.5      1.8     5
3           2      3       1.3      5
]
 


ich moechte jetzt schauen, wie oft fuer jedes Zeitintervall von "zeit", welches in "time"
liegt ein Wert in A dem Wert dazugehoerigen Wert von "Groesse" entspricht und diese Werte
fuer jedes Zeitintervall aufsummieren. Die Zeitintervalle im Beispiel sind: 1 bis 2 und 2 bis 3, wobei dies in "zeit" 1 und 1.5 (Intervall1), 2 und 2.5 (Intervall2), sowie 3 (Intevall 3) entspricht. In Spalte 1 von A suche ich nur nach den Werten, die dem
Wert 1 entsprechen, in Spalte 2 nur nach den Werten, die 2 entsprechen und so weiter (entsprechend der Matrix "Groesse").

Das Ergebnis waere folgende Matrix (B):


Code:

B=[1      0       2      0      1
1        2        0      0      1
0       1         1      0       1
]
 



Wobei B die Laenge von time hat und zaehlt, wie oft innerhalb des Zeitintervalls von time die Werte von Groesse in der jeweils dazu gehoerenden Spalte vorkommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
T = array2timetable(A - Groesse, 'RowTimes',seconds(zeit))
retime(T, 'secondly', @(x) sum(x == 0))


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 08.03.2020, 17:41     Titel:
  Antworten mit Zitat      
Hallo,

Dieser Ansatz funktioniert hervorragend. Vielen Dank!
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 - 2024 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.