2010-02-04 2 views
5

Desidero scrivere un algoritmo per finestre scorrevoli da utilizzare nel riconoscimento di attività.Algoritmo per finestra scorrevole per il riconoscimento di attività

I dati di allenamento sono < 1xN> quindi sto pensando che devo solo prendere (dire window_size=3) il window_size di dati e addestrarlo. Inoltre, desidero in seguito utilizzare questo algoritmo su una matrice .

Sono nuovo di matlab quindi ho bisogno di consigli/indicazioni su come implementarlo correttamente.

risposta

10

La risposta breve:

%# nx = length(x) 
%# nwind = window_size 
idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix(nx/nwind)-1))*nwind)-1; 

idx sarà una matrice di dimensione nwind-by-K dove K è il numero di finestre scorrevoli (cioè ogni colonna contiene gli indici di una finestra scorrevole).

Si noti che nel codice sopra riportato, se la lunghezza dell'ultima finestra è inferiore a quella desiderata, viene eliminata. Anche le finestre scorrevoli non si sovrappongono.

un esempio per illustrare:

%# lets create a sin signal 
t = linspace(0,1,200); 
x = sin(2*pi*5*t); 

%# compute indices 
nx = length(x); 
nwind = 8; 
idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix(nx/nwind)-1))*nwind)-1; 

%'# loop over sliding windows 
for k=1:size(idx,2) 
    slidingWindow = x(idx(:,k)); 
    %# do something with it .. 
end 

%# or more concisely as 
slidingWindows = x(idx); 

EDIT:

Per finestre sovrapposte, lasciare:

noverlap = number of overlapping elements 

quindi quanto sopra è semplicemente modificato in:

idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix((nx-noverlap)/(nwind-noverlap))-1))*(nwind-noverlap))-1; 


un esempio per mostrare il risultato:

>> nx = 100; nwind = 10; noverlap = 2; 
>> idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix((nx-noverlap)/(nwind-noverlap))-1))*(nwind-noverlap))-1 
idx = 
    1  9 17 25 33 41 49 57 65 73 81 89 
    2 10 18 26 34 42 50 58 66 74 82 90 
    3 11 19 27 35 43 51 59 67 75 83 91 
    4 12 20 28 36 44 52 60 68 76 84 92 
    5 13 21 29 37 45 53 61 69 77 85 93 
    6 14 22 30 38 46 54 62 70 78 86 94 
    7 15 23 31 39 47 55 63 71 79 87 95 
    8 16 24 32 40 48 56 64 72 80 88 96 
    9 17 25 33 41 49 57 65 73 81 89 97 
    10 18 26 34 42 50 58 66 74 82 90 98 
+0

@Amro grazie, questo sarà utile :) – csc

+0

@Amro Come potrei adattare questo per rendere le finestre sovrapposte? – csc

+0

sì, mi dispiace ho dimenticato: S – csc