2012-04-11 6 views
1

Допустим, у меня есть двоичный вектор длины N, и я ищу для частоты каждого из следующих 16 последовательностей в этом векторе:Подсчет частоты последовательности в векторе

0000, 0001, 0010, 0011, ..., 1111 

Что такое самый простой способ подсчитать эту частоту каждой из этих последовательностей в векторе? В идеале, я хотел бы знать, как это сделать в MatLab.

+1

В какой форме у вас есть бинарный вектор? Являются ли эти строки? Является ли это массивом ячеек? – Jonas

+0

Бинарный вектор находится в 'vector' форме в MatLab, поэтому он выглядит как' [0 0 1 1 0 1 0 ...] '. – jamaicanworm

+0

Вы заботитесь о размере окна в данных? Например, предположим, что 'vector = [0 0 0 0 1]'. В вашей проблеме этот вектор «содержит» 1 появление «0000» и одно появление «0001», хотя они перекрываются ...или вы скажете, что он содержит только первый? – ely

ответ

1

Это числа от 0x0 до 0xF, просто ++ их как индексы в массив размером 0xF. Элементы массива Sum и A [i]/N - ваша частота.

0

Если a держит ваши данные:

c = [] 
for el = a, 
    c = [c, sum(a==el)]; 
end 

Это квадратичное, но будет иметь счетчики на один и те же показатели, как a. Это также сработает, если вы заранее не знаете диапазон.

+1

Я не уверен, что это делает, но он не отвечает на этот вопрос. – jamaicanworm

+0

Если a имеет значения удержания, c будет для каждого из значений общее число вхождений. Но, возможно, я неверно истолковал этот вопрос. – benroth

2

Простым способом решения этого является преобразование двоичных чисел в десятичные числа, а затем используйте hist или accumarray для подсчета входов. Я начинаю с преобразования массива в массив (N-3) -by-4, который позволяет векторизовать все вычисления.

%# make up some test data 
data = [0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1]; 

%# reshape into a (N-3)-by-4 array 
%# idx is [1 2 3 4;2 3 4 5;...] 
idx = bsxfun(@plus,(1:length(data)-3)',0:3); %'# 
data = data(idx); 

%# convert binary numbers to decimals 
%# use matrix multiplication 
decData = data * [8;4;2;1]; 

%# count number of occurences - possible values are 0 through 15 
counts = hist(decData,0:15); 

counts(1) подсчитывает число раз последовательность 0 0 0 0 появился в списке.

+0

Это не учитывает возможное перекрытие последовательностей, которые указывает OP для этой проблемы в комментариях. – ely

+1

@EMS: да, это требование было добавлено после того, как я опубликовал – Jonas

+1

@jamaicaworm: Я обновил свое решение, чтобы учитывались перекрывающиеся последовательности. – Jonas

1
count = zeros(1,16); 
vector = [1 0 0 1 1 1 1 0 0]; 
N = length(vector); 

for ii = 1:(N-3) 
    cur_seq = vector(ii:ii+3);  % Grab the running set of four entries 
    cur_num = cur_seq*[8; 4; 2; 1]; % Convert these entries to non-binary. 

    % Update the count of the sequence that has cur_num 
    % as its non-binary integer representation. Note that 
    % you must use cur_num+1 as the index since Matlab is 
    % 1-based, but the integers from your sequences are 0 
    % through 15. 

    count(cur_num+1) = count(cur_num+1) + 1; 
end 

Теперь count(1) подсчитывает вхождения [0,0,0,0] и count(2) подсчитывает вхождения [0,0,0,1] и так далее.

1

Пусть данные и блок длина определяется как

x = [ 1 0 1 0 0 0 0 0 1 1]; 
M = 4; 

Тогда результат может быть получен с одной строки следующим образом:

result = histc(conv(x, 2.^(0:M-1), 'valid'), 0:2^M-1); 

В этом примере

result = 
    2 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 

Значение было 2 ocurrments of [0 0 0 0], 1 появление [0 0 0 1] и т.д.

Как это работает:

  1. вычисления свертки (используя conv) с полномочиями 2, чтобы найти десятичное представление каждого скользящего длина- M двоичного числа.
  2. Учитывать количество каждого числа, полученного на этапе 1 (с использованием histc).
Смежные вопросы