Siguiente Anterior

Operadores relacionales

Los operadores relacionales son símbolos que se usan para comparar dos valores. Si el resultado de la comparación es correcto la expresión considerada es verdadera, en caso contrario es falsa. Por ejemplo, 8>4 (ocho mayor que cuatro) es verdadera, se representa por el valor 1, en cambio, 8<4 (ocho menor que cuatro) es falsa, se representa por el valor 0. En la primera columna de la tabla, se dan los símbolos de los operadores relacionales, el la segunda, el nombre de dichos operadores, y a continuación su significado mediante un ejemplo.

Operador

nombre

ejemplo

significado

<

menor que

a<b

a es menor que b

>

mayor que

a>b

a es mayor que b

==

igual a

a==b

a es igual a b

~=

no igual a

a~=b

a no es igual a b

<=

menor que o igual a

a<=5

a es menor que o igual a b

>=

mayor que o igual a

a>=b

a es menor que o igual a b

MATLAB no dispone del tipo de dato boolean (true, false), si la expresión es verdadera da como resultado 1, si es falsa da como resultado 0.

>> 5>4
ans = 1
>> 5>6
ans = 0

El carácter ~ se obtiene manteniendo pulsada la tecla Alt y pulsando en el teclado numérico las teclas 126. Corresponde al carácter ASCII decimal 126.

Se debe tener especial cuidado en no confundir el operador asignación con el operador relacional igual a. Las asignaciones se realizan con el símbolo =, las comparaciones con ==.

Si dos escalares a y b se comparan el resultado puede ser verdadero (1) o falso (0) de acuerdo con la tabla anterior.

Si a y b son vectores de la misma dimensión, se compara cada elemento a(i) con b(i) el resultado es que el elemento (i) del vector resultado u(i) puede contener un 1 ó 0.

Si se comparan dos matrices (solamente matrices de la misma dimensión se pueden comparar) la comparación se hace elemento a elemento y el resultado es otra matriz de la misma dimensión con unos y ceros de acuerdo con el resultado de la comparación.

>> a=[15 6 9 4 11 7 14]
a=  15    6     9    4     11    7     14
>> b=[8 20 9 2 19 7 10]
b=  8     20    9    2     19    7     10
>> u=a>=b
u =
    1     0     1     1     0     1     1

Un vector o una matriz como u que contiene unos y ceros es un tipo especial de vector o matriz denominado lógico y se utiliza mucho en MATLAB como vamos a ver en esta página.

Los operadores lógicos

AND y OR trabajan con dos operandos y retornan un valor lógico basadas en las denominadas tablas de verdad. El operador NOT actúa sobre un operando. Estas tablas de verdad son conocidas y usadas en el contexto de la vida diaria, por ejemplo: "si hace sol Y tengo tiempo, iré a la playa", "si NO hace sol, me quedaré en casa", "si llueve O hace viento, iré al cine". Las tablas de verdad de los operadores AND, OR y NOT se muestran en las tablas siguientes

x

y

resultado

1

1

1

1

0

0

0

1

0

0

0

0

x

y

resultado

1

1

1

1

0

1

0

1

1

0

0

0

x

resultado

1

0

0

1

Los operadores AND y OR combinan expresiones relacionales cuyo resultado viene dado por la última columna de sus tablas de verdad. Por ejemplo:

 (a<b) & (b<c)

es verdadero, si ambas son verdaderas. Si alguna o ambas son falsas el resultado es falso. En cambio, la expresión

 (a<b)|(b<c)

es verdadera si una de las dos comparaciones lo es. Si ambas, son falsas, el resultado es falso.
La expresión " NO a es menor que b"

 ~(a<b) 

es falsa si (a<b) es verdadero y es verdadera, si la comparación es falsa. Por tanto, el operador NOT cambia el estado de verdadero a falso y de falso a verdadero.

MATLAB dispone de funciones que son equivalentes a los operadores lógicos. Estas son:

and(x,y) equivalente a x&y
or(x,y) equivalente a x|y
not(x) equivalente a ~x

Los operadores lógicos en combinación con los relacionales se pueden aplicar también a vectores,

>> a=[1 5 3 7];
>> b=[0 2 8 7];
>> u=(a>b) & (a>4)
u=
    0  1  0  0
>> u=(a>b) | (a>4)
u=
    1  1  0  1

Acceso a los elementos de un vector

