Matlab - Problema con los ciclos

   
Vista:

Problema con los ciclos

Publicado por Javier Her (3 intervenciones) el 18/01/2011 14:13:05
Hola, soy nuevo aqui, y me he animado a entrar porque creo que soy incapaz de sacar este problema yo solo y agradeceria cualquier tipo de ayuda.
El problema es el siguiente: Tengo que crear una simulación que se basa en la creación aleatoria de una matriz con 1,-1 y 0. El tamaño de la matriz y la probabilidad de que en una posición halla un 1, o un -1 se introducen manualmente(p y q). Esta parte creo que la tengo, el problema es que a partir de esta matriz inicial hay que conseguir que esta se actualice por ciclos en función de su entorno. Me explico, en la matriz actualizada, el valor de una posición de la matriz es la suma de los puntos que lo rodean (N,S,E yO). Como ejemplo, si tenemos esta matriz: [0,1;-1,-1], la matriz despues de un ciclo debe ser: [0,-1;-1,0]. Me surgen dos problemas en esta parte:
- me aparecen valores de 2 ó -2 (la matriz que yo uso es de 4x4).
- No se como hacer que el proceso se repita x ciclos (en mi caso 20).
Os adjunto el código de lo que tengo, a ver si alguien logra ayudarme.

function x=bosque(m,n,p,q)
m=input ('Introducir el número de filas: ');
n=input ('Introducir el número de columnas: ');
p=input ('Introducir valor p: ');
q=input ('Introducir valor q: ');
y=rand(m,n);
for i=1:m;
for j=1:n;
if p>q;
if y(i,j)>p;
x(i,j)=1;
elseif y(i,j)>q;
x(i,j)=-1;
else;
x(i,j)=0;
end;
elseif q>p;
if y(i,j)>q;
x(i,j)=-1;
elseif y(i,j)>p;
x(i,j)=1;
else;
x(i,j)=0;
end;
else;
if y(i,j)>p&&y(i,j)>q;
x(i,j)=1;
else;
x(i,j)=-1;
end;
end;
end;
end;

function v=ambiente(m,n,p,q,T)
x=bosque
[m,n]=size(x);
T=input('Introducir número de ciclos: ');
z=zeros(m,n);
v=zeros(m,n);
for t=1:T;
for k=1:m;
for l=1:n;
if k>1&&k~=m
z(k,l)=x(k-1,l)+x(k+1,l)
elseif k==1
z(k,l)=x(k+1,l)
elseif k==m
z(k,l)=x(k-1,l)
elseif l>1&&l~=n
z(k,l)=x(k,l-1)+x(k,l+1)
elseif l==1
z(k,l)=x(k,l+1)
elseif l==n
z(k,l)=x(k,l-1)
if z(k,l)>=1
z(k,l)=1
elseif z(k,l)<=-1
z(k,l)=-1
else
z(k,l)=0
end
end
end
end
v(t)=v+z
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

RE:Problema con los ciclos

Publicado por Javier Her (3 intervenciones) el 18/01/2011 17:11:59
Me acabo de dar cunta de que la primera función esta mal planteada, en realidad la función bosque sería así:
function x=bosque(m,n,p,q);
m=input ('Introducir el número de filas: ');
n=input ('Introducir el número de columnas: ');
p=input ('Introducir valor p: ');
q=input ('Introducir valor q: ');
y=rand(m,n);
for i=1:m;
for j=1:n;
if y(i,j)<=p;
x(i,j)=1;
elseif y(i,j)>p&&y(i,j)<=1-q;
x(i,j)=0;
else;
x(i,j)=-1;
end;
end;
end;
x
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

RE:Problema con los ciclos

Publicado por Javier Her (3 intervenciones) el 18/01/2011 18:38:37
Parece mentira, pero desde que he escrito en el foro he avanzado más que en los diez dias que llevo intentando sacar el problema. A ver, acabo de conseguir que la matriz se actualice una vez y no me de como resultado números mayores que 1 ó -1, por lo tanto solo necesito que alguien me ayude a repetir el proceso partiendo de la nueva matriz, y no del valor 0, como al principio, ya que ahora me aparece la misma matriz 20 veces. Supongo que tenga que emplear algo parecido a z=z+1 despues del for, pero no consigo nada. A ver si se me vuelve a aparecer la virgen y lo resuelvo sin ayuda, pero por si acaso, pongo el código de Matlab que he usado, por si a alguien me ayuda o le hace falta para algo parecido.

function v=ambiente(m,n,p,q,T)
x=bosque
[m,n]=size(x);
T=input('Introducir número de ciclos: ');
z=0;
for t=1:T;
for k=1:m;
for l=1:n;
if k==1;
if l==1;
z(k,l)=x(k+1,l)+x(k,l+1);
elseif l==n;
z(k,l)=x(k+1,l)+x(k,l-1);
else
z(k,l)=x(k+1,l)+x(k,l+1)+x(k+l-1);
end;
elseif k==m;
if l==1;
z(k,l)=x(k-1,l)+x(k,l+1);
elseif l==n;
z(k,l)=x(k-1,l)+x(k,l-1);
else
z(k,l)=x(k-1,l)+x(k,l+1)+x(k+l-1);
end;
elseif k~=1&&k~=m;
if l==1;
z(k,l)=x(k+1,l)+x(k-1,l)+x(k,l+1);
elseif l==n;
z(k,l)=x(k+1,l)+x(k-1,l)+x(k,l-1);
else
z(k,l)=x(k+1,l)+x(k-1,l)+x(k,l+1)+x(k,l-1);
end;
end;
switch z(k,l);
case 1
z(k,l)=1;
case 2;
z(k,l)=1;
case 3;
z(k,l)=1;
case 4;
z(k,l)=1;
case 0;
z(k,l)=0;
case -1
z(k,l)=-1;
case -2;
z(k,l)=-1;
case -3;
z(k,l)=-1;
case -4;
z(k,l)=-1;
end;
end;
end;
z
end;
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