Matlab - bucle if con varias condiciones

 
Vista:

bucle if con varias condiciones

Publicado por Francisco Jesús (3 intervenciones) el 05/01/2017 21:14:48
Hola a todos!!

Estoy teniendo un problema a la hora de igualar en un bucle if varias condiciones. Es curioso porque cuando se trata del valor de 'x' sí que me lo hace bien, pero no con el de 'y'.
Dejo el scrib con comentarios del mismo, a ver si alguien me pudiera ayudar. Espero que se pueda entender. Si hay alguna duda sobre el scrib estaré escantado de responderos con más detalle.

Muchas gracias de antemano.
Un saludo.


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
%Voy a poner un ejemplo con el primer número que debería hacer, así le
%asigno valores y no tengo que copiar todo el scrib
%sacamos el baricentro de un elemento diferencial de forma triangular que será G, y lo redondeamos a
%un decimal con J
      G=zeros(1,2);
      xg=mean(xv); %xv=[34.1848, 45.4262, 35.6877] y será xg=38.4329
      yg=mean(yv); %xv=[219.0522, 228.9690, 233.8103] y será xg=227.2772
      G(1,1)=xg;
      G(1,2)=yg;
      J=roundn(G,-1); %J=[38.4, 227.3]
      Zx=J(1,1); %Zx=38.4
      Zy=J(1,2); %Zy=227.3
 
