найти соседей на расстоянии d в матрице + матрица - PullRequest
0 голосов
/ 09 марта 2012

Я хочу, чтобы все соседи координат точки в матрице находились на расстоянии d от нее вместе с этой точкой.

Какой самый эффективный способ создания такой подматрицы?

Например, если A = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 ,8 ,9]

, тогда для d = 0 and data 5 я получу ответ как 5, но для d = 1 я получу матрицу A в результате, поскольку размер самого A равен 3X3.

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

, поэтому для data point 2 and d = 1 ответ будет [ 0 , 0 , 0 ; 1 , 2 ,3 ; 4 , 5 , 6]

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 09 марта 2012

Чтобы начать с случая, когда вы находитесь внутри A, вместо того, чтобы давать d=0 и data_point=5, вы должны дать data_point=[2,2].Если вам дано значение 5, вы можете преобразовать

ij = [ceil(data_point/size(A,1)), rem(data_point-1, size(A,1))+1]

или использовать поиск, как в ответе Хай, в зависимости от того, как интерпретировать ваш вопрос.

Следующая функция

function B = find_neigh(A,ij,d)
imin = max(ij(1)-d,1);
imax = min(ij(1)+d,size(A,1));
jmin = max(ij(2)-d,1);
jmax = min(ij(2)+d,size(A,2));
B = zeros(2*d+1,2*d+1);
r1 = max(2-ij(1)+d,1);
c1 = max(2-ij(2)+d,1);
B(r1:r1+imax-imin, c1:c1+jmax-jmin) = A(imin:imax,jmin:jmax);

должен вернуть вам желаемый результат.Назовите его, например, с помощью

A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
find_neigh(A,[1,2],1)

Редактировать: исправлено два, нет трех ошибок, и сделано это функцией

0 голосов
/ 09 марта 2012

Попробуйте это ...

A = padarray( A , [d d] )
% assuming the data is at r row and c col do the following

A( r : r + 2d , c : c + 2 d )

Я надеюсь, что это работает ... действительно не проверял !!

0 голосов
/ 09 марта 2012

Вот решение.Я оставлю вас, чтобы превратить это в функцию.Пусть n обозначает значение в центре вашего подмассива, которое в вашем примере равно 5.

z = zeros(size(A,1)+2*d,size(A,2)+2*d);
z(d+1:d+size(A,1),d+1:d+size(A,2)) = A;
[r,c] = find(z==n);
z(r-d:r+d,c-d:c+d)

РЕДАКТИРОВАТЬ

Попробуйте эту версию, который так же неадекватно проверен, как и моя более ранняя попытка.Это все равно не справится, если выражение find возвращает несколько местоположений.

И я все еще не даю никаких гарантий относительно эффективности этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...