Matlab - Forma de sustituir bucles for para más eficiencia

 
Vista:
sin imagen de perfil

Forma de sustituir bucles for para más eficiencia

Publicado por David (42 intervenciones) el 25/07/2012 10:35:18
Ejecuto un código similar a:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
indice=91175;
subject=217;
aleat=10;
A=cell(aleat,1);
 
for (a=1:aleat)
    for (v=1:subject)
        for (i=1:indice)
              if (xxxxxxx==v)
                     if(....)
                     end
              end
        end
    end
end
                          .............


El proceso tarda demasiado en ejecutarse. Además el número de aleatorizaciones no es 10, sino que debe de ser de 10000, por lo que el tiempo de procesado en una máquina de 64 bits normalita es demasiado grande.

¿Se pueden modificar los bucles for de forma fácil para disminuir el tiempo de proceso?

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
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

Forma de sustituir bucles for para más eficiencia

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 25/07/2012 17:38:58
Vectorizalo tu problema.
Debe ser más eficiente en la forma vectorizada.
Pero por la información que brindas es demasiado escueta, y por lo tanto no puedo darte una respuesta precisa, lo siento.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion 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

Forma de sustituir bucles for para más eficiencia

Publicado por David (42 intervenciones) el 25/07/2012 18:31:04
A la función le paso una estructura de la forma:

t =

91175x1 struct array with fields:
Subject
BlockList
VigilanciaTrial
TargetACC
TargetRT
TargetRESP
TonoTrial
ValidezClaveTrial
CongruencyTrial

Los valores son numéricos, por ejemplo:
>> t(1).Subject

ans =

1

>> t(1000).Subject

ans =

4
>> t(1000).BlockList

ans =

2

>> t(1).BlockList

ans =

1

Necesito coger determinadas filas para hacer promedios dependiendo de diferentes condiciones para lo que utilizo la función del tipo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function [A,s] = promedioantiRT_mitad1 ( xlsmat )
indice=91175;
subject=217;
aleat=10;
A=cell(aleat,1);
for (a=1:aleat)
   for (v=1:subject)
      for (i=1:indice)
         if (xlsmat(i).Subject==v)
            if(xlsmat(i).BlockList>=2)
                acum_RT_NoT_InVal_C_impar=acum_RT_NoT_InVal_C_impar+xlsmat(i).TargetRT;
                contador_RT_NoT_InVal_C_impar=contador_RT_NoT_InVal_C_impar+1;
            end
        end
      end
   end
A{a,1}=transpose(s);
end


Como necesito coger filas de forma aleatoria realizo permutaciones pero debo tener en cuenta que no se pueden repetir por lo que voy guardando las aleatorizaciones A{1,1}, A{2,1}, A{3,1}...

Funcionar funciona como quiero, pero el problema está en el tiempo que se tarda.

¿Cómo podría hacer la vectorización?
La cuestión es que si no mantengo la estructura pierdo la información de cada columna, a no ser que sea mejor hacerlo de otra forma sin estructuras

Cualquier ayuda será bienvenida pues estoy atrancado aquí....

Muchas gracias
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