Ya hemos estudiado como se accede a los elementos de un vector o una matriz a través de sus índices, en esta página vamos a ver nuevas formas de acceder dichos elementos cuando cumplen determinadas condiciones.

Para obtener los elementos del vector a que son menores que 10

>> a=[15 6 9 4 11 7 14]
a=      15    6     9     4    11     7    14
>> u=a<10
u =     0     1     1     1     0     1     0
>> c=a(u)
c =
     6     9     4     7

Como vemos el vector u=a<10 contienen unos y ceros como resultado de la comparación de cada uno de los elementos del vector a con 10. Si es menor devuelve 1 si es mayor o igual devuelve 0. Sin embargo, c=a(u) crea un vector formado por aquellos elementos del vector a que se corresponden con 1 en el vector u.

Sea el vector x=[-4,0,5,-3,0,3,7,-1,6];, vamos a contar cuantos elementos del vector x son positivos, negativos o nulos

>> x=[-4,0,5,-3,0,3,7,-1,6]
x =    -4     0     5    -3     0     3     7    -1     6
>> u=x<0
u =     1     0     0     1     0     0     0     1     0
>> ne=sum(u)
ne =     3
>> pos=sum(x>0)
pos =     4
>> cero=sum(x==0)
cero =     2

Producto de un vector por un vector lógico

Vamos a calcular el producto elemento a elemento del vector a por el vector lógico u, que utilizaremos en los siguientes apartados

>> a=[15,6,9,4,11,7,14]
a =    15     6     9     4    11     7    14
>> u =[0,1,1,1,0,1,0]
u =     0     1     1     1     0     1     0
>> a.*u
ans =
     0     6     9     4     0     7     0

Representar la parte positiva de una función

Representar la función f(x) definida del siguiente modo