%quiero saber en que filas y columnas están las coordenadas(x,y) que estoy
%buscando del centro del triángulo de los elementos, para ello
%redondeo la cifra Zc para que me de un valor justo con un decimal y
%aproximo su cifra al valor exacto o con un error, ya que las
%coordenadas en 'X' empezará en 0.1 e irá de 0.2 en 0.2, la matriz será Coord_X=(0.1,0.1,...; 0.3,0.3,...;0.5,0.5,...) 
%con las coordenadas en 'Y' pasará igual, pero comenzando en 0.3 y saltando de 0.6 en 0.6 (Coord_Y=(0.3,0.3,...; 0.9,0.9,...; 1.5,1.5,...).
            for s=1:1:906
                Zc=Coord_X(1,s);
                Zc=roundn(Zc,-1);  %Zc=38.3
             if (Zx==Zc||(Zx-0.1)==Zc) %parece que con estas condiciones me funciona bien, ya que resta 38.4-0.1
             M=s;
             break
             end
            end
            for t=1:1:906
                Zv=Coord_Y(t,1);
                Zv=roundn(Zv,-1);  %Zv=227.1
 
%aquí está el primer problema, ya que no hace coincidir Zy con ninguna Zv, entonces el break no funciona y for
%sigue corriendo hasta el final no dando nungún valor a N y situándome Zv
%en el último valor de la cadena de Coordendas_Y Zv=(543.3)
              if (Zy==Zv||(Zy-0.1)==Zv||(Zy-0.2)==Zv||(Zy-0.3)==Zv||(Zy+0.1)==Zv||(Zy+0.2)==Zv)
              N=t;
              break
              end
            end
 %recorro puntos de alrededor del baricentro para ver cual está dentro
      k=-1.8;
     for j=-3:0.1:3
            xq=Zc+j;
            yq=Zv+k;
            [in]=inpolygon(xq,yq,xv,yv);
            k=k+0.6;
 
            if (in==1)
 %cuando encontramos un punto dentro, entonces sacamos los valores de x e y de esos puntos
                for s=1:1:906
                    Za=Coord_X(1,s);
                    Za=roundn(Za,-1);
                    if (xq==Za)
                        HUx=s;
                        break
                    end
                end
               for t=1:1:906
                Zb=Coord_Y(t,1);
                Zb=roundn(Zb,-1);
 
 %aquí también me pasa que no es capaz de igualarlo, y no logro obtener el valor de HUy
                if (yq==Zb)
                    HUy=t;
                    break
                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 JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

bucle if con varias condiciones

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 06/01/2017 03:23:33
ningún valor Zv=roundn(Zv,-1) cumple con algun de de las condiciones siguientes
if (Zy==Zv||(Zy-0.1)==Zv||(Zy-0.2)==Zv||(Zy-0.3)==Zv||(Zy+0.1)==Zv||(Zy+0.2)==Zv), es por eso no entra a la sentencia if.

lo si cumple alguna condición es el valor dado por Zv=Coord_Y(t,1);

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
clear all
G=zeros(1,2);
xv=[34.1848, 45.4262, 35.6877];
yv=[219.0522, 228.9690, 233.8103] ;
xg=mean(xv); % y será xg=38.4329
yg=mean(yv); %xv=[219.0522, 228.9690, 233.8103] y será xg=227.2772
G(1,1)=xg;
G(1,2)=yg;
J=roundn(G,-1); %J=[38.4, 227.3]
Zx=J(1,1); %Zx=38.4
Zy=J(1,2); %Zy=227.3
 
Coord_X=0.1:0.2: (0.1+(906-1)*0.2);
for s=1:1:906
    Zc=Coord_X(1,s);
    Zc=roundn(Zc,-1); %Zc=38.3
    if (Zx==Zc||(Zx-0.1)==Zc) %parece que con estas condiciones me funciona bien, ya que resta 38.4-0.1
        M=s
         break
    end
end
Coord_Y=0.3:0.6: (0.3+(906-1)*0.6);
V=[];
for t=1:1:906
    Zv=Coord_Y(1,t);
    ZV=roundn(Zv,-1);
    %Zv=227.1
   V=[V; [ Zy-0.3 Zy-0.2  Zy-0.1 Zy Zy+0.1 Zy+0.2  Zy+0.3  ZV Zv ]];
    if ( (Zy-0.5)==Zv  || (Zy-0.4)==Zv || (Zy-0.3)==Zv || (Zy-0.2)==Zv  || (Zy-0.1)==Zv || Zy==Zv || (Zy+0.1)==Zv ...
            ||  (Zy+0.2)==Zv  || (Zy+0.3)==Zv   || (Zy+0.4)==Zv || (Zy+0.5)==Zv || (Zy+0.6)==Zv )
        N=t
        break
    end
end
V;

1
2
3
4
5
6
7
8
9
10
>> baricentro
 
M =
 
   192
 
 
N =
 
   380



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

bucle if con varias condiciones

Publicado por Francisco Jesús (3 intervenciones) el 06/01/2017 10:56:58
¡¡Muchas gracias!!

La primera parte ya me funciona, dándole las demás condiciones que me dijiste. Pero en la segunda parte, donde rastrea la zona de alrededor del baricentro para ver que puntos hay dentro del elemento me sigue sin encontrar el valor de HUy, ya que no me iguala Zb con ninguna yq, cuando el valor en workspace es el mismo. No lo entiendo. A ver si me puedes echar una mano ahí. Te dejo la parte del programa que sigue a lo que me has ayudado.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
clear all
G=zeros(1,2);
xv=[34.1848, 45.4262, 35.6877];
yv=[219.0522, 228.9690, 233.8103] ;
xg=mean(xv); % y será xg=38.4329
yg=mean(yv); %xv=[219.0522, 228.9690, 233.8103] y será xg=227.2772
G(1,1)=xg;
G(1,2)=yg;
J=roundn(G,-1); %J=[38.4, 227.3]
Zx=J(1,1); %Zx=38.4
Zy=J(1,2); %Zy=227.3
 
Coord_X=0.1:0.2: (0.1+(906-1)*0.2);
for s=1:1:906
    Zc=Coord_X(1,s);
    Zc=roundn(Zc,-1); %Zc=38.3
    if (Zx==Zc||(Zx-0.1)==Zc) %parece que con estas condiciones me funciona bien, ya que resta 38.4-0.1
        M=s
         break
    end
end
Coord_Y=0.3:0.6: (0.3+(906-1)*0.6);
V=[];
for t=1:1:906
    Zv=Coord_Y(1,t);
    ZV=roundn(Zv,-1);
    %Zv=227.1
   V=[V; [ Zy-0.3 Zy-0.2  Zy-0.1 Zy Zy+0.1 Zy+0.2  Zy+0.3  ZV Zv ]];
    if ( (Zy-0.5)==Zv  || (Zy-0.4)==Zv || (Zy-0.3)==Zv || (Zy-0.2)==Zv  || (Zy-0.1)==Zv || Zy==Zv || (Zy+0.1)==Zv ...
            ||  (Zy+0.2)==Zv  || (Zy+0.3)==Zv   || (Zy+0.4)==Zv || (Zy+0.5)==Zv || (Zy+0.6)==Zv )
        N=t
        break
    end
end
V;
 
%recorro puntos de alrededor del baricentro para ver cuál está dentro
k=-1.8;
for j=-3:0.1:3
xq=Zc+j;
yq=Zv+k;
[in]=inpolygon(xq,yq,xv,yv);
k=k+0.6;
 
if (in==1)
%cuando encontramos un punto dentro, entonces sacamos los valores de x e y de esos puntos
for s=1:1:906
Za=Coord_X(1,s);
Za=roundn(Za,-1);
if (xq==Za)
HUx=s;
break
end
end
for t=1:1:906
Zb=Coord_Y(1,t);
Zb=roundn(Zb,-1);
 
%aquí también me pasa que no es capaz de igualarlo, y no logro obtener el valor de HUy
if (yq==Zb)
HUy=t;
break
end
end
 
 
end
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