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
@Amro gracias, esto será útil :) – csc
@Amro ¿cómo puedo adaptar esto para hacer las ventanas superpuestas? – csc
sí, lo siento, olvidé: S – csc