устранение последовательных регионов - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно эффективно исключить последовательные области в векторе «а» или лучше в строках / столбцах матрицы «А» с длиной отдельных областей, превышающей положительное целое число N <= длина (A): </p>

См. Следующий пример:

  N = 2    % separate consecutive regions with length > 2 are zeroed
  a =      [0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1]

  a_elim = [0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1]

или 2D-кейс:

  N = 2
  A =    [1 0 1 …
          1 1 0 …
          1 1 0 …
          0 0 1 …
          1 1 1]

  % elimination over columns
  A_elim= 0 0 1 
          0 1 0
          0 1 0
          0 0 1
          1 1 1
  % elimination over rows
  A_elim= 1 0 1 
          1 1 0
          1 1 0
          0 0 1
          0 0 0

Я ищу эффективную векторизованную функцию MATLAB, выполняющую эту задачу для размера (A) ~ [100000, 1000] (болеедело столбцов).

1 Ответ

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

Вы можете использовать свертку:

Для случая 1D:

N = 2 %tolerance
A =  [0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1] 

ind = conv(A,ones(N+1,1),'same');
%ind = 1  2  2  1  1  2  3  2  1  1  2  3  3  2  2  1
%A   = 0  1  1  0  0  1  1  1  0  0  1  1  1  1  0  1
ind = conv(ind>N,ones(N+1,1),'same')>0;
%ind = 0  0  0  0  0  1  1  1  0  0  1  1  1  1  0  0
%A   = 0  1  1  0  0  1  1  1  0  0  1  1  1  1  0  1
A(ind) = 0

, если N нечетно, вам необходим дополнительный шаг:

ind = conv(A,ones(N+1,1),'same');
ind(find(ind==N+1)+1) = N+1 %the extra step
ind = conv(ind>N,ones(N+1,1),'same')>0;

Обобщение дляРазмер нд:

N = 3 %tolerance
A =  round(rand(5,5,5));
for ii = 1:ndims(A)
    conv_vec = permute(ones(N+1,1),circshift([1:ndims(A)],ii-1,2))
    ind = convn(A,conv_vec,'same')
    if mod(N,2) == 1
        ind(find(ind==N+1)+1) = N+1
    end
    ind = convn(ind>N,conv_vec,'same')>0
    X = A;
    X(ind) = 0
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...