Matlab - Evitar el ciclo for por la cantidad de datos

   
Vista:

Evitar el ciclo for por la cantidad de datos

Publicado por Alberto (5 intervenciones) el 26/09/2014 07:02:30
Hola que tal, estoy tratando de hacer unas simulaciones de lo que es problema de Monte Carlo para hacer una estimacion del valor pi e hice el siguiente programa

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
clear all
clc
 
N=100000;
p=0.5;
q=0.5;
x=rand(N,1);
y=rand(N,1);
 
lg=length(y);
 
cont=0;
dist=[];
 
%Dibujamos un circulo centrado en 0.5 y 0.5
R = 0.5;
tita = (0:0.01:2.01*pi);
a = R*cos(tita)+0.5;
b = R*sin(tita)+0.5;
hold on
plot(a,b,'LineWidth',2)
title(['Puntos dentro de un cuadrado y un circulo de radio 0.5']);
axis equal
axis([0 1 0 1])
set(gca,'XTick',[0:0.2:1])
set(gca,'XTickLabel',{'0','0.2','0.4','0.8','1.0'})
xlabel('Coordenada en X')
set(gca,'YTick',[0:0.2:1])
set(gca,'YTickLabel',{'0','0.2','0.4','0.8','1.0'})
set(gca,'Fontsize',10)
ylabel('Coordenada en Y')
 
for i=1:lg
    dt=sqrt((x(i)-p)^2+(y(i)-q)^2); %Calcula la distancia euclidiana de los puntos con respecto al centro
    if (dt<=0.5)
        cont=cont+1;
        plot(x(i),y(i),'.r')% Dibuja los puntos que caen dentro del circulo
    else
        plot(x(i),y(i),'.b')% Dibuja los puntos que caen fuera del circulo 
    end
    dist=[dist dt];
 end
 
lgd=length(dist);
Pcir=cont/lgd;
Pi=4*Pcir

Funciona bien pero el detalle es que al evaluarlo con N=1000000 el programa tarda demasiado casi media hora para mostrarme la grafica, segun me comentaron hay forma para trabajar esto de manera que solo toma unos dos minutos los calculos, me mencionaron algo de vectorizacion del problema, pero no entiendo la manera de hacerlo.
Espero alguien pudiera darme alguna sugerencia para manejar tales cantidades de datos
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

Evitar el ciclo for por la cantidad de datos

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3439 intervenciones) el 26/09/2014 17:49:04
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
function  circunferencia1(N)
tic
close all
p=0.5;
q=0.5;
x=rand(N,1);
y=rand(N,1);
lg=length(y);
 
%Dibujamos un circulo centrado en 0.5 y 0.5
R = 0.5;
tita = (0:0.01:2.01*pi);
a = R*cos(tita)+0.5;
b = R*sin(tita)+0.5;
hold on
plot(a,b,'LineWidth',2)
title(['Puntos dentro de un cuadrado y un circulo de radio 0.5  N= ', num2str(N)]);
axis equal
axis([0 1 0 1])
set(gca,'XTick',0:0.2:1)
set(gca,'XTickLabel',{'0','0.2','0.4','0.8','1.0'})
xlabel('Coordenada en X')
set(gca,'YTick',0:0.2:1)
set(gca,'YTickLabel',{'0','0.2','0.4','0.8','1.0'})
set(gca,'Fontsize',10)
ylabel('Coordenada en Y')
 X=(x-p).^2;
 Y=(y-p).^2;
 Dt=sqrt(X+Y);
 r1=find(Dt<=0.5);
 X1=x(r1);
 Y1=y(r1);
 r2=find(Dt>0.5);
 X2=x(r2);
 Y2=y(r2);
 plot(X1,Y1,'.r')% Dibuja los puntos que caen dentro del circulo%
 plot(X2,Y2,'.b')% Dibuja los puntos que caen fuera del circulo 
 cont=length(r1);
 lgd=lg;
 hold off
 
Pcir=cont/lgd;
Pii=4*Pcir;
toc





1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> circunferencia1(10)
Elapsed time is 0.128094 seconds.
>> circunferencia1(100)
Elapsed time is 0.140717 seconds.
>> circunferencia1(1000)
Elapsed time is 0.170769 seconds.
>> circunferencia1(10000)
Elapsed time is 0.152133 seconds.
>> circunferencia1(100000)
Elapsed time is 0.203071 seconds.
>> circunferencia1(1000000)
Elapsed time is 0.342757 seconds.
>> circunferencia1(10000000)
Elapsed time is 2.925882 seconds.





circunferencia1


Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online y Presencial en Matlab
programador en matlab
Servicios de programación matlab
jjcc94@hotmail.com
Estimado Usuario de Matlab, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
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

Evitar el ciclo for por la cantidad de datos

Publicado por alberto nava (5 intervenciones) el 26/09/2014 18:03:39
Estimado JOSE JEREMIAS CABALLERO, muchisimas gracias por la ayuda, veo que efectivamente hizo la vectorizacion del problema y con la ayuda de find, el problema colocar el ciclo for asi como los comparativos if's, el proceso se vuelve super rapido.
Y si no es mucha molestia, podria recomendarme algun libro o pagina donde pueda encontrar ejemplos de vectorizacion de problemas.

Muchas gracias y saludos
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 JOSE JEREMIAS CABALLERO

Evitar el ciclo for por la cantidad de datos

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3439 intervenciones) el 26/09/2014 18:07:36
El tema de vectorización siempre se encuentra en un primer curso de matlab básico. Uno empieza a estudiar matlab desde lo mas elemental y lo primero que se toca es el tema de vectores y dentro de ello se encuentra el tema de operación de punto a punto cual es conocido como vectorización.

