найти последовательные 0 в векторе и заменить его на 1 в matlab - PullRequest
1 голос
/ 22 ноября 2011

У меня есть вектор 1x1000, состоящий из 1 и 0. Я хотел бы найти четыре последовательных 0 в векторе и заменить его комбинацией 0 и 1 (например, 1101, 111, 1010 - любая комбинация двоичных значений от 1 до 15), но я не должен заменять или влиять на уже существующие 1 в векторе.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

вы можете использовать STRFIND , чтобы найти расположение всех четырех последовательных нулей

%# binary row-vector
x = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0];

%# starting locations of four-consecutive zeros
idx = strfind(x, [0 0 0 0]);

%# random binary numbers (rows) used to replace the consecutive zeros
n = dec2bin(randi([1 15],[numel(idx) 1]),4) - '0';

%# linear indices corresponding to the consecutive-zeros
idx = bsxfun(@plus, idx', (0:3));

%'# replace the 4-zeros
xx = x;
xx(idx(:)) = n(:);

Результат:

>> x
x =
     1     0     0     0     0     1     0     0     0     0     1     0     0     0     0
           \_______1st_______/

>> xx
xx =
     1     1     0     1     0     1     1     1     1     0     1     1     0     1     1
           \_______1st_______/

>> n
n =
     1     0     1     0      <-- 1st consecutive four-zeros replaced by this
     1     1     1     0      <-- 2nd
     1     0     1     1          etc...

Обратите внимание, что если начальный вектор x содержит последовательные нули длиной более 4, strfind вернет несколько местоположений в этой более длинной последовательности. Поэтому потребуется дополнительная обработка в зависимости от того, как вы хотите выбрать 4 из более длинной последовательности (первое появление, последнее возникновение и т. Д.)

2 голосов
/ 22 ноября 2011

Быстрое представление, прокручивая окно, смотря на каждый 4-элементный блок и проверяя массив нулей.

%calling your vector "A" here
searchlen= 4 - 1; %remove 1 so when adding to index, takes correct # elements
zarray= zeros(1,searchlen+1);
for i=1:(length(A)-searchlen)
  if(isequal(A(i:i+searchlen),zarray))
    A(i:i+searchlen) = [1 0 0 1]; %replace with your code
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...