2017-02-16 2 views
3

У меня есть ячейка 1x2A в Matlab. A{i} - ячейка размера 30494866x1 для i=1,2. A{i}(j) - 1x21 char для i=1,2 и j=1,...,30494866.Частота подсчета в ячейке char в Matlab: быстрый код?

Например я сообщаю здесь A{2}(1:3)

'116374117927631468606' 
'112188647432305746617' 
'116374117927631468606' 

Я хочу, чтобы подсчитать, сколько раз повторяется каждый 1x21 символ в A{2}. Например, только с учетом A{2}(1:3), я хочу, чтобы получить

'116374117927631468606' 2 
'112188647432305746617' 1 

Что я делаю в данный момент

a=unique(A{2},'stable'); 
b=cellfun(@(x) sum(ismember(A{2},x)),a); 

Однако это невероятно медленно (работает со вчерашнего дня). Есть ли у вас какие-либо предложения о том, как я могу ускорить код?

+0

Так вы хотите знать, сколько раз 1 используется, сколько раз 2 и т. д. У вас только 0-9? – smttsp

+1

Или вам нужна частота 21-символьных строк? – smttsp

+0

Второй. Я уточнил свой вопрос, спасибо – user3285148

ответ

2

Поскольку вы хотите знать, сколько раз используется каждая строка 21-символ:

1) sort the cell 
2) count how many times each string is used in a for loop. 

Ваш код O (N^2), так что это очень медленно. Это займет меньше минуты.

на основе кода

B=sort(A{2}); 
U=sort(unique(B)); 
C=zeros(numel(U),1); 
cnt = 1; 
for j=1:numel(B) 
    if strcmp(U(cnt),B(j))==1 
     C(cnt)=C(cnt)+1; 
    else 
     cnt = cnt +1; 
     if cnt <= numel(U) 
      C(cnt) = C(cnt)+1; 
     end 
    end 
end 
+0

ОК, спасибо. Что-то вроде этого? 'B = рода (А {2}); U = уникальный (B); C = нули (число (U), 1); для i = 1: numel (U) для j = 1: numel (A {2}) , если strcmp (U (i), A {2} (j)) == 1 C (i) = C (я) + 1; конец конец конец' – user3285148

+0

Да, точно. Сколько времени это занимает? Также вы можете протестировать меньший набор, такой как размер A {2} = 5 – smttsp

+0

Зачем мне нужно делать 'sort'? – user3285148

2

Вы можете сделать это с помощью стандартной unique - accumarray пара:

data = {'116374117927631468606' 
     '112188647432305746617' 
     '116374117927631468606'}; 
[uu, ~, ww] = unique(data, 'stable'); 
count = accumarray(ww, 1); 
result = [uu, num2cell(count)]; 

Или, немного больше памяти эффективным:

data = {'116374117927631468606' 
     '112188647432305746617' 
     '116374117927631468606'}; 
[~, vv, ww] = unique(data, 'stable'); 
count = accumarray(ww, 1); 
result = [data(vv) num2cell(count)]; 
Смежные вопросы