Curso Octave PDF
Curso Octave PDF
Curso Octave PDF
http://iimyo.forja.rediris.es/
13 de junio de 2008
2
Este documento est publicado segn la siguiente licencia:
Copyright c 2008 GUILLEM BORRELL I NOGUERAS. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in
the section entitled GNU Free Documentation License.
Matlab R y MathWorks R son nombres registrados por MathWorks
NDICE GENERAL
NDICE GENERAL
NDICE DE FIGURAS
NDICE DE FIGURAS
CAPTULO 1
Introduccin
Este documento contiene el material de apoyo para el
El
ncleo es, como puede deducirse del ndice, una referencia del lenguaje Matlab de utilidad para el seguimiento
del curso. Esta referencia es parte del libro
licencia de libre distribucin que cubre con mucha ms profundidad el temario completo.
Los recursos de inters son los siguientes:
Todo el material, tanto el adaptado como el creado originalmente para este curso, puede encontrarse
en la pgina web
http://iimyo.forja.rediris.es/
a Matlab y Octave.
Introduccin informal
la Red.
A
El libro que da nombre al proyecto. Puede obtenerse tanto el cdigo fuente en L T X como un pdf
E
relativamente reciente en la seccin de descargas.
Las transparencias del curso en formato Restructuredtext en el directorio tr_y_art del rbol del
proyecto bajo los nombres
1.1.
cadiz*.rst.
qtOctave
1 y permite acceder a toda
la funcionalidad de este lenguaje, muchos usuarios preferirn emplear una interfaz grca que, por ejemplo
facilite editar y almacenar en el disco series de rdenes o programas completos, o bien acceder a determinadas
funcionalidades mediante mens o barras de herramientas.
Para ello, en el mundo del software libre, existen distintas posibilidades. Por ejemplo, el potente editor
Emacs dispone de un modo especco que puede signicar una opcin muy sugerente para interaccionar con
GNU Octave. Ahora bien, en las siguientes secciones, nos centraremos en una de las interfaces grcas de
usuario que, en la actualidad, ofrece prestaciones ms interesantes para un usuario medio: qtOctave .
Este programa recibe su nombre de las bibliotecas QT, desarrolladas con la nalidad de facilitar la
creacin de interfaces grcas.
Instalacin
qtOctave est disponible:
A travs de su pgina web,
http://qtoctave.wordpress.com/.
https://forja.rediris.es/projects/csl-qtoctave/
Ficheros
Esta
1 Utiliza la biblioteca GNU readline, ofrece la posibilidad de acceder a las lneas de rdenes anteriores mediante teclas echa
arriba/echa abajo, completar los comandos con la tecla tabulador, etc
http://software.uca.es/
ftp://guadalinex.uca.es/Octave/
http://softwarelibre.uca.es/Octave/
Por otro lado, qtOctave cuenta con soporte tcnico en nuestra universidad, a travs de la OSLUCA.
Existe un foro dedicado expresamente a ello:
http://osl.uca.es/forum.
QtOctave-0.7.2.exe).
ste guiar al usuario a travs de un sencillo proceso, al nal del cual se instalarn tanto Octave como qtOctave , adems de todos los paquetes adicionales o
toolkits
de octave-forge.
El instalador colocar un acceso directo en el escritorio a la vez que una entrada de men para qtOctave .
Utilizando cualquiera de ellos, se puede arrancar el programa.
1.1.0.1.
mucho ms fcil de instalar, ya que slo tenemos que dar los siguientes pasos:
El entorno qtOctave
La primera vez que iniciamos qtOctave , tendremos un entorno confortable, (gura
?? ), en el que podemos
Barra de men :
Barra de iconos :
Facilita el acceso a algunas entradas del men y las distintas a ventanas. Podemos
CAPTULO 1. INTRODUCCIN
3.
4.
5.
Habitualmente utilizaremos el editor y la consola para comunicarnos con Octave, utilizando el lenguaje
que se describe en las siguientes secciones.
10
CAPTULO 2
El lenguaje Matlab
2.1.
Antes de entrar en materia es importante que sepamos qu diferencias hay entre las sentencias de un
lenguaje de programacin y la biblioteca de funciones.
Las sentencias son las palabras clave independientes. Esto signica que si las eliminaremos del lenguaje
no podramos sustituirlas con ninguna combinacin del resto de sentencias del lenguaje. Esta denicin no
es estricta; algunas palabras clave comunes se consideran sentencias cuando se hace un uso muy frecuente
de ellas.
El total de sentencias y de reglas de escritura son lo que forman el lenguaje de programacin descrito en
un documento llamado
pueden ser consideradas sentencias porque estn escritas con ellas. Algunas funciones de uso muy frecuente
llegan a ser parte del mismo lenguaje, el grupo que forman se llama
sentencias y biblioteca estndar se conoce como
especicaciones
biblioteca estndar .
El conjunto de
la mayora de los lenguajes de programacin conocidos: C, C++, Ada, Fortran, Python... Matlab no es uno
de ellos.
Al ser un lenguaje sujeto a una herramienta Matlab es Matlab y punto; sin embargo podemos aplicar
estas deniciones estrictas para acercarnos a l como lo haramos con el resto de lenguajes. La organizacin
interna de Octave sigue este criterio. Se podra decir que Octave es el conjunto de sentencias mas la biblioteca
estndar y que el resto de colecciones de funciones (y hay bastantes) son los toolkits. La Compatibilidad
entre los dos se sita slo en las sentencias aunque se extiende en gran manera con la biblioteca de funciones.
Por lo menos las funciones bsicas son compatibles, casi idnticas.
Matlab tiene muy pocas sentencias. Como lenguaje es muy sencillo aunque cada versin incluye nuevas
especicaciones. En los ltimos aos se ha aadido la extensin para programacin orientada a objetos y el
diseo de interfaces grcas. Octave es ligeramente distinto en su concepcin; es ms minimista y cuenta con
muchas menos funciones pero es ms fcilmente extensible. Son las diferencias tpicas entre los productos
libres y los comerciales.
Este captulo es la referencia del lenguaje; en l veremos argumentos, variables, operadores y sentencias
que nos servirn para programar funciones y scripts as como la arquitectura general del programa. Es con
diferencia la parte ms importante del libro y no se ha dividido en varios captulos para no romper el hilo
conceptual.
Siempre que se hable exclusivamente de Matlab nos referiremos a las caractersticas comunes de Matlab
y Octave. Cuando la palabra Matlab se utilice en una diferencia respecto a Octave nos estaremos reriendo
al programa comercial. Por sencillez no se ha diferenciado tipogrcamente la palabra Matlab en los dos
contextos.
11
12
2.2. CONVENCIONES
2.2.
Convenciones
sin(x).
Veremos que la sintaxis de Matlab no es muy distinta de la de cualquier otro lenguaje; las diferencias
sern las de siempre, los smbolos de continuacin, los comentarios... Aunque sea un poco temprano los
listamos a continuacin:
'_'
Comillas simples. Sirven para introducir texto literal, todo lo que se encuentre en este entorno ser
tomado como texto y no como el nombre de una variable
_
%
Porcentaje. Es el smbolo del comentario. Todo lo que est por detrs de este smbolo en una lnea es
ignorado por el intrprete.
Almohadilla. Smbolo del comentario slo soportado por Octave. Es muy til cuando se quieren aadir
...
Tres puntos. Al aadir alguno de estos dos smbolos al nal de una lnea signica que se tomar la
posterior como continuacin
Barra invertida. El smbolo de continuacin de C, C++ y Python tambin est soportado en Octave.
Punto y coma. Smbolo de retorno de carro. Sirve para concatenar ms de una sentencia en la misma lnea
y para inhibir la salida por consola del resultado.
Importante:
El punto y coma al nal de una sentencia explicita el retorno de carro e inhibe que salga el
2
0,11/2
0,4
21/3
b
cd
e
gf
>> a /( b /c ^d -e /g ^f )
Los parntesis sirven para variar el orden normal de las operaciones a realizar.
1 Todos los lenguajes interpretados procesan el cdigo con una herramienta llamada parser. El parser lee cada lnea y distingue
las palabras clave, las variables y los argumentos para que el intrprete pueda hacer su trabajo sin problemas.
13
1
2
trapz
Esta es una caracterstica comn de casi todas las consolas existentes, ya sea una consola de UNIX o el
Command Prompt de Windows. La consola grca de Matlab es un poco ms potente gracias a su interfaz
(gura
??):
exit
<CTRL>-c
Reescribe lneas anteriores. A medida que presionemos este carcter aparecern en la lnea actual todos
los comandos escritos anteriormente. Una vez estemos viendo los comandos podemos movernos entre
ellos mediante los cursores.
<CTRL>+<,>
clc
2.3.
La Ayuda(I)
La manera ms fcil de acceder a la ayuda tanto en Matlab como en Octave es mediante la consola y el
comando
help.
Cada comando y funcin lleva consigo la informacin necesaria para que conozcamos su uso
>> help
{ nombre de la funcion }
help
nos aparecer una ayuda general desde donde podremos encontrar cualquiera de las funciones disponibles.
more. Si activamos el
more on activaremos el paginador de modo que cuando el texto que aparezca en pantalla se salga
Uno comando bastante til cuando trabajamos desde una consola o por red es
comando con
de la misma interrumpir el texto hasta que nosotros le pidamos que contine. Esto evita el comportamiento
2 Ms
adelante aprenderemos cmo introducir esta informacin a cualquier funcin que escribamos
Introduccin informal a Matlab y Octave
14
tan desagradable que tienen las ayudas especialmente largas en las que siempre tenemos que utilizar la
barra de desplazamiento para ver el principio. Para salir del texto sin tener que desplazarnos hasta el nal
pulsaremos la tecla
2.4.
<Q>.
Al igual que el intrprete es capaz de entender comandos mediante su consola interactiva, tambin es
capaz de leer archivos de cdigo o scripts. En el caso de Matlab los archivos asignados al intrprete son los
que terminan con la extensin
.m.
.m
que lee el intrprete. Pero el intrprete no puede saber por ciencia infusa dnde se encuentran
>> sin ( x)
Cmo sabe Matlab dnde se encuentra la funcin seno? La respuesta es que Matlab ya sabe en qu directorios
del sistema puede encontrar archivos
.m
desde su instalacin.
Signica esto que si creamos nuestras funciones debemos guardarlas en estos directorios? Ni mucho
menos. Matlab cuenta con un directorio especial en el que tambin busca funciones; es el llamado directorio
de trabajo. Si estamos utilizando la interfaz grca de Matlab lo seleccionaremos en la barra de herramientas.
Si en cambio accedemos a Matlab por consola o optamos por Octave el directorio de trabajo ser el directorio
actual (en UNIX el contenido en la variable de sistema PWD). Cada vez que se invoque una funcin en Matlab
buscar en los directorios habituales y en el directorio de trabajo.
2.4.1. Funciones(I)
Una funcin es una
unidad de programa,
externas. Las unidades de programa tpicas son las funciones, las subrutinas, las clases... Matlab basa toda su
potencia y su sencillez en el constante uso de funciones. La razn es bien sencilla; si Matlab es un programa
para clculo numrico es normal que la unidad de programa esencial sea la que tiene un signicado ms
matemtico
1
2
3
1
2
function [c ]= suma (a ,b )
c =a +b ;
Y lo guardaremos en un archivo que se llame igual que la funcin; en el caso del ejemplo ser
suma.m.
2.4.2. Scripts
Los scripts hacen la funcin de un programa completo, su hilo de sentencias tiene un principio y un nal
y no necesita actuar con ninguna variable externa al cdigo. La diferencia entre un script y un archivo de
cdigo fuente es que el script es una transcripcin literal de comandos de consola; se dice que es
secuencial.
3 El comando end slo es necesario en Octave cuando queremos acoplar funciones en los scripts o ms de una funcin en un
mismo archivo. En Matlab no es necesario porque cada funcin est asociada a un nico archivo, el nal del mismo hace de
textttend.
15
Esto no nos permite explotar las posibilidades de los formatos libres ni utilizar secuencias de control tipo
goto4 .
.m
Dentro del intrprete. Si hemos guardado el archivo en alguno de los directorios de bsqueda de
funciones el intrprete ejecutar toda la secuencia de comandos introducindole el nombre del script
>> nombre_del_archivo
Fuera del intrprete. Dentro de una consola llamando el intrprete con el nombre de archivo como
argumento. Por ejemplo, en una consola cualquiera:
1
2
out
x.
La
idea es mantener las caractersticas de una funcin matemtica. Una vez la hayamos guardado en el directorio
de trabajo esta funcin puede ser llamada por el intrprete de Matlab o por cualquier script. Para probarlo
nos vamos a la consola y tecleamos:
y = 0.93383
An es pronto para algunos conceptos, hay que aclarar un par de cuestiones:
Las variables
out
usar las variables que queramos. Esta abstraccin es comn en todos los lenguajes de programacin;
la entenderemos cuando hablemos de la diferencia entre variable y argumento.
El punto y coma signica lo mismo que el retorno de carro. Tenemos que recordar siempre que la
diferencia entre hacer un retorno de carro y poner el punto y coma es que en el segundo caso el
programa no nos da ningn output. Llenaremos siempre las funciones de puntos y comas para no
recibir resultados intermedios intiles.
4 Mejor,
comparar.m
y escribimos lo siguiente en l:
16
1
2
3
4
5
>> comparar
E inmediatamente va a aparecer la gura
??:
Comparacion sin vs aprsin
aprsin
sin
1.5
0.5
-0.5
-1
-1.5
-2
-3
-2
-1
Esto implica que cada archivo slo puede contener una cabecera . Si pensamos un poco tambin vemos
5 Puede
contener ms funciones pero slo se puede llamar una. Esta es la funcin que tenga la cabecera en la primera linea
cuyo nombre coincida con el nombre del archivo. Esta funcin puede llamar a otras funciones que se pueden encontrar en el
mismo archivo, pero nunca podremos acceder desde fuera a las subfunciones puesto que Matlab no tiene informacin para saber
donde se encuentran
17
que en Octave se puede usar un pequeo truco para cargar varias funciones sin necesitar una cabecera.
Simplemente creamos un script cuyo nombre no coincida con ninguna de las funciones que contiene. ste
archivo lo empezamos con algo que no sea la sentencia
function
2.5.
Argumento
El concepto preciso de argumento o valor es complejo pero a nosotros nos bastar con saber que es
cualquier elemento manipulable en un cdigo. Los argumentos de un programa de simulacin numrica son
los nmeros, los ndices, las matrices, las secuencias...
Tenemos que hacer el esfuerzo conceptual de separar el concepto de argumento del de variable. Una
variable es su contenedor, es lo que les da nombre y sirve para manipularlos. Sucede lo mismo en cualquier
frmula matemtica; siempre se expresa mediante variables y toma sentido cuando stas contienen algn
argumento.
Matlab tiene varios tipos de valores y variables; en consecuencia ser valida cualquier combinacin entre
2.5.1. Matrices
Matlab no distingue entre escalares y matrices. Si se dice que Matlab es un lenguaje de clculo matricial
es porque todos los nmeros son en el fondo matrices. El nmero
1
2
3
4
5
6
7
8
>> a =1
a = 1
>> a (1)
ans = 1
>> a (1 ,1)
ans = 1
>> a (1 ,1 ,1)
ans = 1
Tampoco distingue si sus elementos son enteros o reales, todos los nmeros tienen la misma precisin en
coma otante, que es doble precisin siempre que no le indiquemos lo contrario. Las entradas
1
2
3
4
5
6
7
8
>> a =105
a = 105
>> a =1.05 e +2
a = 105
>> a =1050 e -1
a = 105
>> a =105.
a = 105
son equivalentes. Estas son las dos caractersticas ms importantes del lenguaje.
Las matrices se estiran y encogen sin ninguna limitacin ni en el tamao ni en las dimensiones. Si
intentamos llenar el dcimo elemento de un vector
inexistente
con un 1.
6 Los fsicos tericos y los matemticos encontrarn mucho ms til Python; lenguaje que probablemente desconozcan. La
extensin numrica estndar de Python, numpy, soporta el tipo array que es consistente con la denicin de tensor. Esto
permite operar con tensores de varias dimensiones de una forma mucho ms natural. Es muy recomendable echarle un vistazo,
la combinacin de Python y la coleccin de bibliotecas SciPy es una mejor opcin en el caso de aplicaciones ms complejas en
las que Matlab escale mal.
18
1
2
2.5. ARGUMENTO
foo =
0 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
y si ahora le pido
1
2
3
4
5
6
7
8
9
10
11
12
foo =
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
Vemos que el comportamiento es un poco extrao. Si nosotros utilizamos nicamente un ndice obtenemos
un vector la, mientras que en una matriz la notacin es la usual, el primer elemento es el nmero de la
y el segundo el nmero de columna. Esto nos obligar a trasponer vectores ms de una vez, sobretodo para
8 e inconvenientes.
Importante:
Las matrices se ordenan en Matlab del mismo modo que en la realidad, por las y columnas. La notacin
para diferenciar si una serie de nmeros se encuentran en la misma la o en la misma columna es el siguiente:
el espacio y la coma (,) separan elementos de una misma la
el retorno de carro y el punto y coma (;) separan elementos de una misma columna
Por ejemplo, si queremos escribir el vector la
1
2
3
4
5
6
e = (1 2 3)
lo haremos con:
1
2
3
>> f =[1;2;3]
f =
1
7 En Octave existe la variable prefer_column_vectors. Activando esta variable con prefer_column_vectors=1 el vector por
defecto ser columna en vez de la emulando el comportamiento de Fortran. Sirva esto para mostrar que Octave es totalmente
congurable.
8 El principal peligro de la asignacin dinmica de memoria es que nosotros no sabemos cundo usamos demasiada. Es muy
importante en cdigos no usar ms memoria en ningn momento que la RAM disponible, porque en el caso que 'pisemos' fuera
de la RAM, el proceso empezar a escribir sobre el disco duro y el rendimiento puede bajar hasta en dos rdenes de magnitud.
El problema es que en ste caso lo hacemos sin querer y adems el programa no nos avisa. Es bueno entonces tener algn
monitor del sistema que nos diga cunta memoria estamos usando en tiempo de ejecucin y si estamos pisando fuera, es decir,
escribimos en el espacio 'swap'.
19
2
3
>> f =[1
> 2
> 3]
f =
1
2
3
Esta es exactamente la misma notacin que se sigue para introducir una matriz entera. Lo intentamos con:
1
4
7
1
2
3
4
5
2
5
8
3
6
9
1
2
3
4
5
6
7
>> m =[1 2 3
> 4 5 6
> 7 8 9]
m =
1 2 3
4 5 6
7 8 9
La llamada simple a un elemento cualquiera de una matriz se hace indicando su la y su columna por ese
orden. En el caso de la matriz
1
2
m:
>> m (2 ,1)
ans = 4
Aprenderemos a crear matrices de ms dimensiones en la seccin
2.5.1.1.
??.
tipo
de caracteres, un nmero complejo. El concepto en el mbito del clculo numrico va mucho ms all. Se
llama
tipo
un nmero podemos hacerlo en varias representaciones; coma otante de simple precisin, entero de 32 bits...
Antes hemos hablado de la conguracin por defecto de Matlab que almacena todos los elementos de una
matriz como reales de doble precisin (64 bits o 8 bytes).
Todo lo dicho anteriormente para la representacin interna de nmeros es vlida slo por defecto. En
ningn momento armamos que el nico tipo de escalar posible es el real de doble precisin. Podemos denir
explcitamente nmeros ,es decir, matrices; con tipos distintos al real de doble precisin (DOUBLE).
Los tipos soportados por matlab son los mismos que C excepto por el tipo
long double
(real de 128
bits). Esta representacin tiene una limitacin evidente; como la formulacin de los argumentos en Matlab
es matricial slo podremos tener matrices de un nico tipo. No podremos construir matrices con elementos
enteros y elementos reales a la vez. Esta es una limitacin comn a todos los lenguajes de programacin y
viene dado por la manera en la que cualquier programa reserva (alocatea) memoria. Por ejemplo, si deseamos
operar con matrices de nmeros enteros de 8 bits utilizaremos la funcin
1
2
int8
20
3
4
2.5. ARGUMENTO
1
127
2
83
1
2
3
4
2.5.2. Secuencias
Son parecidas a los vectores pero no lo son. Aparecen por todos los elementos del lenguaje, en las
submatrices, en los contadores en el funcionamiento interno de muchas funciones... Siempre que necesitemos
contar algo aparecern las secuencias porque
una lista de nmeros que nos cuente del
1
2
3
al
10
Si queremos
10
en
sucesivos:
1
2
3
2.5.2.1.
Contadores no enteros.
Las secuencias soportan intervalos distintos a los nmeros enteros. Podemos introducir la secuencia:
1
2
3
4
5
6
>> 0:0.5:4
ans =
Columns 1 through 8:
0.00000 0.50000 1.00000
Column 9:
4.00000
1.50000
2.00000
2.50000
3.00000
3.50000
1
2
3
>> 0:0.52:4
ans =
0.00000 0.52000
1.04000
1.56000
2.08000
2.60000
3.12000
3.64000
sin pasarse.
21
Evidentemente este tipo particular de contadores no son adecuados para contar ndices porque genera nmeros no enteros. Su utilidad se encuentra en la discretizacin de intervalos necesaria, por ejemplo, en los
ejes de coordenadas.
2.5.3. Submatrices
Para asignar partes de matrices a variables o operar dentro de una matriz con una parte de la misma es
necesario asignarles una secuencia de ndices. Se puede decir que la submatriz se genera
contando
los ndices
de la primera Para entender mejor cmo funciona este tipo de asignaciones mejor hacerlo mediante ejemplos.
Iniciaremos una sesin en Matlab creando una matriz de nmeros aleatorios:
1
2
3
4
5
6
7
0.871166
0.210789
0.254009
0.115706
0.507355
0.606412
0.163542
0.818164
0.336303
0.814160
bar
0.867716
0.639094
0.091934
0.478042
0.792253
de la tercera a la quinta.
1
2
3
4
5
6
0.639094
0.091934
0.478042
0.792253
Pero las secuencias tienen la capacidad de contar de modos distintos, en el caso siguiente contaremos las las
de 2 en 2 como muestra el siguiente ejemplo. En l crearemos una submatriz
qwe
foo
las las de la primera a la quinta de 2 en 2 (la primera, la tercera y la quinta) y las columnas de la primera
a la tercera.
1
2
3
4
5
i
1
como
j, I
J.
crear vectores, matrices y tensores de nmeros complejos, y al buscar un ndice en ellos tendremos el nmero
complejo completo.
22
2.6. OPERADORES
Adems del nmero
racionales
como
pi
i tenemos
e.
1
2
>> saludo
saludo = hola que tal
En Octave tambin son vlidas las comillas dobles:
1
2
1
2
>> [ ' me ' ,' gusta ' , ' el ' , ' furbo ']
ans = megustaelfurbo
o en columna
1
2
3
4
5
6
>> [ ' me '; ' gusta '; ' el '; ' furbo ']
ans =
me
gusta
el
furbo
2.6.
true
false.
Operadores
Cuando operamos elementos en Matlab, como cuando lo hacemos en cualquier lenguaje de programacin,
debemos tener en cuenta la dicotoma entre variable y argumento. Es tan importante porque debemos
comprender perfectamente la sutileza de que los operadores no operan variables sino argumentos, en el caso
de Matlab, matrices.
La consecuencia directa es que todos los operadores de Matlab son matriciales. En algunos casos, como
la suma o la resta, los operadores matriciales son equivalentes a lo escalares (
elementwise 9
o elemento a
1
2
9 Elementwise
1
2
3
4
5
>> A *B
ans =
30
24
84
69
138 114
23
18
54
90
Y si queremos una operacin escalar? Todos los operadores de Matlab pasan de matriciales a
escalares aadiendo un punto justo antes del smbolo del operador. En el caso de las matrices
anteriores:
1
2
3
4
5
>> A .* B
ans =
9 16
24 25
21 16
21
24
9
>> A ^2
Sea equivalente a:
>> A *A ;
Operacin que es matricialmente del todo lgica. Este comportamiento provoca dos errores tpicos.
1. El operador se negar a elevar a un exponente matrices que no sean cuadradas.
2. Cuando el exponente es fraccionario da resultados que aparentemente no tienen ninguna lgica
Un ejemplo claro es lo que nos encontramos cuando elevamos la anterior matriz a una burda aproximacin
del nmero
1
2
3
4
5
>> A ^3.14
ans =
691.22 1567.33 2443.44 +
0.43 i
0.05 i
0.34 i
0.12 i
0.01 i
0.09 i
1009.17 +
2284.47 +
3559.76 -
0.20 i
0.02 i
0.15 i
Nmeros complejos?
El problema es que en Matlab cualquier argumento puede ser una matriz; olvidarnos el punto antes de
utilizar la potencia...
1
2
3
4
5
>> A .^3.14
ans =
1.0000
77.7085
450.4098
8.8152
156.5906
685.0189
31.4891
277.5843
991.5657
es uno de los errores ms comunes. Por suerte los errores suelen ser tan evidentes que la sangre raramente
llega al ro. El problema llega cuando elevamos al cuadrado matrices cuadradas. Los resultados obtenidos
con el operador matricial y escalar son parecidos y del mismo orden de magnitud con lo que pueden ser un
gran escollo en el proceso de depuracin.
Suma. Si ambos operandos son matrices el nmero de las y columnas debe ser el mismo. Si uno de los
dos operandos es un escalar su valor es sumado a todos los elementos del otro
24
2.6. OPERADORES
x-y
Resta. Las consideraciones sobre matrices son las mismas que con el operador suma.
x*y
Multiplicacin matricial. Si ambos elementos son matrices el nmero de las y de columnas debe ser el
mismo. Si uno de los dos operandos es un escalar su valor es multiplicado a todos los elementos del
otro.
x.*y
Multiplicacin elemento a elemento. Si ambos operandos son matrices el nmero de las y de columnas
debe coincidir.
x/y
(y )1 x
con la diferencia que en este caso no se calcula la inversa. En el caso que la matriz
10 .
no sea cuadrada
x./y
x\y
y.
x1 y
y sirve para resolver sistemas de ecuaciones lineales. Como en la divisin anterior no se calcula efectivamente la inversa de la matriz, de modo que en el caso que no sea cuadrada seguir dando un resultado.
Analizaremos este operador con mucha ms profundidad en el apartado dedicado a lgebra lineal.
x.\y
elementwise.
x^y
x**y
y si
elevado a la potencia de
y.
Si
es un
**
como
veces
son
x.^y
x.**y Potencia elementwise. Si los dos
.** slo se puede usar en Octave
-x
Negacin
x'
tamente el mismo que para la traspuesta. Si hay algn argumento complejo el operador es equivalente
a hacer
x.'
conj(x.').
Traspuesta
10 Esto
11 Esta
elementwise
25
Verdadero si
es menor que
y.
x<=y
Verdadero si
x==y
Verdadero si
es igual que
x>=y
Verdadero si
x>y
Verdadero si
es mayor que
y.
y.
y.
y.
x!=y
x~=y
Verdadero si
x es distinto que y . En Octave son vlidos ambos signos mientras que Matlab slo soporta
el segundo.
if
while.
&
para y,
para no. Si decimos que operan con matrices es porque aplicados a matrices de condiciones
1
2
3
4
5
6
7
8
0 para falso
binaria usual.
Para componer expresiones lgicas se usan los smbolos
y distinto de
y los anteriores es que el resultado siempre ser booleano. Si se aplica a una matriz colapsar sus elementos
con la funcin
all
para llegar a una expresin nica. Como ya hemos dicho antes su aplicacin principal se
if
while.
1
2
3
4
5
6
7
8
9
10
bitset
bitxor
bitor
bitshift
entero
tiene esta representacion decimal
%Reset del primer bit
%Set del sexto bit
operacin sera:
fft(fft(a).').'
Esta tontera bien puede haceros perder un da, como a mi, o un par de ellos por culpa de resultados que parecen vlidos.
Mucho cuidado.
A ttulo de opinin personal creo que este es un gran fallo en la sintaxis general de matlab. Hay ms, incluso peores. Esto
debera corregirse como en otros lenguajes donde los operadores tienen su forma abreviada (*) y una forma equivalente como
funcin
Introduccin informal a Matlab y Octave
26
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2.7. VARIABLES
>> dec2bin ( a)
ans = 100100
>> b= bitset (1 ,6) % Una forma alternativa de set
b = 33
>> dec2bin ( b)
ans = 100001
>> bitand (a ,b ) % y logico
ans = 32
>> dec2bin ( bitand (a ,b ) ) % En bits ...
ans = 100000
>> bitor (a , b) % o logico
ans = 37
>> dec2bin ( bitor (a , b) ) % En bits ...
ans = 100101
>> bitxor (a ,b ) % o exclusivo logico
ans = 5
>> dec2bin ( bitxor (a ,b ) ) % En bits ...
ans = 101
2.7.
Variables
Debemos pensar en ellas como cajas que ocupan memoria, independientemente de lo que lleven dentro.
Debe abstraerse la variable del argumento que contenga, en el fondo no es ms que un nombre.
Por el hecho de ser un lenguaje de scripting las variables no deben declararse. Esto hace que programar
sea mucho ms sencillo, se haga con menos errores y en menos tiempo a costa de un mayor tiempo de
ejecucin. Esto tambin signica que la cantidad de memoria asignada a una variable es dinmica, podemos
12 sin ningn problema con el simple hecho de llenar un elemento que no exista.
13
Aquello que nosotros asignamos a una variable se llamar argumento . A cada variable le asignaremos
uno o varios argumentos, de modo que la variable no es ms que un nombre por el que llamamos su contenido.
Las variables pueden ser cualquier secuencia de letras, no hay limitacin en su nmero, slo que deben
empezar con un carcter tipo letra o con _ . Se distingue entre maysculas y minsculas. Los nombres
siguientes seran vlidos:
1
2
3
4
x
x15
__hola_que_tal__
fjalsbdgaoqiwbodj
El nombre de una variable es una funcin en s misma, llamada sin argumentos sacar por pantalla el valor
de la variable. Algunas variables tienen un valor por defecto como
pi
ans.
parte de la conguracin interna del programa as que es importante conocerlas para no tener sorpresas
desagradables.
??.
principal y en un instante de la ejecucin somos el argumento de una funcin. No nos sucede absolutamente
nada. Otra variable va a tomar nuestro valor en la cabecera de la funcin y su resultado se va a volcar en el
programa principal. A no ser que el resultado se nos asigne, cambiando nuestro valor, seguir sin sucedernos
nada. En cambio las variables locales para la funcin son eliminadas de la memoria cuando termina su
ejecucin.
Si le damos a una variable el atributo de
global
ser vista por cualquier unidad de cdigo sin necesidad de llamarla en su cabecera. A estas variables no les
12 Ampliar una matriz es exactamente equivalente que asignar ms memoria a una variable. En Fortran sera dealocatear una
variable, ampliarla y alocatearla otra vez.
13 El concepto de argumento en programacin es mucho ms extenso, pero creo que es conveniente usarlo de este modo.
27
Figura 2.3: Comportamiento normal de una variable llamada por una funcin
importa si estn en el programa principal o en una funcin, su contexto es toda la ejecucin; pueden saltar
a cualquier hilo como en el esquema de la gura
??:
1
2
3
4
5
6
7
8
9
>> global x =2
>> x
x = 2
>> function f ()
global x
x =3
end
>> f ()
x = 3
Como se ve debemos tener cuidado con los nombres de las variables globales, no es difcil estropear el cdigo
llamando una variable global en una funcin sin querer
14 .
14 El uso de las variables globales es una de las pocas discusiones de estilo abiertas. En otros lenguajes de programacin, sobre
todo los que permiten la programacin orientada a objetos, no es necesario utilizar este tipo de variables. Es una discusin
entre dos escuelas. Los que estamos ms acostumbrados a una programacin modular (Fortran) nos sentimos ms cmodos
controlando el hilo de ejecucin con variables globales. En cambio, la escuela procedente de C++ y de Java preeren crear
mtodos mucho ms ricos en los que las funciones son en realidad mtodos de un objeto que puede haber sido inicializado
previamente.
Creo que para un principiante el uso de variables globales es un buen ejercicio mental para aprender que hay distintos niveles
de ejecucin en la programacin modular sin entrar en conceptos que muchos usan pero slo unos pocos entienden.
28
2.7. VARIABLES
Un tercer atributo es el de
persistent
persistent.
estamos imponiendo que esta variable se guarde en memoria para la siguiente vez que se llame
??.
persistent
variables locales para el hilo principal no se destruyen hasta que termina la ejecucin.
is_global
clear
que devuelve un
que borra el contenido de una o varias variables, funciones o variables globales dependiendo del
who que da una lista de las variables que en aqul mismo momento estn ocupadas por algn argumento.
Tambin acepta parmetros para variar su comportamiento.
whos
, lo mismo que
Importante:
who
Es necesario entender el concepto de variable local y global para comunicar funciones y scripts
2.7.3. Contenedores
La limitacin las matrices es que slo pueden contener elementos de un mismo tipo. Una matriz no puede
contener una cadena de caracteres y un nmero a la vez. Si sumamos mentalmente dos matrices entenderemos
facilmente por qu.
Necesitemos entonces denir un
es una
extensin del concepto de argumento en el que se permite que una variable contenga un argumento mltiple
con elementos de distinta naturaleza. Un tipo derivado es lo que permite asignar a una variable un nmero
y una cadena de caracteres a la vez.
La estructura tpica de los tipos derivados es la que tiene forma de rbol. Son llamadas
datos.
estructuras de
En ellas, una variable primitiva contiene ms variables adicionales que a su vez pueden contener
ms ramicaciones. Otro tipo es emular el comportamiento de una matriz o un vector y permitir que sus
elementos sean de tipos distintos. Obviamente esta ganancia de potencia se pierde en los operadores. Una
matriz puede ser sumada a otra matriz, en cambio un tipo derivado no puede ser sumado a otro tipo derivado
ya que Matlab no tiene ninguna informacin de qu contiene cada uno.
Esto hace que la lnea divisoria entre el concepto de variable y el de argumento se difumine. Podemos
pensar en una matriz como un nico argumento donde todos los elementos son del mismo tipo y los tipos
derivados como estructuras de variables. Entrar en sutilezas tericas no es muy conveniente, simplemente
debemos centrarnos en la gran utilidad de las estructuras de datos o las celdas de variables ya que permiten
agrupar en forma de nica variable estructuras ms complejas de lo habitual.
2.7.3.1.
29
Estructuras de datos
Octave, al igual que la mayora de los lenguajes de programacin modernos, nos permite agrupar variables
en estructuras tipo rbol. Podemos entonces agrupar distintos tipos de argumentos dentro de una variable.
Para probar esta posibilidad vamos a escribir un script de prueba que se va a llamar
1
2
3
4
5
6
7
estructura.m.
% estructura .m
% Este es el script de prueba para las variables de tipo estructura
foo . num =1.234;
foo . string = ' hola mundo ';
foo . options . option1 = true ;
foo . options . option2 = false ;
Lo guardamos en el directorio correspondiente y si nos vamos a la consola y tecleamos
estructura
qu
obtenemos? Pues nada en absoluto porque le hemos pedido con los puntos y coma que no nos sacara ninguna
informacin por pantalla. Si queremos que nos diga qu hay dentro de la variable
foo
debemos teclear
foo
1
2
3
4
5
6
7
8
9
10
11
12
>> estructura
>> foo
foo =
{
num = 1.2340
options =
{
option1 = 1
option2 = 0
}
string = hola mundo
}
que es exactamente la estructura de argumentos que hemos introducido
comentarios en un script de Matlab, con el signo %. Todo lo que escribamos a partir de ste smbolo ser
ignorado por el intrprete.
Adems de muchas otras, la mayor utilidad de las variables de tipo
estructura
acortar las cabeceras de las funciones. Pongamos como ejemplo un programa que se congura con unos
veinte parmetros. Si una funcin necesita quince de ellos signica que cada vez que llamemos a la funcin
en nuestro cdigo aparecer una cabecera con quince variables. Esto hara el cdigo ms pesado de escribir
y mucho ms difcil de leer y mantener. Podemos poner todos nuestros parmetros dentro de una variable
que se llame
parms,
2.7.3.2.
Longitud,
parms.Longitud.
parms
en
Cell Arrays .
Las celdas son matrices o hiper-matrices de variables. No debemos confundirlas con las matrices usuales
que son estructuras de argumentos del mismo tipo. Una celda puede contener matrices, cadenas de texto y
argumentos lgicos a la vez siempre que estn en celdas separadas. A diferencia de las estructuras de datos
no tendremos que asignar un nombre a cada una de las celdas porque ya se les asignar un grupo de ndices.
Podemos construir celdas de dos modos, el primero es declarar una variable como
cell
y darle una
dimensiones. Por ejemplo construiremos una celda de 2 por 2 cuyos elementos parecidos a los contenidos en
la estructura de datos
1
2
3
foo:
queremos que Octave nos saque cualquier argumento por pantalla podemos usar la funcin disp(). En este caso al nal
de nuestro script podramos aadir:
disp('nuestra estructura es')
disp(foo)
30
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2.7. VARIABLES
[1 ,1]
[2 ,1]
[1 ,2]
[2 ,2]
=
=
=
=
[]
[]
[]
[]
}
>> foo {1 ,1}=1.2340;
>> foo {1 ,2}=[1 ,2;3 ,4];
>> foo {2 ,1}= ' hola mundo ';
>> foo {2 ,2}= true ;
>> foo
foo =
{
[1 ,1] = 1.2340
[2 ,1] = hola mundo
[1 ,2] =
1 2
3 4
[2 ,2] = 1
}
Como en el caso de las matrices convencionales podremos ampliar las celdas con slo llenar una que no tenga
ningn argumento asignado; las celdas sobrantes quedan vacas:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
foo
>> foo ={1.2340 ,[1 ,2;3 ,4]; ' hola mundo ' , true }
foo =
{
[1 ,1] = 1.2340
[2 ,1] = hola mundo
[1 ,2] =
1 2
3 4
[2 ,2] = 1
}
Importante:
Las celdas pueden almacenar cualquier tipo de argumento, incluso funciones. Es ms fcil y
2.7.3.3.
No todo en un lenguaje de programacin son aplicaciones sencillas donde escalares, vectores y matrices
bastan. Tampoco es cierto que el dato ms complejo suelen ser los argumentos que pasamos a las funciones.
Un programa puede requerir variables que contengan tipos de gran complejidad, normalmente obligados por
el propio algoritmo.
Supongamos que intentamos una poblacin de datos especialmente compleja, algo usual en una base
de datos. Pongamos como ejemplo una descripcin de todos los trabajadores de una empresa. Esto es un
31
ejemplo, seguramente no utilizaremos un lenguaje de programacin orientado a clculo numrico para resolver
un problema como este pero otras aplicaciones como los algoritmos genticos pueden requerir tipos derivados
especialemnte complejos.
Sigamos con el ejemplo deniendo nuestro tipo Empleado. Cada empleado de la empresa proporciona los
siguientes datos:
Nombre completo
Nacionalidad
Documento de identidad
Tipo
Nmero
Fecha de expedicin
Fecha de caducidad
Direccin de contacto
Nmeros de telfono
Cuando nuestros datos son muy complejos solemos pensar durante largo tiempo el mtodo ms adecuado
de almacenar todos los datos. Crear una variable para cada trabajador no es muy recomendable porque es
probable que tengamos que iterar sobre el total de ellos. Tampoco parece muy inteligente partir todos los
datos en varias matrices y relacionarlas segn los ndices.
La abstraccin llevada a los lenguajes de programacin modernos tiene una consecuencia muy importante:
debemos ser capaces de seguir uilizando las mismas herramientas de programacin sea cual sea el dato con
el que estemos trabajando. Si un lenguaje se ha diseado con el paradigma de la abstraccin como prioridad
podremos seguir escalando la complejidad de las estructuras de datos tanto como queramos sin perder las
herramientas de clculo. Matlab no es un prodigio en este sentido pero se deende bien.
El elemento que mantiene la escalabilidad en las estructuras complejas de datos son los cell arrays. Al
seguir una estructura matricial pueden encapsularse tantos cell arrays como queramos. Pueden contener
tanto los tipos bsicos (nmeros y cadenas de texto) como estructuras de datos o otras celdas. De este modo
podemos denir la estructura empleado del siguiente modo:
1
2
3
4
5
6
7
8
9
10
11
12
>> Empleado1 ={ ' Paquito Palotes Parrondo '; ' Deaqui ';
... { ' DNI ' ,646843216 ,12122000 ,12122000};
... 'C Buenaesperanza 12 1 ,2 ';
... [666251487 ,555698541]}
Empleado1 =
{
13
14
15
16
17
18
19
20
21
22
[1 ,1]
[1 ,2]
[1 ,3]
[1 ,4]
=
=
=
=
DNI
646843216
12122000
12122000
[4 ,1] = C Buenaesperanza 12 1 ,2
[5 ,1] =
666251487
555698541
Introduccin informal a Matlab y Octave
32
23
24
2.8. SENTENCIAS
}
Lo novedoso es que mantenemos la escalabilidad de la estructura indenidamente. Podemos sin ninguna
restriccin encapsular todos los empleados en la variable Empresa como si fueran elementos de una la en
una celda:
2.8.
Sentencias
Como se ha dicho antes, las estructuras esenciales del lenguaje son los contadores y los condicionales.
Ms comnmente conocidas como las sentencias
resto de lenguajes de programacin y de scripting existentes. La primera es un bucle contador que permite
ejecutar varias tareas idnticas secuencialmente con la variacin de diversos ndices; se pueden encapsular
con otros contadores y con otras sentencias. La segunda permite incluir variaciones en la ejecucin del cdigo
segn el cumplimiento de ciertas condiciones lgicas.
Estos no son las nicas estructuras de programacin, son las ms bsicas. A partir de ellas se derivan
sentencias ms tiles y ms especcas como veremos a continuacin.
Al igual que las funciones, las sentencias tienen un principio y un nal denido iniciado por una palabra clave. Matlab utiliza la notacin clave-cuerpo-end al igual que Fortran; C, por ejemplo delimita estas
estructuras mediante llaves y Python utiliza el sangrado.
En este caso Matlab y Fortran presentan una diferencia esencial. Mientras Fortran tiene un cierre para
cada una las estructuras;
sistemtico de
end
endfor, endif...
do
end do,
end.
El uso
puede llevar a confusiones nefastas, es por ello que Octave tambin soporta el uso de
2.8.1. La sentencia if
Tenemos tres formas de condicional. La ms simple es:
1
2
3
if ( condicion )
cuerpo
endif
Por ejemplo:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
if ( condicion )
cuerpo 1
else
cuerpo 2
endif
Ejemplo:
1
2
3
4
5
6
7
33
1
2
3
4
5
6
7
8
9
10
if ( condicion 1)
cuerpo 1
elseif ( condicion 2)
cuerpo 2
...
elseif ( condicion n)
cuerpo n
else
cuerpo N
endif
16 Debe recalcarse que la condicin debe ser sobre la misma variable para cerrar la lgica del condicional.
En el caso que tengamos condiciones lgicas sobre ms de una variable podemos encapsular los if sin ningn
problema:
1
2
3
4
5
6
7
8
9
if ( condicion a)
if ( condicion b)
cuerpo a +b
else
cuerpo a + bN
endif
else
cuerpo aN
endif
Es importante que evitemos estructuras lgicas muy complejas, porque son difciles de entender y de depurar;
an cuando las ha escrito uno mismo. Se vern ejemplos de estas estructuras en la seccin de ejercicios.
1
2
3
4
5
6
7
8
switch ( variable_switch )
case ( posible_valor_variable_switch )
comandos
case ( posible_valor_variable_switch )
...
otherwise
comandos adicionales
endswitch
Esta sentencia es la misma que
case
en Fortran y
switch
cuidado los programadores acostumbrados a Fortran, sea cual sea la variante. Si nosotros usamos else if en vez de
elseif, Matlab va a pensar que tenemos dos sentencias separadas, es decir, primero un else y luego un if dentro del else. Esto
signica que tenemos una ejecucin anmala en vez de un error. Es uno de estos casos en los que el programa nos ejecuta, nos
da un resultado errneo y nosotros no vemos de ninguna manera el error de programacin
Introduccin informal a Matlab y Octave
34
2
3
4
5
6
7
8
9
10
2.8. SENTENCIAS
1
2
3
do
for i =1:2:10
dentro del bucle la variable
1
2
>> 1:2:10
ans = 1
3
i tomar los valores que salen por pantalla en el caso que llamemos la secuencia:
9
Por ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
35
endfor
endfor
En vez de controlar el bucle mediante un contador es muy til controlarlo mediante una condicin lgica.
Para eso podemos usar una estructura
1
2
3
while.
while ( condicion )
cuerpo
endwhile
Ejemplo:
1
2
3
4
5
6
7
8
9
10
>> a =0;
>> while a <5
... disp ( a )
... a= a +1;
... end
0
1
2
3
4
Slo debemos tener en cuenta cuando programamos que el uso de un while es mucho ms crtico que
el uso de un for. Esto es porque la condicin lgica que controla el bucle debe aplicarse sobre una variable
interna en el bucle. Entonces es probable que si programamos mal, la variable que usamos como control nunca
llegue a cumplir la condicin que nos para la ejecucin. En Matlab o Octave no suele ser un gran problema,
puesto que el sistema puede reaccionar y cortar el proceso de otro modo, pero en otros lenguajes puede tener
consecuencias bastante desagradables. Tambin debemos tener en cuenta que los bucles controlados por una
condicin lgica no permiten la paralelizacin en el caso que tengamos una versin para varios procesadores
de Matlab o Octave.
2.8.3.1.
en cada iteracin, es decir, el bucle no es consciente de las operaciones que se realicen con el ndice.
En otros lenguajes de programacin como C o Fortran sucede todo lo contrario: todas las operaciones
con el ndice son vlidas porque el bucle no se encarga de reasignarle el valor siguiente. Se limita a darle un
valor inicial, incrementarlo el entero dado y pararlo segn una condicion lgica.
El bucle
for
17 sobre un vector.
En la programacin moderna los bucles han desaparecido en favor de los iteradores porque los segundos son
mucho ms polivalentes y seguros. Para demostrar qu signica esto de iterador sobre un vector nos sirve
este simple ejemplo. Generaremos una serie de Fibonacci en un vector y luego iteraremos sobre el mismo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
36
2.8. SENTENCIAS
Son ms seguros porque permiten iterar sobre una secuencia tan compleja como sea necesaria sin arries-
garse a denir una condicin sin n. Esta propiedad deja con poco uso la sentencia
while
mucho menos
while
for
como para los otros tipos de bucles tenemos variables de control de la ejecucin que
break
1
2
3
4
5
6
7
8
9
10
11
12
13
num =103;
div =2;
while ( div * div <= num )
if ( rem ( num , div ) == 0)
break ;
endif
div ++;
endwhile
if ( rem ( num , div ) == 0)
printf ( ' El divisor menor de %d es %d \ n ' , num , div ) ;
else
printf ( ' %d es primo \ n ' , num ) ;
endif
En cambio la sentencia
continue, en vez de sacarnos del bucle, hace que saltemos uno de los pasos del mismo
1
2
3
4
5
try
son de la forma:
try
cuerpo
catch
alternativa
end
Por ejemplo:
1
2
3
4
5
6
7
if-else
produce o no un error. Se usar cuando no sepamos si algo puede ejecutarse bien o no y no queramos que
el error afecte al resto de la ejecucin del programa. Primero intentar ejecutar la sentencia que hayamos
puesto en
cuerpo y si devuelve un error ejecutar alternativa ignorando el error producido por la primera
sentencia.
18 Se llama hilo precisamente a la lnea de ejecucin. Nos la podemos imaginar como la lnea de cdigo que siguen los procesos.
Este concepto va ligado ntimamente a la gestin de procesos y tiende a complicarse en lenguajes como C o Fortran.
2.9.
37
Funciones (II)
Tratar la funcin en Matlab slo desde el punto de vista de un archivo auxiliar es un tremendo error.
La escritura y manipulacin de funciones es la mayor potencia (probablemente la nica) del lenguaje. Este
planteamiento choca con la formulacin bsica de la funcin y se acerca ms a los lenguajes orientados a
objetos donde podemos asignar un mtodo a una variable, algo impensable en Fortran. Siendo poco rigurosos
podemos decir que si C++ es un lenguaje orientado a objetos Matlab es orientado a funciones.
sin y cos, muchas de las presentes en la coleccin ni nos sonarn. Cumple el objetivo principal de ahorrarnos
tener que escribir cualquier funcin mnimamente conocida. El nombre que reciben estas funciones suele ser
bastante descriptivo; la funcin
se llamar
su velocidad sea mayor. No debemos tener miedo a usarlas tanto como sea posible.
2.9.2. La Ayuda(II)
Ya hemos hablado del comando
help
funciones de una ayuda parecida de una manera muy fcil. Todas las lneas
function
comando
1
2
3
4
5
6
7
8
help.
2
3
4
entre la sentencia
Por ejemplo:
comentadas
y la primera sentencia ejecutable nos saldrn por pantalla si llamamos a la funcin mediante el
help derivada_numerica
funcion derivada_numerica
Calcula las diferencias centradas de primer orden de un vector
entrada : in ( vector )
salida : out ( vector )
Disponemos tambin de dos funciones para manejar los errores de ejecucin,
??
tenemos un ejemplo de cmo se usan. Son de gran utilidad sobre todo cuando hagamos debugging de un
programa grande. Si se produce un error en la lectura de los argumentos o en el clculo interno se imprime
en pantalla toda la cadena de errores que han provocado el fallo, estos mensajes son a menudo demasiado
crpticos. Si intuimos que la ejecucin puede fallar en algn sitio debemos preverlo, es una buena tctica
pensar el hilo de ejecucin tanto si funciona correctamente como si no.
19
1
2
3
38
La funcin
la funcin
1
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
1
2
>> function [x ,y , z] = f ()
x =1;
20 En
usage
son los mensajes que saldrn por pantalla si se comete un mal uso o existe un error de ejecucin
breve aprenderemos que la mejor manera de llamar este tipo de funciones es mediante un Function handle
39
y =2;
end
>> [a ,b , c ]= f ()
warning : in f near line 7 , column 8:
warning : f : some elements in list of return values are undefined
a = 1
b = 2
c = []
>>
Si queremos saber cuantas variables de salida tiene una funcin debemos usar
control muy interesante es la palabra clave
palabra
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
return
return,
nargout.
Una variable de
2.9.4. inline
El uso que se le da a la funcin inline en esta seccin queda perfectamente cubierto por las funciones
annimas. El uso de inline queda restringido a la evaluacin de una cadena de texto como funcin, no para
la declaracin de funciones. Este apartado debe reescribirse
Si Matlab no puede denir funciones completas dentro de un script signica que para escribir cualquier
expresin matemtica no bsica debemos crear un archivo. Esto no es del todo cierto por la sentencia
inline.
Lo que hace es interpretar una cadena de texto en la que escribimos una funcin y la conecta a una variable,
como si de un puntero a una funcin se tratara. Su uso es muy sencillo, pero requiere cierta prctica.
Si queremos introducir una funcin escribiremos:
En el caso que nuestra funcin tenga ms de una variable de entrada podemos explicitarlas como:
>> foo2 = inline ( ' sin ( x ) * cos ( y ) ' , 'x ' , 'y ') ;
Entonces los parmetros de entrada para la evaluacin van a ser dos y van a mantener el orden asignado en
la sentencia
inline.
De hecho, este intrinsic funciona perfectamente con slo la funcin como argumento,
pero es casi un imperativo para saber cmo se introducen las variables en la evaluacin.
40
1
2
inline
besselj.
argumento. Esta prctica es muy frecuente y til, pensemos que por cada vez que utilicemos un
inline
nos
ahorramos un archivo.
sin
@.
varsin
la
varsin
es ahora la
funcin seno:
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
inline
pero lo reco-
mendable es utilizar un Function handle. Por ejemplo, para hacer la siguiente integral mediante la funcin
quad:
41
sin(x) dx
I=
0
1
2
3
4
5
6
1
2
3
4
5
2.9.5.1.
Funciones annimas
La sentencia
inline
utilizar un Function handle para declarar una funcin con la siguiente sintaxis:
@( argumentos ) sentencia_ejecutable
Por ejemplo, la funcin
foo2
inline
se escribira
como sigue:
1
2
1
2
1
2
3
21 :
cdigo provoca un error de segmentacin en Matlab 7.0.0.19901 (R14) y Octave en versiones inferiores a 2.9.12
Introduccin informal a Matlab y Octave
42
2.9.5.2.
Si gracias a los Function handles podemos asignar funciones a variables esto nos servir para pasar
funciones como argumentos. Una de las prcticas ms beneciosas en programacin es la de la
introspeccin .
1
2
3
4
5
6
7
8
x=1
siendo
su nico argumento:
Es muy importante crear una cabecera de ayuda cuando los argumentos de una funcin no son escalares
comunes. Si no ser imposible saber que el argumento de fhtest es un Function handle. Lo correcto sera
crear tambin un mensaje de error en el caso que el argumento no fuera del tipo adecuado. Cuando una
funcin no devuelve ningn resultado lo primero que haremos ser utilizar la ayuda:
1
2
3
4
5
6
1
2
1
2
3
4
5
2.9.5.3.
Esta seccin ha quedado desactualizada para Octave versin superior a 2.9.0 en la que las funciones
annimas se comportan igual que las de Matlab.
Otra pequea diferencia entre Matlab y Octave es cmo las funciones annimas entienden las variables
dadas en la cabecera. En Octave, una funcin annima es estrictamente una funcin a parte. Las variables
43
internas no tienen ninguna relacin con las variables del resto del entorno de ejecucin. Por ejemplo, si
queremos denir la siguiente funcin de dos variables:
f unc = e(x
+y 2 )
1
2
3
1
2
1
2
3
4
>> a =2;
>> func = @( x) exp ( -( x .^2+ a .^2) )
func =
@( x) exp ( -( x .^2 + a .^2) )
De este modo estamos pidiendo que la funcin tome una variable que en realidad es externa como propia.
En Octave esto da un error en el momento de la llamada:
1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
>> a =2;
>> func = @( x) exp ( -( x .^2+ a .^2) )
func =
@( x) exp ( -( x .^2+ a .^2) )
>> func (2)
ans =
3.3546 e -04
>>
El programa el intrprete no nos devuelve ningn error. Esto es debido a que mientras Octave preere la
denicin de variables globales
como apuesta por la seguridad, Matlab es ms laxo con el acceso a las variables en el caso de los function
handles. De hecho, este es el modo recomendado por los desarrolladores de Matlab para acortar algunas
cabeceras mediante variables externas o para pasar parmetros a funciones dentro de funciones.
44
agresiva con la memoria y debemos evitarla. Un ejemplo de funcin recursiva sera esta manera tan poco
22 .
1
2
3
4
5
6
nested functions
1. Encapsular partes del clculo en una funcin principal dentro de una funcin secundaria
2. Posibilitar que argumentos de salida sean funciones mediante function handles.
El primer uso es trivial. Podemos denir
subfunciones
cabecera. No es ms que agrupar una tarea repetitiva para no tener que escribirla varias veces.
El segundo uso es una de las sutilezas proporcionadas por los function handles. Como podemos denir
subfunciones siempre que no inuyan en la cabecera nada nos impide asignarlas a un function handle que se
pasar en la salida como argumento. Es exactamente el mismo concepto que el de utilizar funciones como
argumentos de funciones pero a la inversa.
Por ejemplo, supongamos que estamos diseando un ltro para una seal, un ltro pasa-bajos segn una
determinada frecuencia
Lo ms sencillo sera hacer una funcin pasa-bajos que recibiera tres argumentos,
el espectro en frecuencias, la longitud del espectro y la frecuencia de corte. Una solucin mucho ms elegante
puede ser denir una funcin de construccin que devuelve un function handle con un ltro que utilizamos
como otra funcin por separado. De este modo conseguiramos reducir toda una coleccin de ltros a una
nica funcin generadora. Esta prctica se llama introspeccin y es junto con la abstraccin las dos palabras
claves de la programacin moderna. La capacidad de Matlab de convertir funciones en argumentos simples
es la mayor potencia del lenguaje y a la vez el concepto ms complejo. Dominar bien la abstraccin a nivel
de mtodos es dominar Matlab.
2+3
contenido de cada variable sino abstraerse tambin del mtodo utilizado. La abstraccin la dan las frmulas
matemticas y la introspeccin los interfaces.
Dentro de los mtodos de introspeccin uno de los ms utilizados es la sobrecarga de funciones. Es un
tema bastante avanzado pero puede aportar grandes benecios en cdigos muy complejos. Sobrecargar una
funcin es asignar ms de un mtodo a un nombre y aportarle un mtodo adicional para que segn el tipo
de argumento se use un mtodo o otro.
22 Existen
varias maneras de calcular un factorial. Las dos ms ecientes probablemente sean prod(1:n) y gamma(n+1)
dispatch
45
mtodo llamar utiliza una pequea referencia que asigna cada tipo a una funcin. Tambin nos permite
administrar los interfaces para aadir y eliminar funciones a la sobrecarga.
Por ejemplo, si utilizamos la funcin
dispatch
1
2
3
4
5
6
7
fexp
gexp
builtin functions
builtin
dispatch
Todo lo que es potente es complejo y estos conceptos son ambas cosas. Es importante que slo usemos estas
herramientas cuando las dominemos.
EDIT
Muestra informacin rpida sobre la variable o el nombre de la funcin. Si el argumento es una funcin
o una subrutina dentro de un archivo
2.10.
.m
Entrada/Salida
Supongamos que hemos hecho un script para calcular la solucin a un problema de control y necesitamos
que en el arranque el usuario nos introduzca los datos de entrada, o pongmonos en la situacin de estar
utilizando un cdigo de mecnica de uidos computacional que nos escupe enormes matrices de datos en
crudo.
Cualquier interaccin de nuestro programa con el exterior necesitar funciones de comunicacin, ya sea
un pequeo dilogo en la consola o la lectura de matrices de gran tamao. El primer caso es bastante sencillo
pero el segundo requiere conocimientos bsicos de almacenamiento de datos que aprenderemos en breve.
Es la funcin de salida ms sencilla. Imprime en pantalla el argumento con el que se llama ya sea una
cadena de texto o el contenido de una variable.
format
Controla el formato numrico de salida por defecto. Es importante que entendamos que slo cambia
format
se
short
decimal se sale de las cifras signicativas en algn caso todos los nmeros pasaran a
escribirse segn la notacin cientca.
long
decimal se sale de las cifras signicativas en algn caso todos los nmeros pasaran a
escribirse segn la notacin cientca
short e
long e El mismo formato que short y long pero usando siempre la notacin cientca
y denotando el exponencial con una e.
Introduccin informal a Matlab y Octave
46
2.10. ENTRADA/SALIDA
short E
long E El mismo formato que short y long pero usando siempre la notacin cientca
y denotando el exponencial con una E.
short g
long g Escoge
short G
long G Escoge
free
none
input
e.
E.
Es el equivalente a
disp
menu (tit,op1,...)
Imprime en pantalla el men con un ttulo y las opciones del argumento, cada una de las
opciones se presenta con un nmero y espera que se escoja uno de ellos por teclado. El valor retornado
es el nmero de la opcin escogida. Cuando se est utilizando la interfaz grca de Matlab aparece
una ventana y que muestra un botn por cada opcin Por ejemplo:
1
2
3
4
5
6
7
>> choice = menu ( ' Esto es un menu ' , ' uno ' , ' dos ' , ' tres ')
Esto es un menu
[ 1] uno
[ 2] dos
[ 3] tres
pick a number , any number : 3
choice = 3
23 .
Matlab puede leer y escribir archivos en formato binario; esto necesita una pequea explicacin. Hay dos
maneras principales de almacenar nmeros en memoria, en formato texto y en formato binario. En el primer
caso se escriben en un chero que un humano puede leer, normalmente codicado en ASCII de 8 bits. El
programa se encarga de alinear las columnas y situar la coma para poder leerlo cuando sea oportuno. El
precio de mantener cada nmero como algo leble tiene un coste en memoria mucho mayor, esto nos forzar
en algunos casos a utilizar la lectura y escritura en binario. Cuando almacenamos variables en formato
binario ya no somos capaces de leer nada, incluso es probable que ni el ordenador sea capaz de hacerlo; esto
es porque hay multitud de formatos binarios.
Matlab tiene tres formatos binarios a los que llama segn la versin en la que se introdujeron, la versin
4, la 6 y la 7. No es necesario decir cul es la ms optimizada. La ltima versin de Octave es capaz de leer
y escribir en los tres, tiene soporte para utilizar el formato binario abierto
hdf5
propio.
Tendremos siempre la posibilidad de guardar o cargar las variables que queramos, el almacenamiento es
capaz de reconocer qu variables hemos guardado en l.
save
opciones v1 v2 ...
opciones.
load
opciones archivo v1 v2
23 Uno
save.
La recomen-
47
diary.
diary
on,o,archivo
Para hacerlo:
1
2
3
4
5
>>
>>
>>
>>
>>
nombrearchivo
encontraremos la lnea:
2.11.
Esta seccin es una visin un poco personal de Matlab en comparacin con otros lenguajes de programacin
superiores.
Matlab no es un buen lenguaje de programacin. Que seamos capaces de entenderlo fcilmente a pesar
de sus defectos no lo hace bueno porque sencillo no signica correcto ni directo signica consistente. Matlab
tiene defectos y algunos de ellos muy graves.
Esta seccin proviene de una discusin con los miembros del departamento de Mticas de la Escuela
Tcnica Superior de Ingenieros Navales. En aquella escuela Matlab se utiliza para impartir cursos de programacin. Mi visin era que Matlab inyecta ciertos malos vicios que lo descartan como plataforma para
la enseanza de la programacin. Si uno debe aprender a andar no es normal que empiece con zancos; del
mismo modo no es normal que quien empieza a programar tome como norma peligrosas particularidades.
Algunos inconvenientes han sido solucionados por el intrprete Octave como extensiones al propio lenguaje.
m (2 ,3)
Pero los tuples tienen una funcin, la de agrupar variables. Si nos jamos en cmo es una llamada a una
funcin entenderemos perfectamente la notacin escogida en muchos lenguajes para un tuple:
f(a , b)
Podemos imaginar que lo que la funcin
function [x , y ]= f (a ,b ) ...
48
(a,b) es un doble... Por qu si lo que retorna es exactamente lo mismo, un doble, debemos utilizar la
misma notacin que las matrices? Esto no sera tan grave si no fuera porque Matlab verdaderamente tiene
un tipo para estos casos: las celdas.
Ahora podramos pensar que por lo menos las celdas se comportarn como verdaderos tuples per no. Si
intentamos una doble asignacin:
1
2
function {x ,y }= f(a , b)
para que la asignacin
{x , y }= f (2 ,3)
tenga sentido y convierta las celdas en autnticas tuplas. Desgraciadamente este cambio rompera todos
los cdigos existentes por lo que no es posible.
1
2
dummy = func ( x)
a = dummy (1 ,:)
Pero si estamos utilizando el intrprete Octave podremos utilizar la llamada de ndices como sufjo de la
siguiente manera:
==, ++, , +=
-=
soporta, en cambio Octave s. Sustituyen esas lneas tan feas del estilo de
a =a +4
Por un ms leble
a +=4
49
instancia
Las clases no son ms que tipos derivados en los que uno puede denir mtodos, variables privadas y
pblicas... y la instancia se crea bien por declaracin (lenguajes estticos) o por llamada (lenguajes dinmicos). Desgraciadamente Matlab opt por un modelo mucho menos comn en el que se dene la instancia
como una estructura de funciones ordenada mediante directorios.
Creo que esta es una decisin equivocada y provocar que la orientacin a objetos de Matlab nunca llegue
a utilizarse activamente.
Matlab Monkey
puede denirse como aqul programador tan acostumbrado a Matlab que es ya incapaz
de reconocer todo lo anterior como defectos. El otro gran sntoma es el de utilizar Matlab absolutamente
para todo.
El languaje Matlab prcticamente no ha cambiado desde su creacin, por consguiente no ha resuelto
sus defectos y ha aadido otros nuevos. Parece claro que el nico aliciente de programar en Matlab es la
biblioteca de funciones. Hagmonos entonces la pregunta siguiente: si existiera un lenguaje mejor con la
misma biblioteca de funciones... Seguiramos programando en Matlab? Si la respuesta es s somos
Monkeys.
Matlab
Octave es un humilde esfuerzo para paliar alguno de estos inconvenientes aunque la poltica de conseguir
una compatibilidad mxima, por otro lado completamente comprensible, impide mayores cambios. Aunque
esta seccin deje Octave en un mal lugar por parecer un mero imitador su labor es tremendamente importante
por dos razones. Hay millones de lneas escritas en Matlab que no sern nunca portadas a otro lenguaje y
demuestra a los desarrolladores de Matlab que es importante distinguir entre el lenguaje de programacin y la
biblioteca de funciones. Si se extiende es incluso posible que Mathworks termine tomndolo en consideracin.
Siempre he dicho que la existencia de Octave benecia indirectamente a Matlab porque la existencia de
software libre siempre aumenta la difusin de una aplicacin.
Dentro de la competencia comercial la alternativa ms razonable es Mathematica pero su uso parece ms
adecuado a las necesidades de fsicos y matemticos.
macin existente y ms conveniente de todas las funciones necesarias. Desde el inicio del proyecto ha ido
ganando usuarios desilusionados o hastiados con Matlab que encuentran en Python un lenguaje directo,
consistente y elegante. La maquinaria interna de Python es bastante parecida a la de Matlab pero el primero
es mucho ms fcil de extender.
Adems las perspectivas de crecimiento de Python son mucho ms optimistas. Hay muchas ms manos
y ojos sobre el cdigo y numpy no es ms que una pequea pieza dentro de una gran maquinaria.
50
BIBLIOGRAFA
[1] Turbulence and Vortex Dynamics; Javier Jimnez; July 26, 2004;
http://torroja.dmt.upm.es/
[2] Fortran 95/2003 Explained; Michael Metcalf, John Reid, Malcolm Cohen; Oxford University Press;
2004.
[3] Numerical Recipes in Fortran 77, The Art of Scientic Computing; Second Edition; William H. Press,
Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery; Cambridge University Press, 1997
[4] Fluid Flow Phenomena, A Numerical Toolkit; Paolo Orlandi; Kluwer Academic Publishers, 2000.
[5] Computational Fluid Dynamics; T.S. Chung; Cambridge University Press, 2002
[6] C++: The Complete Reference; Herbert Schildt; Tata Mc Graw-Hill ,1999
[7] Scary Octave;
http://wiki.octave.org/
http://www.octave.org/
http://www.python.org/tut/tut.html
http://mathworld.wolfram.com/
[11] Mecnica de Fluidos; Amable Lin; Publicaciones ETSIA, Universidad Politcnica de Madrid.
[12] Clculo Numrico I; Varios; Publicaciones ETSIA, Universidad Politcnica de Madrid.
[13] Anlisis y Clculo Numrico en Ecuaciones en Derivadas Parciales; Juan A. Hernndez, Eusebio Valero;
Publicaciones ETSIA, Universidad Politcnica de Madrid.
[14] Spectral methods in MATLAB; Lloyd N. Trefethen; SIAM, 2000
[15] Algebra Lineal y Geometra Cartesiana; Juan de Burgos; McGraw Hill, 2000
[16] Fortran 95; Programacin Multicapa para la simulacin de sistemas fsicos; Juan A. Hernndez, Mario
A. Zamecnik; ADI, 2001.
[17] Wikipedia, the free encyclopedia:http://en.wikipedia.org/wiki/Wikipedia
[18] The Humble Programmer; Edsger W. Dijkstra;
EWD03xx/EWD340.html
http://www.cs.utexas.edu/~EWD/transcriptions/
jason/references/Boyd_2ed.pdf
http://laplace.physics.ubc.ca/People/
http://scipy.org/
51