Нахождение последовательных 00 и 11 в векторе - PullRequest
1 голос
/ 15 декабря 2011

У меня есть вектор a = 1111000011100001110000100100, и я должен вычислить два значения на его основе: p00 и p11.

p00 - это количество раз, которое 00 происходит ввектор, деленный на общее количество нулей.Например, в приведенном выше коде число раз, когда 00 встречается, равно 8/16 (общее число нулей).

Аналогично, p11 - это число вхождений 11, деленное наобщее количество единиц.

Как это можно реализовать в Matlab?

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Самый безопасный и общий способ сделать это - использовать регулярные выражения, потому что они совпадают.следующие строки:

a = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0]
n = numel(a);
p00 = sum(a(1:n-1) == 0 & a(2:n) == 0) / sum(a == 0)
p11 = sum(a(1:n-1) == 1 & a(2:n) == 1) / sum(a == 1)

Но это не даст правильного результата, потому что он считает последовательность 0 0 0 0 как 3, а не 2.

0 голосов
/ 15 декабря 2011

Предложено неверное решение !!!

Вот тот, который должен работать, но не очень эффективно (но быстрее, чем решение regexp):

d0=0; i=1; 
while i<length(a) 
    if (a(i) == 0 & a(i)==a(i+1)) d0 = d0+1; i = i+1; end; 
    i=i+1;
end
p00 = d0/sum(a == 0)
0 голосов
/ 15 декабря 2011

Я бы добавил вектор к себе, сдвинутый на один элемент вправо. Число двух с будет числом 11 с. Число 0-х будет числом 00-х. Я думаю, что это естественное решение в MATLAB.

В качестве альтернативы вы можете реализовать конечные автоматы для анализа вашего вектора.

a2  = a(2:end)+a(1:end-1);
p11 = length(find(a2 == 2))/length(find(a));
p00 = length(find(a2 == 0))/length(find(a==0));
...