Matlab - Как найти соседние элементы числа в матрице? - PullRequest
0 голосов
/ 27 сентября 2018

Например, если у меня есть матрица:

A=[1 2 3 4; 5 6 7 8; 9 10 11 12]

и если я выберу число 6, то она должна вернуть матрицу:

B=[1 2 3; 5 6 7; 9 10 11]

Ответы [ 2 ]

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

Реализация ответа Гуцчи как функции с большей гибкостью:

function mat_out = surround(mat_in, number, dis)
  %mat_in: input matrix containing number
  %number: number around which to build the output matrix
  %dis: distance around searched number to crop in_matrix
  %If dis is such that you would need to access values outside
  %matrix, you will end up getting a non square matrix.

  %find first position containing number in matrix:
  [i, j] = find(mat_in==number, 1); 

  [len_row, len_col] = size(mat_in);

  %make sure that I'm not accessing elements outside matrix
  col = max((j-dis), 1):min((j+dis), len_col);
  row = max((i-dis), 1):min((i+dis), len_col);

  mat_out =  mat_in(row, col);

, тогда, чтобы получить то, что вам нужно, вы должны сделать

B = surround(A, 6, 1)

, чтобы получить матрицу 3x3, содержащуюся вА, который имеет 6 в центре.В этой реализации вы также можете получить матрицу 5x5 (если A больше) с той же характеристикой, используя переменную dis.Чтобы избежать коллизий, я написал это так, что вы найдете первое вхождение number, но вы можете изменить его.

Обратите внимание, что если number меньше, чем dis чисел от концаматрица, как и число 2 в вашем A, вы получите максимально возможную матрицу:

C = surround(A, 2, 1);

у вас будет

C = [1, 2, 3; 5, 6, 7]

Вы можете изменить код для заполнения с помощьюнули или что угодно, чтобы вы получили

C = [0, 0, 0; 1, 2, 3; 5, 6, 7]
0 голосов
/ 27 сентября 2018

Вот, пожалуйста:

    A = [1 2 3 4; 5 6 7 8; 9 10 11 12];

    num=6;

    [i,j]=find(A==num);
    [len_row,len_col]=size(A);

    cols=(j-1):(j+1);
    cols(cols<1)=[]; %to avoid trying to access values outside matrix
    cols(cols>len_col); %to avoid trying to access values outside matrix

    row=(i-1):(i+1);
    row(row<1)=[]; %to avoid trying to access values outside matrix
    row(row>len_row)=[]; %to avoid trying to access values outside matrix

    new_mat=A(row,cols);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...