Matlab - reduccion bucles en matlab

 
Vista:
sin imagen de perfil

reduccion bucles en matlab

Publicado por Marcos (9 intervenciones) el 12/08/2015 11:52:58
Hola buenas tardes,
estoy realizando un script mucho mas amplio pero me encuentro ante este problema: debido a el alto uso de bucles for, matlab tarda mucho en computar y es por eso que les pido ayuda por si ven alguna manera en la que pueda ahorrarme bucles y con solo dos variables de iteración consiga obtener el mismo valor de aux cumpliendo los if que hay.

Muchas gracias de antemano.

----------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
aux=1;
numpueblos=5;
 
for k=1:numpueblos-2
    for kk=1:numpueblos
        if (k<kk)
            for i=1:numpueblos-1
                for ii=1:numpueblos
                    if( (i<ii && i>=k && ii>kk) || (i<ii && i>=k+1 )  )
                        aux=aux+1;
                    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 Royeth
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

reduccion bucles en matlab

Publicado por Royeth (1818 intervenciones) el 12/08/2015 22:18:25
Bueno lo puedes hacer por combinatoria pero demora más que tu programa original pero luego por inteligencia artificial se podría mejorar de la siguiente manera :


1
2
3
4
5
n=5;%númpueblos
sets = {1:n-2, 1:n, 1:n-1,1:n };
[w,x, y, z] = ndgrid(sets{:});
p = [w(:) x(:) y(:) z(:)];
v=1+length(p(and(p(:,1)<p(:,2),or(and(and(p(:,3)<p(:,4),p(:,3)>=p(:,1)),p(:,4)>p(:,2)),and(p(:,3)<p(:,4),p(:,3)>=p(:,1)+1))),1));

y v te daría el valor de aux , pero luego por inteligencia artificial se puede reducir todo a con un rendimiento mucho mayor
1
2
3
x=5; %númpueblos 
y='0.125.*x.^4-0.25.*x.^3-0.125.*x.^2+0.25.*x+1';
v=round(eval(y));

y v te daría el valor de aux para valores incluso gigantes que los programas anteriores demorarían 5 minutos buscándolos
Saludos

https://www.facebook.com/royethmatlab/
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

reduccion bucles en matlab

Publicado por Marcos (9 intervenciones) el 15/08/2015 11:47:05
gracias! a ambooos
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

reduccion bucles en matlab

Publicado por Daniel (264 intervenciones) el 13/08/2015 20:41:31
Muchas veces lo mejor es ver si los resultados tienen alguna secuencia para los números bajos y chequear si al ser testeados para otros valores se comportan correctamente. Principalmente en los casos en donde los bucle se utilizan solo para contar. Si dentro pones un display de los valores te vas a dar cuenta que hay un orden

1
2
3
4
if( (i<ii && i>=k && ii>kk) || (i<ii && i>=k+1 )  )
      disp([i ii k kk])
      aux=aux+1;
end

por ejemplo el valor de "kk" para numpueblos =3 toma 2 veces el 2 y 1 vez el 3
para numpueblos =4 toma 5 veces el 2, 4 veces el 3, 3 veces el 4, 2 veces el 3 y 1 vez el 4

sería: para n=3 2+1
para n=4 5+4+3+2+1
.... para n=5 9+8+..+2+1

la suma de todos los números de 1 a k vale k*(k+1)/2

lo que faltaría seria ver como se relaciona el "n" con hasta donde hago la suma. Vemos que a cada paso del n se le suman (n-1) términos...

asi y probando un poco, siempre testeando con el código original llegué a que:

1
aux=1+(numpueblos^2-numpueblos)*(numpueblos^2-numpueblos-2)/8;


Esto hace que no tenga que hacer todos los bucles para llegar a ese valor sino solo hacer una cuenta, con lo cual es bastante independiente de que tan grande sea el número.


Probalo y comentanos como te fue

Saludos

Daniel


PD: Respecto de lo comentado por Royeth, me parece que el uso de redes neuronales e inteligencia artificial conlleva un aprendizaje que lleva bastante más tiempo que resolver el problema a lápiz y papel ... prefiero entrenar mis neuronas que las de una máquina... jejeje
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
Imágen de perfil de Royeth
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

reduccion bucles en matlab

Publicado por Royeth (1818 intervenciones) el 13/08/2015 22:27:38
jajaj muy buen análisis Daniel , solo que aveces por cuestión de tiempo es más fácil entrenar otras neuronas para que matlab calcule los pesos cuando ya conoces o tienes la red y solo le vas a ingresar los input y output , pero muy bueno tu análisis


Un saludo
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

reduccion bucles en matlab

Publicado por Daniel (264 intervenciones) el 13/08/2015 22:38:33
Royeth, nunca se me hubiera ocurrido tu solución, incluso ahora que justo estoy aprendiendo (por hobby) un poco sobre redes neuronales (la parte teórica), me podes recomendar algún tutorial, libro, etc, para su implementación en matlab.

Saludos y como siempre un placer por ver otros enfoques

Daniel
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

reduccion bucles en matlab

Publicado por Daniel (264 intervenciones) el 13/08/2015 23:44:27
genial, 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