Matlab - Como expandir y contraer una matriz en Matlab

 
Vista:
Imágen de perfil de Jesús

Como expandir y contraer una matriz en Matlab

Publicado por Jesús (3 intervenciones) el 03/01/2018 01:13:54
Hola, tengo una duda a la hora de hacer la contracción y la expansión de la matriz en Matlab del Juego de la Vida. Primero tengo una matriz inicial que es:
A=[0,0,1,1,0;0,1,1,0,0;0,0,1,0,0;1,0,0,0,0].
Para expandir la matriz he añadido dos filas y dos columnas de ceros a la matriz de esta forma:
A=[0,0,0,0,0,0,0;
0,0,0,1,1,0,0;
0,0,1,1,0,0,0;
0,0,0,1,0,0,0;
0,1,0,0,0,0,0;
0,0,0,0,0,0,0]
Teniendo en cuenta que en la contracción tengo que agrupar dividir la matriz A en las siguientes matrices:
1.[0,0,0,0,0,0,0;
0,0,0,1,1,0,0];
2.[0,0;
0,0;
0,0;
0,0;
0,1;
0,0];
3.[0,1,0,0,0,0,0;
0,0,0,,0,0,0,0];
4.[0,0;
0,0;
0,0;
0,0;
0,0;
0,0];
Y me piden que haga la expansión utilizando lenght(find([1,2],:)==1)), que sirve para contar las celulas vivas, [m,n]=size(A) que nos muestra el orden de la matriz y A=[zeros(1,n);A].¿Se puede hacer de otra forma la expansión y como se haría?
Después me pide que haga la contracción,es decir quitar las dos filas y columnas de ceros. Utilizando el lenght(find(A([m-2:m],:)==1)),que sirve para contar las celulas vivas del cordon. También utilizando [m,n]=size(A) y A=A(1:m-1,:);

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

Como expandir y contraer una matriz en Matlab

Publicado por Daniel (264 intervenciones) el 04/01/2018 19:05:48
Quizá mi respuesta sea un poco fuera del hilo de tu pregunta... Pero me parece que tal vez te pueda servir...

Te paso un código para el juego de la vida usando la funcion filter2 que sirve muy bien para este caso

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clc
A=rand(80)>.5; % condicion inicial
colormap gray
n_pasos=500;
pob=zeros(n_pasos,1);
for j=1:n_pasos
    p=ones(3);
    p(2,2)=0;
    C1=filter2(p,A,'same')==3; % nacimientos
    C2=or(filter2(p,A,'same')==2,C1); % muertes
    A=not(A).*C1+A.*C2;
    pob(j)=sum(sum(A));
    subplot(1,2,1),imagesc(A)
    subplot(1,2,2),plot(j,sum(sum(A==1)),'.r'),hold on
    drawnow
end


Saludos, espero que te sirva

Daniel
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 Jesús

Como expandir y contraer una matriz en Matlab

Publicado por Jesús (3 intervenciones) el 05/01/2018 01:32:20
Gracias por responder Manuel a la duda. Pero al mirar tu código,me han surgido otras dudas:

*La función filter(no he dado en clase), pero la he buscado en la web y he encontrado esto: La filterfunción utiliza vectores de coeficientes especificados a y b para filtrar los datos de entrada x .(Yo de conclusión he sacado que esta función sirve para leer los datos de la matriz o eso creo). ¿No se puede hacer de otra forma?

*Este código de a continuación:¿Son las reglas del juego o no?
1
2
C1=filter2(p,A,'same')==3; % nacimientos
              C2=or(filter2(p,A,'same')==2,C1); % muertes
*Este código tampoco lo entiendo:
1
A=not(A).*C1+A.*C2;


Un saludo, gracias
Jesús
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

Como expandir y contraer una matriz en Matlab

Publicado por Daniel (264 intervenciones) el 05/01/2018 18:09:10
la función es filter2 (no filter), lo que hace (R=filter2(p,A)) es la convolución 2D de p con A para el caso en que p es una matriz de 3x3 :

R(i.j)=p.*A((i-1):(i+1),(j-1):(j+1)) para todo i j , la condición 'same' soluciona los problemas en los bordes

en el caso que p=[1 1 1;1 0 1;1 1 1], R da como resultado la suma de los vecinos de cada punto de A.

Como C1 son los puntos en los cuales puede nacer un individuo y C2 los puntos en donde no debe morir un individuo
el nuevo A será:

A=not(A).*C1+A.*C2;

not(A) son individuos que están muertos
A son individuos que están vivos

luego not(A).*C1 asigna 1 a los que nacen
luego A.*C2 mantiene en 1 a los que no deben morir


te dejo una forma un poco mas clásica de resolverlo:


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
clc
clear
A=[0,0,1,1,0;0,1,1,0,0;0,0,1,0,0;1,0,0,0,0];
An=A;
disp('Matriz original')
disp(A)
 
n_pasos=4;
pob=zeros(n_pasos,1);
for g=1:n_pasos
    B=zeros(size(A)+2); % genero una matriz de ceros con 2 filas y 2 columnas mas que A
    B(2:end-1,2:end-1)=A; % meto A en el medio de B
    % doble bucle sobre todos los elementos de la matriz
    for i=1:size(A,1)
        for j=1:size(A,2)
            C=sum(sum(B(i:(i+2),j:(j+2))))-A(i,j); % suma de vecinos
            if and(A(i,j)==0,C==3) % nacimiento: esté muerto y tenga tres vecinos
                An(i,j)=1;
            end
            if and(A(i,j)==1,and(C~=2,C~=3)) % muerte: esté vivo y no tenga ni 2 ni 3 vecinos
                An(i,j)=0;
            end
        end
    end
    A=An;
    disp(['Matriz luego de ' num2str(g) ' pasos'])
    disp(A)
 
    colormap gray
    pob(g)=sum(sum(A));
    subplot(1,2,1),imagesc(A)
    subplot(1,2,2),plot(1:g,pob(1:g),'-r')
    drawnow
    pause(.2)
end

Comentanos como te fue

Saludos

Daniel
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 Jesús

Como expandir y contraer una matriz en Matlab

Publicado por Jesús (3 intervenciones) el 06/01/2018 04:04:22
Muchas gracias Daniel, que me he equivocado con tu nombre en el comentario anterior. El código que me has mandado funciona perfectamente, pero ademas de que funcione quiero entenderlo. El objetivo de este código es crear varias matrices llamadas B, C y D (si no me equivoco). Pero tengo otros dos problemas referidos con el codigo:

*El disp es lo mismo que el display, según los apuntes que tengo de Matlab no lo hemos dado, por lo que se puede hacer de otra forma, la cual, desconozco. No me dejan, yo creo que de vez de utilizar el disp tenemos que ir agrupando diferentes matrices como el dibujo que voy a dejar a continuación:
Contraccion

Por eso yo al principio del foro definí 4 matrices igual como en el dibujo adjunto.
Las matrices que puse al principio son las siguientes:
1
2
3
4
1.[0,0,0,0,0,0,0;0,0,0,1,1,0,0];
2.[0,0;0,0;0,0;0,0;0,1;0,0];
3.[0,1,0,0,0,0,0;0,0,0,,0,0,0,0];
4.[0,0;0,0;0,0;0,0;0,0;0,0];

Muchas GRACIAS DANIEL. Perdona por llamarme Manuel.
Saludos
Jesús
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