2.3. Operadores

Los operadores permiten construir sentencias más complejas. Es posible concatenar operaciones. Su precedencia es semejante a la de otros lenguajes, pero es posible modificarla agrupando las expresiones entre paréntesis.

Sugerencia

Para obtener la lista completa de la precedencia de los operadores teclear help -i precedence

2.3.1. Operadores aritméticos

Operan sobre escalares y matrices.

Tabla 2-2. Operadores aritméticos

OperadorDescripción
x + ySuma. Si los dos operadores son matrices las dimensiones deben coincidir. Si no el escalar se suma a cada elemento de la matriz.
x .+ ySuma elemento a elemento. Esta operación es equivalente a +.
x - yResta. El resultado es equivalente a x + (-y), donde -y representa el opuesto de y.
x .- yResta elemento a elemento. Esta operación equivale a -.
x * yMultiplicación de matrices. El número de columnas de x debe coincidir con el número de filas de y.
x .* yMultiplicación de matrices elemento a elemento.
x / yDivisión a derechas. Conceptualmente es equivalente a (inverso (y') * x')', pero sin necesidad de calcular la inversa de y ni calcular las transpuestas de las matrices.
x ./ yDivisión elemento a elemento, de los elementos de x divididos por los elementos de y.
x \ yDivisión por la izquierda. Conceptualmente es equivalente a inverso (x) * y.
x .\ yDivisión elemento a elemento, de los elementos de y entre los elementos de x
x ^ y o x ** yOperación de exponenciación. Ambos operadores no pueden ser matrices, y si alguno es matriz, deberá ser cuadrada.
x .^ y o x .** yExponenciación, elemento a elemento. Si ambos operadores son matrices, deberán tener igual dimensión.
-xNegación. Se obtiene el escalar opuesto o la matriz de igual dimensión y cuyos elementos son los opuestos de la matriz original.
+xOperador suma unitario. No tiene ninguna consecuencia sobre el operando.
x'Conjugado complejo y transpuesta. Para números reales es equivalente a la transposición.
x.'Transposición de los elementos de x. No se conjugan los elementos.
++xOperador de preincremento. Equivalente a ejecutar la expresión x=x+1 antes de acceder al valor de x
--xOperador de predecremento. Equivalente a ejecutar la expresión x=x-1 antes de acceder al valor de x
x++Operador de postincremento. Equivalente a ejecutar la expresión x=x+1 después de acceder al valor de x
x--Operador de postdecremento. Equivalente a ejecutar la expresión x=x-1 después de acceder al valor de x

Sugerencia

Si el valor de la variable predefinida warm_divide_by_zero es distinto de cero, y en algún caso se produce una división por cero, Octave imprime un aviso y continúa con las operaciones.

2.3.2. Operadores de comparación.

Todos los operadores de comparación devuelven un valor 1 si la comparación es cierta, y 0 si es falsa. Para matrices las operaciones se realizan operando a operando. Por ejemplo:

	  octave> [1 2; 3 4] == [1 3; 2 4]
	  ans =
	    1 0
	    0 1
	

Si un operador es escalar y el otro una matriz, el escalar se compara con cada elemento de la matriz y el resultado tiene las mismas dimensiones que la matriz.

Tabla 2-3. Operadores de comparación

OperadorDescripción
x < yCierto si x es menor que y.
x <= yCierto si x es menor o igual que y.
x == yCierto si x es igual que y.
x > yCierto si x es mayor que y.
x >= yCierto si x es mayor o igual que y.
x != y o x ~= y o x <> yCierto si x no es igual a y.

Sugerencia

Las comparaciones con cadenas de caracteres pueden hacerse con la función strcmp.

2.3.3. Operadores booleanos

El resultado de un operador booleano es una matriz de dimensión equivalente a los operandos, donde cada elemento es el resultado de aplicar el operador booleano a los elementos correspondientes. Se considera como cierto un valor distinto de cero, y falso un valor igual a cero.Los operadores booleanos se pueden emplear en las mismas situaciones que los operadores de comparación. Si además se utilizan en estructuras de control de flujo (if o while) sólo serán cierto si todos los elementos son distintos de cero.

	  octave> [1 0] & [1 1]
	  ans = 1 0
	

Únicamente hay tres operadores booleanos:

Tabla 2-4. Operadores booleanos

OperadorDescripción
boolean1 & boolean2Operador 'and' lógico. Cada elementos del resultado es cierto si los elementos correspondientes de los operandos lo son.
boolean1 | boolean2Operador 'or' lógico. Cada elementos del resultado es cierto si alguno de los elementos correspondientes de los operandos lo es.
! boolean o ~ booleanOperador 'not' lógico. Cada elemento del resultado toma el valor booleano opuesto al del operando.

2.3.4. Operadores booleanos "short-circuit"

Los operadores booleanos de "corto circuito" son semejantes a los operadores booleanos, con la diferencia de que si después de evaluar el primer operando, ya es suficiente para obtener el resultado, no se comprueba el segundo operando.

Tabla 2-5. Operadores binarios de corto circuito

OperadorDescripción
boolean1 && boolean2El operando boolean1 es evaluado y convertido a un escalar (el resultado es análogo a all(boolean1)). Si el resultado es falso, la operación termina con resultado falso. Si es cierto se realiza la misma operación con el segundo operando y este será el resultado de la operación.
boolean1 || boolean2El operando boolean1 es evaluado y convertido a un escalar (el resultado es análogo a any(boolean1). Si el resultado es verdadero, la operación termina con resultado verdadero. En cambio si fue falso se evalúa de la misma manera el segundo operando el resultado obtenido será el resultado de la operación.

La diferencia entre los operadores binarios normales y los de cortocircuito se verá mejor con un ejemplo:

	  octave> a=0; b=0; a & b++, b
	  ans = 0
	  b = 1
	  octave> a=0; b=0; a && b++, b
	  ans = 0
	  b = 0
	

En el segundo caso, b será incrementado sólo si a es verdadero. En el primer caso b siempre será incrementado.

2.3.5. Operador de asignación

El signo = es el operador de asignación. Después de una asignación una variable cambia de valor y de tipo para acomodarse al del nuevo valor. El operador asignación es la única manera de poder almacenar valores. En el lado derecho puede aparecer cualquier expresión de las descritas anteriormente en este capítulo, o funciones que devuelvan un valor. En el lado izquierdo podemos tener variables, elementos de una matriz o vector, o listas de valores de retorno (este concepto se aclarará en el apartado dedicado a funciones). Ejemplos:

	  octave> a=1;
	  octave> b=ones(2,3);
	  octave> b(:,1)= 2
	  b =
	    2 1 1
	    2 1 1
	  octave> [d c]= size(b);
	  octave> e=["esta " "es " "una " "cadena"];