Matlab - Sustituir código (for, if) para más rapidez

 
Vista:
sin imagen de perfil

Sustituir código (for, if) para más rapidez

Publicado por David (42 intervenciones) el 06/01/2013 09:18:09
Tengo un código como el que muestro al final. Necesito sacar datos para hacer 10000 aleatorizaciones, pero si pongo como prueba el número de aleatorizaciones igual a 2 el tiempo que tarda en realizarse es de cerca de 4 minutos, por lo que las 10000 aleatorizaciones tardarían 20000 minutos (333 horas).
¿Cómo podrían sustituirse los bubles for y/o if para que se pudiese realizar en menos tiempo?

Gracias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
subject=217;
indice=93744;
aleat=10000;
for a=1:aleat
    for v=1:subject
        for (i=1:indice)
            if (xlsmat(i).Subject==v)
                if ((xlsmat(i).BlockList>=2 & xlsmat(i).BlockList<=7))
                    contador_RT_NoVig_space=contador_RT_NoVig_space+1;
                    if (rem(s(v).per_RT_Total_general(contador_RT_NoVig_space),2)~=0) %impares
                        if  ((xlsmat(i).BlockList>=2 ...
                            & xlsmat(i).BlockList<=7) ...
                            & ((xlsmat(i).VigilanciaTrial==2) & ...
                            (xlsmat(i).TargetRESP==4)))
                            %Condicion NoVigilancia (2) SPACE (4)
                            contador_RT_NoVig_space_impar=contador_RT_NoVig_space_impar+1;
                        end
                    end
                 end
            end
          end
      end
end
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Sustituir código (for, if) para más rapidez

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 06/01/2013 17:22:14
En su código, en ningún momento usas el valor 'a', es decir del primer for no tiene sentido.
1
for a=1:aleat
por lo menos para mi, o de repente quieres hacer otra cosa y no lo estas viendo.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ss=217;
I=93744;
A=10000;
    for v=1:ss
        for i=1:I
            if X(i).S==v
                if X(i).B>=2 && X(i).B<=7
                    Con=Con+1;
                    if rem(s(v).per(Con),2)~=0 && X(i).V==2 && X(i).T==4
                       con=con+1;
                    end
                 end
            end
          end
    end


Te filtrado en cierta manera tu código. De repente se puede hacer, mas, pero tendría que ver todo el código y además una explicación detallada de tu código. Pero eso implica tiempo.
De repente se podría usar la función find() de matlab, o también de repente redefinir todo el código.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programación matlab
[email protected]

http://matlabcaballero.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sustituir código (for, if) para más rapidez

Publicado por David (42 intervenciones) el 07/01/2013 01:26:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ss=217;
I=93744;
A=10000;
for a=1:A
          for v=1:ss
                    for i=1:I
                              if X(i).S==v
                                        if X(i).B>=2 && X(i).B<=7
                                                  Con=Con+1;
                                                  if rem(s(v).per(Con),2)~=0 && X(i).V==2 && X(i).T==4
                                                            conimpar=conimpar+1;
                                                  elseif rem(s(v).per(Con),2)==0 && X(i).V==2 && X(i).T==4
                                                            conpar=conpar+1;
                                                  else
                                                  end
                                        end
                               end
                     end
                     s(v).conimpar=conimpar;
                     s(v).conpar=conpar;
                     conpar=0;
                     conimpar=0;
          end
A{a,1}=transpose(s);
end


Muchas gracias por la respuesta.
He puesto el código algo más completo. Efectivamente no había puesto el uso del bucle for a=1:A anteriormente.
Se trata de unas filas de datos (93744). En estas filas hay datos de 217 sujetos. Se trata de ir cogiendo estos datos para ir haciendo un análisis que vaya cambiando en cada aleatorización. Para ello creo una permutación aleatoria anteriormente con:
1
s(v).per=randperm(s(v).num);

