Предполагается, что
- Каждая запись заменяется одним из ее исходных соседей, независимо от того, что происходит с другими записями.
- Каждый сосед имеет та же вероятность выбора.
- Соседство определяется циклически . Так, например, в первом столбце «левый» сосед принадлежит последнему столбцу.
Код для удобства строит циклически расширенную матрицу, а затем использует линейное индексирование для (случайного) выбора соседи.
x = [10 20 30 40; 50 60 70 80; 90 100 110 120]; % example data
x_ext = x([end 1:end 1], [end 1:end 1]); % cyclically extended matrix
ind = bsxfun(@plus, (2:size(x,1)+1).', (1:size(x,2))*(size(x,1)+2)); % linear indices
% of the original matrix in the extended matrix
delta = [-1 1 -size(x_ext,1) size(x_ext,1)]; % possible displacements for neighbours,
% as linear indices
r = delta(randi(4, size(x))); % generate random displacements
result = x_ext(ind + r); % pick neighbours in extended matrix
Пример:
>> x
x =
10 20 30 40
50 60 70 80
90 100 110 120
>> result
result =
20 30 70 30
90 100 60 120
50 110 70 40