2010-02-04 16 views
5

Quiero escribir un algoritmo de ventana deslizante para usar en reconocimiento de actividad.Algoritmo de ventana deslizante para reconocimiento de actividad

Los datos de entrenamiento es < 1xN> así que estoy pensando que sólo tiene que tomar (por ejemplo window_size=3) la window_size de los datos y formar a eso. También más tarde quiero utilizar este algoritmo en una matriz .

Soy nuevo en matlab, así que necesito consejos/instrucciones sobre cómo implementar esto correctamente.

Respuesta

10

La respuesta corta:

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

idx habrá una matriz de tamaño nwind-por-K donde K es el número de ventanas de deslizamiento (es decir, cada columna contiene los índices de una ventana deslizante)

Tenga en cuenta que en el código anterior, si la longitud de la última ventana es menor que la deseada, se descarta. Además, las ventanas correderas no se solapan.

un ejemplo para ilustrar:

%# 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:

Para ventanas superpuestas, dejar que:

noverlap = number of overlapping elements 

, lo anteriormente expuesto se cambia simplemente a:

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


un ejemplo para mostrar el resultado:

>> 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 gracias, esto será útil :) – csc

+0

@Amro ¿cómo puedo adaptar esto para hacer las ventanas superpuestas? – csc

+0

sí, lo siento, olvidé: S – csc

Cuestiones relacionadas