Идентифицируйте и помечайте последовательные дубликаты MATLAB

У меня есть вектор-столбец с числами от 1 до 8. В нормальных условиях есть 4 последовательных значения каждого числа, перемещающиеся от 1 до 8, т.е. Perfect_sample=[1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8]';

Шаблон начинается снова с единицы после 8.

Однако иногда бывают пропущенные значения и вектор выглядит не так, как показано выше, а, например, вот так:

Imperefect_sample=[1 1 2 2 2 3 3 3 3 4 5 5 5 5 6 7 7 7 7 8 8]';

Моя цель — заменить первые два значения каждого последовательного набора одинаковых чисел на NaN:

Perfect_sample_result=[NaN NaN 1 1 NaN NaN 2 2 NaN NaN 3 3 NaN NaN 4 4 NaN NaN 5 5 NaN NaN 6 6 NaN NaN 7 7 NaN NaN 8 8]'

Если имеется только два или менее последовательных одинаковых числа, то эти числа следует заменить на NaN.

 Imperfect_sample_result=[NaN NaN NaN NaN NaN NaN 2 2 NaN NaN 3 3 NaN NaN NaN NaN NaN NaN 5 5 NaN NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN]'

Как я могу этого добиться?


person Buzz    schedule 12.06.2016    source источник
comment
Можете ли вы привести пример с двумя или менее последовательными числами, потому что тот, который вы разместили как Imperefect_sample, вообще не соответствует результату. Разве что....? Это неясно.   -  person Suever    schedule 12.06.2016
comment
Образец @Suever Imperfect имеет два или менее последовательных одинаковых числа из 1, 4, 6 и 8. Я добавил Imperfect_sample_result.   -  person Buzz    schedule 12.06.2016
comment
@Buzz, почему у тебя 5 баб перед 2?   -  person ibezito    schedule 12.06.2016
comment
Всегда ли вам гарантировано наличие хотя бы 1 вхождения каждого числа?   -  person Suever    schedule 12.06.2016
comment
@suever, вы должны добавить текстовый файл или что-то еще с примером данных, с которыми вы будете работать, это поможет   -  person jerpint    schedule 12.06.2016
comment
Исходные данные содержат более 60000 строк, поэтому я не смог их загрузить.   -  person Buzz    schedule 13.06.2016


Ответы (1)


насколько я понял, это сработает. Имейте в виду, что он не рассматривает вхождения больше 4, поскольку вы не упомянули, что это возможно. Это основано на том, что я понял из вашего исходного сообщения.

clc
clear
Imp=[1 1 2 2 2 3 3 3 3 4 5 5 5 5 6 7 7 7 7 8 8];
perf = Imp;
pos = 1; % position of your cursor
while(pos<max(size(perf))-2) % -2 to avoid going out of range
next = true; %check if it should go further
count = 0; % will store number of consecutive times the iith number appears

    while(next == true) %checks if the next digit in the sequence is the same
        if(perf(pos) == perf(pos+count))
            count = count+1;
        else
            next = false;
        end

    end


 if (count == 1)
     perf(pos) = NaN;
 elseif( count == 2)
     perf(pos:pos+1) = NaN;
 elseif(count == 3)
      perf(pos:pos+2)= NaN;
 elseif(count == 4)
      perf(pos:pos+1)= NaN;
  end

 pos = min(pos+ count,max(size(perf))); % passes the counter to the next value
end
person jerpint    schedule 12.06.2016