2016-06-12 8 views
0

У меня есть вектор-столбец с номерами от 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] ';Идентифицировать и отмечать последовательные дубликаты MATLAB

картина снова начинается с одного после 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]' 

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

+3

Можете ли вы привести пример, который имеет «два или меньше» последовательных номеров, потому что тот, который вы разместили как «Imperefect_sample», совсем не соответствует результату. Разве это не делает ....? Непонятно. – Suever

+0

У образца @Suever Imperfect есть два или менее последовательных одинаковых числа от 1, 4 6 и 8. Я добавил Imperfect_sample_result. – Buzz

+0

@Buzz Почему у вас есть 5 нанов до 2? – drorco

ответ

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 
+0

Большое спасибо. Ваше решение отлично работало! – Buzz