>> a=1:4

a =

1 2 3 4

>> a.^2

ans =

1 4 9 16

Aquí tienes forma de estudiar matlab desde mi punto de vista es lo mas adecuado

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
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

Evitar el ciclo for por la cantidad de datos

Publicado por alberto nava (5 intervenciones) el 29/09/2014 18:19:46
Hola nuevamente, me surgio otra cuestion acerca de la grafica, ya que hice un programa gracias a su ayuda para poder hacer un calculo de pi simulando un millon de eventos. Pero ahora en lugar de puntos tendria que dibujar lineas que cumplen con cierta condicion, con el uso de plot me parece que es demasiado el tiempo que toma, no se si en una imagen es mas facil o con plot haya alguna manera de hacerlo mas eficiente.

Este es el codigo que he elaborado

plot([-1 -1],[-1 1],'r');
hold on
plot([0 0],[-1 1],'r');
plot([1 1],[-1 1],'r');
pause(1)
%Datos de la prueba
N=1000; %Numero de eventos
d=1; %Distancia entre lineas
L=0.7; %Longitud
M=0; %Contador
mov=.5*randn(N,1);

%Calculos para las N agujas
theta = (pi/2)*rand(N,1); %Angulo aleatorio U~(0,pi/2)
equis = (d/2)*rand(N,1); %Distancia aleattoria U~(0,d/2)
x=cos(theta); %Proyeccion horizontal
y=sin(theta);
r2=find(equis<=(L/2)*y); %Localiza corte de lineas
Xc=equis(r2);
Y=sin(theta(r2));
X=cos(theta(r2)); %Proyeccion horizontal
Mov=mov(r2);
M=length(Xc); %Numero de agujas que cortan linea

%Solo se dibujan las lineas que cortan a la paralela
for i=1:length(r2)
plot([Xc(i)-(L/2)*Y(i) (L/2)*Y(i)+Xc(i)],[Xc(i)-(L/2)*Y(i) (Xc(i)-(L/2)*Y(i)+sqrt(L^2-(L*Y(i))^2))],'b')
end

%Calculo de pi aproximado
aprox=M/N
pi=(2*L)/(d*aprox)
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 JOSE JEREMIAS CABALLERO

Evitar el ciclo for por la cantidad de datos

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3439 intervenciones) el 29/09/2014 19:13:40
1
2
3
4
5
6
7
8
9
10
11
12
13
>> graficar
N =
 
     1000000
 
aprox =
    0.4459
 
 
pi =
    3.1398
 
Elapsed time is 98.436921 seconds.



Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online y Presencial en Matlab
programador en matlab
Servicios de programación matlab
jjcc94@hotmail.com
Estimado Usuario de Matlab, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html



pi
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 JOSE JEREMIAS CABALLERO

Evitar el ciclo for por la cantidad de datos

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3439 intervenciones) el 30/09/2014 01:47:03
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
function graficar
tic
close all
plot([-1 -1],[-1 1],'r');
 hold on
 plot([0 0],[-1 1],'r');
 plot([1 1],[-1 1],'r');
 pause(1)
 %Datos de la prueba
 N=1000000 %Numero de eventos
 d=1; %Distancia entre lineas 
 L=0.7; %Longitud 
 M=0; %Contador 
 mov=.5*randn(N,1);
 
 %Calculos para las N agujas 
 theta = (pi/2)*rand(N,1); %Angulo aleatorio U~(0,pi/2)
 equis = (d/2)*rand(N,1); %Distancia aleattoria U~(0,d/2)
 x=cos(theta); %Proyeccion horizontal 
 y=sin(theta);
 r2=find(equis<=(L/2)*y); %Localiza corte de lineas
 Xc=equis(r2);
 Y=sin(theta(r2));
 X=cos(theta(r2)); %Proyeccion horizontal 
 Mov=mov(r2);
 M=length(Xc); %Numero de agujas que cortan linea
 
 %Solo se dibujan las lineas que cortan a la paralela
 n=1:length(r2);
 XX=[Xc(n)-(L/2)*Y(n)   (L/2)*Y(n)+Xc(n)];
 YY=[Xc(n)-(L/2)*Y(n) (Xc(n)-(L/2)*Y(n)+sqrt(L^2-(L*Y(n)).^2))];
 plot(XX',YY','g')
 hold off
 
 %Calculo de pi aproximado
 aprox=M/N
 Pi=(2*L)/(d*aprox)
 toc
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

Evitar el ciclo for por la cantidad de datos

Publicado por alberto nava (5 intervenciones) el 30/09/2014 04:58:42
Muchas gracias, interesante forma de manejar los vectores para el la funcion plot, solo espero que estas dudas que ha resuelto el estimado JOSE JEREMIAS CABALLERO, sean de utilidad para las cuestiones donde el ciclo for utiliza mucho tiempo para realizar cierto tipo de procesos, y ver que es posible no utilizar los ciclos y manejar solo vectores para la solucion de problemas.

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

Evitar el ciclo for por la cantidad de datos

Publicado por alberto nava (5 intervenciones) el 05/11/2014 17:01:45
Hola una pregunta, hay alguna forma de aumentar el tamaño de los graficos que matlab me despliega en una figura. En si cuando utilizo subplot(m,n,p) las graficas las escala automaticamente matlab, pero no se si uno podria aumentar el tamaño, porque por ejemplo una figura con cuatro graficas en arreglo de 2x2 me parece que hay suficiente espacio para aumentar de tamaño los graficos.

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