2.1. Tipos de datos

Octave ofrece soporte para datos predefinidos, que incluyen escalares (reales y complejos), vectores, matrices, cadenas de caracteres y estructuras. También es posible la definición de nuevos datos por parte el usuario, programados en algún lenguaje que produzca código máquina (FORTRAN, C++, ...), aunque esta posibilidad aún no ha sido suficientemente documentada. Por este motivo en esta sección nos centraremos únicamente en los datos predefinidos (Built-in).

2.1.1. Objetos numéricos

Los objetos numéricos predefinidos de octave son los escalares (reales y complejos), y las matrices (los vectores se consideran matrices especiales, en que una de sus dimensiones es 1). Todos los datos numéricos son almacenados como números de doble precisión, lo que significa que en sistemas que usan el formato en punto flotante de la IEEE se pueden representar números en el rango 2.2e-308 a 1.7e+308 y la precisión aproximada de 2.2e-16.

Sugerencia

Los valores exactos se encuentran en las variables realmin, realmax y eps, respectivamente.

2.1.1.1. Escalares

Los números escalares se pueden especificar en formato decimal, hexadecimal (precedidos por el prefijo 0x). Los números en formato hexadecimal sólo pueden ser enteros. Los números decimales, además permiten usar notación científica, pudiéndose utilizar los símbolos e, E, d o D seguidos por un número n para significar "multiplicado por 10 elevado a la potencia n. Algunos ejemplos:

	    105
	    1.05e2
	    1050E-1
	    0x69
	  

Todos ellos representan el número 105. Para representar el número complejo 10+11i:

	    10 + 11i
	    1.0d1 + 0xBi 
	    10 + 110D-1j
	    0xA + 0xbj
	  

Recordar que i y j y sus correspondientes mayúsculas representan la unidad imaginaria, y que debe ser el último dígito de la cantidad imaginaria y sin espacios con el resto del número. Tanto 100je-1, j100 o 100 j son incorrectos.

2.1.1.2. Rangos numéricos

Un rango es una forma más cómoda de escribir un vector con elementos equiespaciados. Un rango se define como una base o primer valor del rango, un valor opcional de incremento entre elementos y un valor máximo que el rango no superará. Estos tres elementos se separan por el símbolo : (dos puntos). El incremento puede ser positivo o negativo, y en caso de omitirse se asumirá valor 1.

	    octave> 1:10
	    ans = 
	       1   2   3   4   5   6   7   8   9  10
	    octave> 1:2:10
	    ans =
	       1   3   5   7   9
	  

Sugerencia

El máximo del rango puede que no sea alcanzado en la expansión del rango. Si es necesario que forme parte del conjunto de elementos y se conoce el número de elementos que debe contener, se recomienda usar la función linspace() en su lugar.

2.1.1.3. Matrices

Es muy simple definir matrices en Octave. La definición se hace introduciendo los elementos por filas, o bien concatenando otras matrices. Las dimensiones de la matriz son determinadas automáticamente a partir de los datos. Se produce un error si alguna de las filas o columnas de la matriz final tiene distinto número de elementos que el resto. Para separar filas podemos usar ; (punto y coma) o presionar un retorno de carro.

	    octave> a = [ 1 2; 3, 4 ]
	    a =
	      1 2
	      3 4
	    octave> b = [ a a ]
	    b =
	      1 2 1 2
	      3 4 3 4
	  

Para recuperar un elemento de una matriz, simplemente tenemos que indicar el nombre de la variable seguido por unos paréntesis, y dentro el índice de fila y el de columna --en este orden-- del elemento que queramos recuperar.

	    octave> b(2,3)
	    ans = 3
	  

En el caso de un vector basta con indicar un sólo índice (el de la posición del elemento), o se puede usar la notación de dos índices, pero en este caso si el vector es un vector fila el primer índice valdrá uno y si es un vector columna será el segundo índice el que valga uno.

Para recuperar varios elementos consecutivos de una misma fila de una matriz (esto es un vector fila), usaremos un rango como segundo índice. Si en cambio queremos recuperar un vector columna, usaremos un rango como primer índice. Y si lo que queremos es recuperar una submatriz usaremos rangos tanto para el primer como para el segundo índice.

	    octave> b(1,2:3)
	    ans =
	      2 1
	    octave> b(1:2,3)
	    ans =
	      1
	      3
	    octave> b(:,2:3)
	    ans =
	      2 1
	      3 4
	  

Sugerencia

Si se desean todos los elementos de una fila o de una columna, basta con indicar el rango sólo con los dos puntos: b(1,:) nos devolvería la primera fila de b.

Sugerencia

Para más información, desde el prompt de Octave teclear help -i Matrices

2.1.1.4. Cadenas de caracteres o strings

Las cadenas de caracteres o strings, como se les denomina en Octave, son secuencias de caracteres encerrados entre comillas simples (') o dobles (").

Sugerencia

Como la comilla simple (') es también el operador de transposición, se recomienda utilizar comillas dobles (").

Algunos caracteres no pueden ser incluidos de forma literal en un string, y es necesario introducir secuencias de caracteres equivalentes (secuencias de escape). La siguiente tabla muestra las secuencias de escape:

Tabla 2-1. Secuencias de escape en strings

SecuenciaDescripción
\\Contra-barra (backslash): \.
\"Comillas dobles ". Sólo es necesario si se utilizan las comillas dobles para limitar el string.
\'Comillas simples '. Sólo es necesario si se utilizan las comillas simples para limitar el string.
\aRepresenta el carácter "alert" (normalmente suena el pitido de terminal.
\bRepresenta el carácter de borrado (backspace o control-h).
\fRepresenta el carácter "formfeed" (nueva página).
\nRepresenta el carácter "nueva línea".
\rRepresenta el carácter "retorno de carro".
\tRepresenta el carácter tabulador. Normalmente no es necesario escaparlo, pero desde la línea de comandos de Octave el carácter tabulador invoca la función de edición completar palabra.
\vRepresenta un tabulador vertical.

Las cadenas de caracteres pueden concatenarse utilizando la notación para definir matrices. Por ejemplo:

	    octave> [ "Bien" , "venidos", " al ", "curso" ]
	    ans = Bienvenidos al curso
	  

Sugerencia

Para más información, desde el prompt de Octave teclear help -i strings

2.1.2. Estructuras

Octave posee soporte para organizar los datos en estructuras. La sintaxis es muy similar a la del lenguaje C. Los datos de una estructura pueden ser de cualquier tipo. Por ejemplo:

	  octave> x.numero = 1;
	  octave> x.matriz = [1 2; 2 1];
	  octave> x.cadena = "Hola";
	  octave> x
	  x = 
	  {
	    cadena = hola
	    numero = 1
	    matriz =
	      1 2
	      2 1
	  }
	

Las estructuras son ellas mismas objetos que pueden formar parte de otras estructuras. Las estructuras se pueden copiar (operador =) pero no tienen definida aritmética ni pueden ser elementos de una matriz. En casos en que hay anidamiento de estructuras, al mostrar el valor de un objeto de tipo estructura, octave puede elegir truncar la representación de algunos miembros para evitar confusión. Por ejemplo:

	  octave> a.b.c.d=1;
	  octave> a
	  a =
	  {
	    b =
	    {
	      c = <structure>
	    }
	  }
	

Sugerencia

El número de niveles de anidamiento de estructuras que se muestra se puede cambiar con la variable predefinida struct_levels_to_print. Su valor por omisión es de 2.

Sugerencia

Para más información, desde el prompt de Octave teclear help -i struct