Después voy cogiendo los datos correspondientes a las permutaciones pares e impares de las diferentes filas. Una vez que se guardan las 10000 aleatorizaciones en A{1,1}, A{2,1} ... A{10000,1} se hace después un análisis posterior.
Comprendo que el código es complicado de entender.
He hecho este proceso anteriormente de forma parecida en dos ocasiones con la diferencia de que el num para las permutaciones era de 20, mientras que en esta ocasión es de 220 o 384, por lo que hay un mayor número de permutatciones a realizar.
La verdad es que redefinir ahora el código sería un poco durillo, por lo que estaba intentando terminarlo de forma que el proceso se pueda hacer en un tiempo razonable.
Voy a mirar que tiempo se mejora con la optimización del código que me has propuesto y no se si se puede hacer alguna más con los bucles for de forma sencilla.

Muchas gracias por tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sustituir código (for, if) para más rapidez

Publicado por David (42 intervenciones) el 07/01/2013 03:07:06
He logrado optimizar algo el código, haciéndolo en 30 segundos menos cada dos aleatorizaciones, aunque sigue saliendo demasiado tiempo.
Quizás la solución pasaría por sustituir esta parte del código por otra usando find, para que cuente las filas que complen con las condiciones del bucle if, aunque no se bien cómo hacerlo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
for (i=1:indice)
            if (xlsmat(i).Subject==v)
                if ((xlsmat(i).BlockList>=2 & xlsmat(i).BlockList<=7))
                    contador_RT=contador_RT+1;
                    if rem(s(v).per_RT_Total_general(contador_RT),2)~=0
                        if xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==4   %impares
                            %Condicion NoVigilancia (2) SPACE (4)
                            contador_RT_NoVig_space_impar=contador_RT_NoVig_space_impar+1;
                        elseif xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==2
                            %Condicion NoVigilancia (2) c (2)
                            contador_RT_NoVig_c_impar=contador_RT_NoVig_c_impar+1;
                        elseif xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==3
                            %Condicion NoVigilancia (2) m (3)
                            contador_RT_NoVig_m_impar=contador_RT_NoVig_m_impar+1;
                        elseif xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==1
                            %Condicion NoVigilancia (2) blanco (1)
                            contador_RT_NoVig_b_impar=contador_RT_NoVig_b_impar+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==4
                            %Condicion Vigilancia (1) SPACE (4)
                            contador_RT_Vig_space_impar=contador_RT_Vig_space_impar+1;
                        elseif xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==2
                            %Condicion Vigilancia (1) c (2)
                            contador_RT_Vig_c_impar=contador_RT_Vig_c_impar+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==3
                            %Condicion Vigilancia (1) m (3)
                            contador_RT_Vig_m_impar=contador_RT_Vig_m_impar+1;
                        elseif xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==1
                            %Condicion Vigilancia (1) b (1)
                            contador_RT_Vig_b_impar=contador_RT_Vig_b_impar+1;
                        end
                    elseif rem(s(v).per_RT_Total_general(contador_RT),2)==0 ...
                        if xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==4   %pares
                            %Condicion NoVigilancia (2) SPACE (4)
                            contador_RT_NoVig_space_par=contador_RT_NoVig_space_par+1;
                        elseif xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==2
                            %Condicion NoVigilancia (2) c (2)
                            contador_RT_NoVig_c_par=contador_RT_NoVig_c_par+1;
                        elseif xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==3
                            %Condicion NoVigilancia (2) m (3)
                            contador_RT_NoVig_m_par=contador_RT_NoVig_m_par+1;
                        elseif  xlsmat(i).VigilanciaTrial==2 && xlsmat(i).TargetRESP==1
                            %Condicion NoVigilancia (2) blanco (1)
                            contador_RT_NoVig_b_par=contador_RT_NoVig_b_par+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==4
                            %Condicion Vigilancia (1) SPACE (4)
                            contador_RT_Vig_space_par=contador_RT_Vig_space_par+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==2
                            %Condicion Vigilancia (1) c (2)
                            contador_RT_Vig_c_par=contador_RT_Vig_c_par+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==3
                            %Condicion Vigilancia (1) m (3)
                            contador_RT_Vig_m_par=contador_RT_Vig_m_par+1;
                        elseif  xlsmat(i).VigilanciaTrial==1 && xlsmat(i).TargetRESP==1
                            %Condicion Vigilancia (1) b (1)
                            contador_RT_Vig_b_par=contador_RT_Vig_b_par+1;
                        end
 
 
                    else
 
                    end
                end
            end
       end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar