Matlab - Ayuda con subcadenas binarias

 
Vista:

Ayuda con subcadenas binarias

Publicado por FRANCISCO (1 intervención) el 30/10/2013 00:20:07
bueno,

Yo antes tenía una secuencia binaria y mi objetivo era la creación de sub-cadenas de diferentes longitudes, por ejemplo, la longitud 4:

Secuencia

1 (1), 0 (2), 1 (3), 1 (4), 0 (5), 0 (6), 1 (7), 0 (8), 0 (9), 1 (10), 1 (11), 1 (12),

1 (13), 0 (14), 0 (15), 0 (16), 1 (17), 1 (18), 1 (19), 0 (20)

Subcadenas

01: 1 (01) 0 (02) 1 (03) 1 (04) -> [1,0,1,1],

02: 1 (01) 1 (03) 0 (05) 1 (07) -> [1,1,0,1],

03: 1 (01) 1 (04) 1 (07) 1 (10) -> [1,1,1,1],

04: 1 (01) 0 (05) 0 (09) 1 (13) -> [1,0,0,1],

05: 1 (01) 0 (06) 1 (11) 0 (16) -> [1,0,1,0],

06: 1 (01), 1 (07), 1 (13), 1 (19) -> [1,1,1,1],

07: 0 (02) 1 (03) 1 (04) 0 (05) -> [0,1,1,0],

08: 0 (02) 1 (04) 0 (06) 0 (08) -> [0,1,0,0],

09: 0 (02) 0 (05) 0 (08) 1 (11) -> [0,0,0,1],

10: 0 (02) 0 (06) 1 (10) 0 (14) -> [0,0,1,0],

11: 0 (02), 1 (07), 1 (12), 1 (17) -> [0,1,1,1],

12: 0 (02) 0 (08) 0 (14) 0 (20) -> [0,0,0,0],

13: 1 (03) 1 (04) 0 (05) 0 (06) -> [1,1,0,0],

14: 1 (03) 0 (05) 1 (07) 0 (09) -> [1,0,1,0],

15: 1 (03) 0 (06) 0 (09) 1 (12) -> [1,0,0,1],

16: 1 (03) 1 (07) 1 (11) 0 (15) -> [1,1,1,0],

17: 1 (03), 0 (08), 1 (13), 1 (18) -> [1,0,1,1],

18: 1 (04) 0 (05) 0 (06) 1 (07) -> [1,0,0,1],

19: 1 (04) 0 (06) 0 (08) 1 (10) -> [1,0,0,1],

20: 1 (04) 1 (07) 1 (10) 1 (13) -> [1,1,1,1],

21: 1 (04) 0 (08) 1 (12) 0 (16) -> [1,0,1,0],

22: 1 (04) 0 (09) 0 (14) 1 (19) -> [1,0,0,1],

23: 0 (05) 0 (06) 1 (07) 0 (08) -> [0,0,1,0],

24: 0 (05) 1 (07) 0 (09) 1 (11) -> [0,1,0,1],

25: 0 (05) 0 (08) 1 (11) 0 (14) -> [0,0,1,0],

26: 0 (05) 0 (09) 1 (13) 1 (17) -> [0,0,1,1],

27: 0 (05) 1 (10) 0 (15) 0 (20) -> [0,1,0,0],

28: 0 (06) 1 (07) 0 (08) 0 (09) -> [0,1,0,0],

29: 0 (06) 0 (08) 1 (10) 1 (12) -> [0,0,1,1],

30: 0 (06) 0 (09) 1 (12) 0 (15) -> [0,0,1,0],

31: 0 (06), 1 (10), 0 (14), 1 (18) -> [0,1,0,1],

32: 1 (07) 0 (08) 0 (09) 1 (10) -> [1,0,0,1],

33: 1 (07) 0 (09) 1 (11) 1 (13) -> [1,0,1,1],

34: 1 (07), 1 (10), 1 (13), 0 (16) -> [1,1,1,0],

35: 1 (07), 1 (11), 0 (15), 1 (19) -> [1,1,0,1],

36: 0 (08) 0 (09) 1 (10) 1 (11) -> [0,0,1,1],

37: 0 (08), 1 (10), 1 (12), 0 (14) -> [0,1,1,0],

38: 0 (08), 1 (11), 0 (14), 1 (17) -> [0,1,0,1],

39: 0 (08), 1 (12), 0 (16), 0 (20) -> [0,1,0,0],

40: 0 (09), 1 (10), 1 (11), 1 (12) -> [0,1,1,1],

