2017-02-02 4 views
0

Ich habe eine große Datenmenge (es kann Tausende und Zehntausende von Werten sein). Diese Daten sind ein Ergebnis in einem Array gesammelt Experimente:Divide Daten-Array in effizienter Weise Matlab

data = [2.204000000000000 
    2.202000000000000 
    2.206000000000000 
    2.201000000000000 
    ... 
    ] 

Und ich habe Zeit Array t der gleichen Größe:

t = [1 2 3 ... 65 66 1 2 3 4 ... 72 73 1 2 3 ... 75]'; 

Diese t ist eine Zeit, die Daten erfasst wurden. So t = 1:66 - ist ein erster Versuch, und dann t Werte beginnt wieder von 1 - es ist, Daten von 2 Experiment und etc. Was ich tun möchte: divide Daten durch die spezifischen Zeitintervallen:

t<=1 
1<t<=4 
4<t<=6 
t>6 

Ich gehe Auf diese Weise

part1 = []; part2 = []; part3 = []; part4 = []; 
for ii = 1: size(data,1) 
    if (t(ii)) <=1  % collect all data corresponds to t<=1 
     part1 = [part1; ii]; 
    elseif (t(ii) >1 && t(ii) <=4) 
     part2 = [part2; ii]; 
    elseif (t(ii) >4 && t(ii) <=6) 
     part3 = [part3; ii]; 
    else 
     part4 = [part4; ii]; 
    end 
end 
data1 = data(part1); 
data2 = data(part2); 
data3 = data(part3); 
data4 = data(part4); 

das funktioniert perfekt, aber es ist langsam, weil:

  1. ich nicht part1 part2 part3 part4 preallocate kann - Ich kenne ihre Größen nicht;
  2. Verwenden Sie for Schleife.

Können wir es eleganter und schneller machen?


Jetzt habe ich eine Idee, ein Zellenarray anstelle von 4 verschiedenen zu verwenden. Jetzt verwende ich part{1} part{2} ... part{4}. So kann ich es als part = cell(4,1);

Antwort

3

vorallokieren. Sie können Ihren Code mit logische Indizierung verbessern.

ich empfehlen Ihnen dringend, die folgenden Hinweise zu lesen:


Der folgende Code verwendet die logische Indizierung, um das zu tun, was Sie wollen, ohne irgendeine Schleife und somit ohne die Notwendigkeit, irgendwelche Arrays vorher zuzuweisen:

data1 = data(t <= 1); 
data2 = data((t > 1) && (t <= 4)); 
data3 = data((t > 4) && (t <= 6)); 
data4 = data(t > 6); 

Logische Indizierung ist wie eine Ampel: Es sind die Elemente eines Arrays ermöglicht, die einen Wert von 1 haben fortzusetzen, während jene Elemente zu stoppen, die einen Wert von 0 haben.

Matlab ist sehr mächtig in dieser Art von Aufgaben.

+0

Ahhh wirklich, ich denke nur darüber nach :) einfache Lösung! All mein Missverständnis lag daran, dass ich überall Zellenzellen benutze (die nur zur besseren Lesbarkeit durch numerische Arrays ersetzt wurden). Also das 't {1,1} (1: ende)' und etc. nur meine Augen und ich kann das nicht sehen :) Danke! –

+1

@Mikhail_Sam Vielen Dank, dass Sie sich die Zeit genommen haben, eine vereinfachte Version Ihres Codes zur Verfügung zu stellen. Ja, wie Sie erwähnen, ist es bei numerischen Arrays etwas weniger verschleiert als bei Zellen-Arrays, aber es funktioniert gut bei beiden. Ich habe meine Antwort mit interessanteren Links aktualisiert, die Sie vielleicht hilfreich finden. Prost! – codeaviator