2015-08-17 8 views
0

Я следующий вектором A:Найти средние точки позиции длительность уравнивает в пределах массива в Matlab

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204]; 

Для n = 2, я подсчитывал элементы больше или равно 15 в пределах A:

D = cellfun(@numel, regexp(char((A>=15)+'0'), [repmat('0',1,n) '+'], 'split')); 

Вышеприведенное выражение дает следующие значения продолжительности:

D = [3 2 7 4 6] = [A(1:3) **stop** A(7:8) **stop** A(12:18) **stop** A(22:25) **stop** A(28:33)]; 

Вышеуказанный алгоритм вычисляет значения продолжительности путем подсчета элементов, больших или равных 15. В подсчете также учитывается менее двух последовательных элементов, меньших 15 (n = 2) в течение каждого события продолжительности. Счетчик останавливается, когда есть два или более последовательных элемента, меньших 15, и начинается с следующей подстроки в пределах A.

Решение, предлагаемое здесь Find median position points of duration events присваивает последний номер в пределах строки 2 или более последовательных чисел меньших, чем 15 (3 в данном случае) после того, как A(1:3) к следующему подстроки A(7:8) и то же самое с другими подстроки, которая не является правильный способ вычисления событий продолжительности.

Я хочу способ найти срединные точки позиции длительности событий A(1:3), A(7:8), A(12:18), A(22:25) и A(28:33), которые правильно вычисленных. Результат должен выглядеть следующим образом:

a1 = round(median(A(1:3))) = 2; 
a2 = round(median(A(7:8))) = 8; 
a3 = round(median(A(12:18))) = 15; 
a4 = round(median(A(22:25))) = 24; 
a5 = round(median(A(28:33))) = 31; 
+0

вы можете объяснить, почему круглые (медиана (A (1: 3))) = 2? вам нужна только медиана индекса? – GameOfThrows

+0

@Bowecho - ответы на вопросы не так, как это работает здесь. В худшем случае модераторы предпримут действия. Что вы должны сделать: уточните свой первый вопрос и добавьте как можно больше деталей, а затем предложите щедрость. Таким образом, ваш вопрос получает полное внимание в течение недели, и вы обязательно получите ответ. – thewaywewalk

+0

@thewaywewalk Я тоже попытаюсь это сделать. – Bowecho

ответ

0

Это мое решение, это может быть глупо (использовать время цикла ...), но в основном решает эту проблему.

Процесс состоит в том, чтобы сначала добавить каждые 2 последовательных целых числа, если их сумма меньше 30, тогда должно быть 2 или более целых числа менее 15 между ними. Если сумма больше 30, между 1 и 0 целыми числами должно быть меньше 15. -NOTE: Это верно только тогда, когда у вас есть положительные числа, если присутствуют негативы, чем это решение неверно!

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204]; 
A1 = A(1:end-1); 
A2 = A(2:end); 
B = A1+A2; 
C = find(B<30); 
Cmod = [1,C,size(A,2)]; 
counter = 1; 
j = 1; 

while counter < size(Cmod,2) 
    temp = Cmod(:,counter):Cmod(:,counter+1)-1; 
    if size(temp,2) < 2 
     counter=counter+1; 
    else 
     a(j) = round(median(temp(3:end))); 
     counter = counter+1; 
     j=j+1; 
    end 
end 
a(1) = a(1)-1; %this compensate the position shift in A1 and A2 
a(end) = a(end)+1; 

выход вектор а, который гласит:

a = 

>>2  8 15 24 31 
+0

Спасибо за ваш ответ. Я хочу обобщить решение, что означает, что я хочу легко изменить количество последовательных элементов меньше 15, которые идут между ними. – Bowecho

+0

Так что я не уверен, как я мог бы обобщить ваше решение. – Bowecho

+0

@Bowecho Решение работает только для двух последовательных элементов, так как вы не указали, что вам нужно общее решение, это решение довольно эффективно (за исключением цикла while). – GameOfThrows