Câu trả lời ngắn:
%# nx = length(x)
%# nwind = window_size
idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix(nx/nwind)-1))*nwind)-1;
idx
sẽ là một ma trận kích thước nwind-by-K nơi K là số trượt cửa sổ (tức là mỗi cột chứa các chỉ số của một cửa sổ trượt).
Lưu ý rằng trong đoạn mã ở trên, nếu chiều dài của cửa sổ cuối cùng nhỏ hơn độ dài mong muốn, nó sẽ bị loại bỏ. Ngoài ra các cửa sổ trượt không chồng chéo.
Một ví dụ để minh họa:
%# 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:
Đối chồng chéo cửa sổ, chúng ta hãy:
noverlap = number of overlapping elements
sau đó ở trên chỉ đơn giản là thay đổi để:
idx = bsxfun(@plus, (1:nwind)', 1+(0:(fix((nx-noverlap)/(nwind-noverlap))-1))*(nwind-noverlap))-1;
Một ví dụ để hiển thị các kết quả:
>> 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 nhờ, điều này sẽ có ích :) – csc
@Amro thế nào tôi sẽ điều chỉnh này để làm cho các cửa sổ chồng chéo? – csc
vâng, xin lỗi tôi đã quên: S – csc