Выбор элементов из большой матрицы с помощью скользящего окна - PullRequest
0 голосов
/ 04 сентября 2018

У меня матрица 220 * 366, я хочу установить 3 * 3 окна для выбора элементов в матрице. Пример:

matrix = [1, 2, 3, 4, 5;
          6, 7, 8, 9, 10;
          11,12,13,14,15];
window = [1, 2, 3;
          6, 7, 8;
          11,12,13];

1 Ответ

0 голосов
/ 20 сентября 2018

Если у вас есть набор инструментов для обработки изображений, это можно сделать с помощью nlfilter:

function out = q52158450()
% Create a matrix:
Rm = 220; Cm = 366;
matrix = randn(Rm,Cm);

% Define the window and apply filter:
Rw = 6; Rc = 6;
windows = nlfilter(matrix, [Rw, Rc], @getwindow);

% Select subset of outputs, removing zero-padded boundary elements:
Bw = floor((Rw-1)/2); Bc = floor((Rc-1)/2); 
out = windows(Bw:end-Bw, Bc:end-Bc); % < Output is a cell

function out = getwindow(in)
out = {in};

В противном случае это можно сделать с помощью двойного цикла:

function out = q52158450()
% Create a matrix:
Rm = 220; Cm = 366;
matrix = randn(Rm,Cm);

% Define the window and apply filter:
Wr = 3; Wc = 3;
Br = ceil(Wr/2); Bc = ceil(Wc/2);
out = cell(Rm-Br, Cm-Bc);

for indR = 1:Rm-Wr+1
  for indC = 1:Cm-Wc+1    
    out{indR, indC} = matrix(indR:indR + Wr - 1, indC:indC + Wc - 1);
  end
end
...