f ( x ) = { cos ( x ) cos ( x ) > 0 0 cos ( x ) 0

x=0:pi/30:3*pi;
y=cos(x);
y=y.*(y>0);
plot(x,y)
set(gca,'XTick',0:pi/2:3*pi)
set(gca,'XTickLabel',{'0','pi/2','pi','3pi/2','2pi','5pi/2','3pi'})

La expresión (y>0) devuelve un vector cuyos elementos son 1 cuando cos(x) es positivo y 0 en caso contrario. El producto elemento a elemento y.*(y>0) conserva inalterados los valores positivos y los otros los hace cero.

Representar una función escalón

f ( x ) = { 2 x 0 x < 1 2 1 x < 3 x + 5 3 x < 5 0 x 5

x=0:0.01:6;
y=(2*x).*(0<=x & x<1)+2*(1<=x & x<3)+(-x+5).*(3<=x & x<5);
plot(x,y)
ylim([-0.1 2.1])

Evitando la división entre cero

Supongamos que queremos dibujar la gráfica de la función y=sin(x)/x desde -4π a 4π. Pero cuando x es cero tenemos una división entre cero. Un modo de evitar este problema es sustituir x=0 por x=eps. Si escribimos eps en la ventana de comandos obtenemos un número muy pequeño 2.2204e-016.

x=-4*pi:pi/30:4*pi;
x=x+(x==0)*eps;
y=sin(x)./x;
plot(x,y)

La expresión (x==0) devuelve un uno cuando x=0, entonces x toma el valor final x=eps que evita la división entre 0.

Evitando el infinito

Vamos a dibujar la función y=tan(x) desde -3π/2 a 3π/2. El problema es que tan(x) se aproxima a ±∞cuando x=±π/2, ±3π/2, ...

x=-3*pi/2:pi/100:3*pi/2;
y=tan(x);
y=y.*(abs(y)<100);
plot(x,y)
set(gca,'XTick',-3*pi/2:pi/2:3*pi/2)
set(gca,'XTickLabel',{'-3pi/2','-pi','-pi/2','0','pi/2','pi','3pi/2'})

abs(y)<100 devuelve un vector que es cero solamente cerca de las asíntotas (cuando la tangente es muy grande en valor absoluto), y un uno en los demás casos. Se sugiere poner un símbolo comentario % delante de la tercera línea para anularla, guardar el script y probar el efecto.

Funciones MATLAB

xor(a,b)

OR exclusivo. Devuelve 1 si un operando es verdadero y el otro es falso. Devuelve 0 si los dos son verdaderos o los dos son falsos.

>> xor(7,0)
ans = 1
>> xor(7,-5)
ans = 0

all(a)

Devuelve 1 si todos los elementos del vector son distintos de cero. Devuelve 0 si uno o más elementos son cero

> >a = [5 3 11 7 8 15];
>> all(a)
ans =1
>> b = [3 6 11 4 0 13];
>> all(b)
ans = 0

any(a)

Devuelve 1 si hay elementos del vector que son distintos de cero. Si todos los elementos del vector son cero devuelve cero.

>> a = [5 0 14 0 0 13];
>> any(a)
ans =1
>> b = [0 0 0 0 0 0 ];
>> any(b)
ans = 0

find(a)

find(a>d)

Devuelve los índices de los elementos del vector distintos de cero

Si a es un vector devuelve los índices de los elementos que son mayores que d (se puede utilizar cualquier otro operador relacional distinto a a>d)

>> a = [0 7 4 2 8 0 0 3 9];
>> find(a)
ans =2 3 4 5 8 9
>> find(a>4)
ans= 2 5 9

Vamos utilizar la función find en el siguiente ejemplo:

Las temperaturas máximas del 1 al 28 de febrero han sido:

15, 14, 10, 12, 6, 8, 12, 16, 18, 20, 17, 15, 13, 11, 9, 7, 5, 4, 6, 8, 12, 13, 15, 19, 21, 23, 16, 14

Determinar el número de días y las fechas en la que la temperatura máxima del día es mayor o igual a 15 grados centígrados

Como hemos visto, T>=15 es un vector cuyos elementos toman el valor de 1 si se cumple la condición y 0 en caso contrario.

>> T=[15 14 10 12 6 8 12 16 18 20 17 15 13 11 9 7 5 4 6 8 12 13 15 19 21 23 16 14];
>> length(T)
ans = 28
>> dias=sum(T>=15)
dias = 11
>> fechas=find(T>=15) %índices de los elementos del vector T que son >= que 15
fechas =
     1     8     9    10    11    12    23    24    25    26    27
>> length(fechas)
ans = 11

En el caso de la función all se puede emplear en sentencias de este tipo: Si todos los elementos del vector a son mayores que uno, hacer alguna tarea. Del mismo modo se puede emplear la función any.

if all(a>1)
   hacer algo...
end

Ejemplo

En siguiente vector guarda las edades de varias personas: edad=[45,47,15,23,7,60,35,28,32,10,41]. Determinar

>> edad=[45,47,15,23,7,60,35,28,32,10,41];
>> length(edad)
ans =    11
>> adultos=edad>20
adultos =     1     1     0     1     0     1     1     1     1     0     1
>> n_adultos=sum(adultos)
n_adultos =     8
>> ninhos=edad<=10
ninhos =     0     0     0     0     1     0     0     0     0     1     0
>> n_ninhos=sum(ninhos)
n_ninhos =     2
>> jovenes=edad>10 & edad<=20
jovenes =     0     0     1     0     0     0     0     0     0     0     0
>> n_jovenes=sum(jovenes)
n_jovenes =     1
>> n_ninhos+n_adultos+n_jovenes
ans =    11

Creamos un vector de datos de los pesos de las personas: peso=[70,83,45,60,25,55,90,73,65,35,78]

>> edad=[45,47,15,23,7,60,35,28,32,10,41];
>> peso=[70,83,45,60,25,55,90,73,65,35,78];
>> edad>20
ans =     1     1     0     1     0     1     1     1     1     0     1
>> peso>65
ans =     1     1     0     0     0     0     1     1     0     0     1
>> edad>20 & peso>65
ans =     1     1     0     0     0     0     1     1     0     0     1
>> sum(edad>20 & peso>65)
ans =     5
>> edad=[45,47,15,23,7,60,35,28,32,10, 41];
>> find(edad>20)
ans =     1     2     4     6     7     8     9    11
>> adultos=edad(find(edad>20))
adultos =    45    47    23    60    35    28    32    41
>> length(adultos)
ans =     8
>> edad=[45,47,15,23,7,60,35,28,32,10,41];
>> peso=[70,83,45,60,25,55,90,73,65,35,78];
>> indices=find(edad>20)
indices =     1     2     4     6     7     8     9    11
>> peso(indices(3))
ans =    60

Dado el vector v=1:16; eliminar todos los elementos que son múltiplos de tres.

>> v=1:16;
>> v(rem(v,3)==0)=[]
v =     1     2     4     5     7     8    10    11    13    14    16

 

Siguiente Anterior