41: 0 (09), 1 (11), 1 (13), 0 (15) -> [0,1,1,0],

42: 0 (09), 1 (12), 0 (15), 1 (18) -> [0,1,0,1],

43: 1 (10), 1 (11), 1 (12), 1 (13) -> [1,1,1,1],

44: 1 (10), 1 (12), 0 (14), 0 (16) -> [1,1,0,0],

45: 1 (10), 1 (13), 0 (16), 1 (19) -> [1,1,0,1],

46: 1 (11), 1 (12), 1 (13), 0 (14) -> [1,1,1,0],

47: 1 (11), 1 (13), 0 (15), 1 (17) -> [1,1,0,1],

48: 1 (11), 0 (14), 1 (17), 0 (20) -> [1,0,1,0],

49: 1 (12), 1 (13), 0 (14), 0 (15) -> [1,1,0,0],

50: 1 (12), 0 (14), 0 (16), 1 (18) -> [1,0,0,1],

51: 1 (13), 0 (14), 0 (15), 0 (16) -> [1,0,0,0],

52: 1 (13), 0 (15), 1 (17), 1 (19) -> [1,0,1,1],

53: 0 (14), 0 (15), 0 (16), 1 (17) -> [0,0,0,1],

54: 0 (14), 0 (16), 1 (18), 0 (20) -> [0,0,1,0],

55: 0 (15), 0 (16), 1 (17), 1 (18) -> [0,0,1,1],

56: 0 (16), 1 (17), 1 (18), 1 (19) -> [0,1,1,1],

57: 1 (17), 1 (18), 1 (19), 0 (20) -> [1,1,1,0],

con el siguiente código

N = 20;

n = 4;

A = hankel(1:N-n+1,N-n+1:N);

k = 0:n-1;

c = ceil((N - A(:,end) + 1)/k(end));

i2 = cumsum(c);

i1 = i2 - c + 1;

idx = zeros(i2(end),n);

for jj = 1:N-n+1

idx(i1(jj):i2(jj),:) = bsxfun(@plus,A(jj,:),(0:c(jj)-1)'*k);
end

[j1,j2,j2] = unique(s(idx),'rows')

out = [j1, histc(j2,1:max(j2))/i2(end)];

y al final obtener un recuento de las veces que se repite cada patrón y su frecuencia relativa:

0 0 0 0 ------ 161.697 - 0,0606515378844711

0 0 0 1 ------ 163.593 - 0,0613627156789197

0 0 1 0 ------ 164.201 - 0,0615907726931733

0 0 1 1 ------ 166.680 - 0,0625206301575394

0 1 0 0 ------ 164.105 - 0,0615547636909227

0 1 0 1 ------ 166.501 - 0,0624534883720930

0 1 1 0 ------ 167.099 - 0,0626777944486122

0 1 1 1 ------ 168 835 - 0,0633289572393098

1 0 0 0 ------ 164.086 - 0,0615476369092273

1 0 0 1 ------ 166.963 - 0,0626267816954239

1 0 1 0 ------ 166.931 - 0,0626147786946737

1 0 1 1 ------ 169 470 - 0,0635671417854464

1 1 0 0 ------ 166.622 - 0,0624988747186797

1 1 0 1 ------ 169.326 - 0,0635131282820705

1 1 1 0 ------ 169 251 - 0,0634849962490623

1 1 1 1 ------ 170 640 - 0,0640060015003751

El problema que se plantea es que cuando procesaba esta manera sólo procesa unos 4.000 datos y la necesidad de procesar muchos más. Tengo 4 GB de RAM y Matlab 2012. Lo que pensé es: Asignar a cada cliente un entero:

0 0 0 0------ 1

0 0 0 1-------2

0 0 1 0-------3

0 0 1 1-------4

0 1 0 0-------5

0 1 0 1-------6

0 1 1 0-------7

0 1 1 1-------8

1 0 0 0-------9

1 0 0 1-------10

1 0 1 0-------11

1 0 1 1-------12

1 1 0 0-------13

1 1 0 1-------14

1 1 1 0-------15

1 1 1 1-------16

y se establece como un contador para asignar el número de veces que se repite ese entero. De esta manera, tal vez conseguir muchas procesamiento de datos.
¿Como podria realizar esto y que mi ordenador fuera capaz de hacer el recuento? Sólo necesito el recuento, las subcadenas generadas no es necesario almacenarlas pero el patron y el numero de veces que se ha repetido ese patron si es necesario almacenarla.
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder