Ramdomly заменить каждую запись одним из четырех своих соседей - PullRequest
2 голосов
/ 09 января 2020

Я перебираю массив 100x100 и выбираю каждый раз четыре соседа (один слева от центрального узла, один вверху, один справа и один внизу), как на рисунке ниже

matrix with red as center node and blue as neighbours

красный - это центральный узел, а синие - это соседи. Я изо всех сил пытаюсь найти в MATLAB удобный способ случайного выбора одного из соседей.

1 Ответ

3 голосов
/ 09 января 2020

Предполагается, что

  • Каждая запись заменяется одним из ее исходных соседей, независимо от того, что происходит с другими записями.
  • Каждый сосед имеет та же вероятность выбора.
  • Соседство определяется циклически . Так, например, в первом столбце «левый» сосед принадлежит последнему столбцу.

Код для удобства строит циклически расширенную матрицу, а затем использует линейное индексирование для (случайного) выбора соседи.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...