Documente Academic
Documente Profesional
Documente Cultură
Contenido
Introduccin
Capitulo I: Que trata de la necesidad de la programacin en la ingeniera y de los
alcances de la programacin, as como de una pequea introduccin a lo que es Matlab
Capitulo II: Que trata de la ventana de comandos, de la composicin y el uso de la
misma, de cmo utilizar la ayuda, de cmo utilizar el path browse, de algunos demos.
Uso de Matlab como una Calculadora. Introduccin a las grficas.
Capitulo III: Programacin.
Capitulo IV: Grficas y animaciones.
2.1 Command Window
En esta seccin describiremos una de las ventanas ms importantes de Matlab, la cual le
dar la bienvenida cada vez que usted ingrese al programa Matlab 5.3. Tambin
aprovecharemos para introducir algunos conceptos bsicos de la programacin. En
particular se recomienda la lectura de las secciones 2.1.6, 2.1.7, 2.1.9 y 2.1.10.
Cada vez que usted inicia Matlab se abre por defecto una ventana titulada Matlab
Command Window (ventana de trabajo o ventana de comandos). Desde esta ventana
usted puede ejecutar Matlab como una calculadora de alta capacidad, llamar funciones y
otros programas guardados en archivos para observar los resultados y eventualmente
almacenarlos en variables. Adems puede escribir y ejecutar pequeos algoritmos,
aunque no podr usarlos una vez cierre Matlab. La ventana tambin incluye en su parte
superior un men y una serie de botones que son tanto vnculos a otras ventanas como
herramientas comunes de Windows. En la zona inferior se observan barras que indican
el estado actual de Matlab.
En la figura 2-1 se indican las partes de la ventana de trabajo, que sern discutidas en las
secciones 2.1.1 a 2.1.15.
Figura 2-1 Partes de la ventana Command Window
(Los nmeros corresponden a la seccin donde se explican)
1 2 3 4 5 10 11 12 13
6
8
7
9
14
15
2.1.1 Men File
El men file (archivo) permite acceder a
la mayora de las aplicaciones de
Matlab. Entre estas se encuentran: crear,
abrir y ejecutar archivos que contienen
grficas, figuras o modelos de Matlab;
manipular variables; acceder al editor de
grficas (GUIDE); modificar la ruta de
ejecucin de los programas; configurar
las preferencias de Matlab; abrir la
ventana de impresin y salir de Matlab.
GUIDE es el nombre de un conjunto de
herramientas que tienen por objeto
facilitar la creacin de entornos grficos
en Matlab, abreviados GUI (Graphical
User Interface), tales como ventanas
con mens y botones que llaman
funciones creadas por el usuario. En
este texto no se utilizar GUIDE, pero
su uso puede consultarse en el manual
Building GUIs with MATLAB,
incluido en el CD de instalacin de
Matlab 5.3.
Figura 2-2 Men File
2.1.2 Men Edit
Al igual que muchos de los entornos
grficos de Windows, Matlab incluye
herramientas de edicin, que en este
caso actan sobre el contenido de la
ventana de trabajo (seccin 2.1.9), a
saber: deshacer, cortar, copiar, pegar,
borrar, seleccionar todo y borrar sesin.
Esta ltima opcin es de gran utilidad,
permitiendo remover de la pantalla todo
el contenido de la ventana de trabajo, la
cual tiende saturarse de nmeros.
Figura 2-3 Men Edit
2.1.3 Men View
Desde el men Ver puede mostrarse u ocultarse la barra de herramientas haciendo clic
en toolbar.
2.1.4 Men Window
El men ventana despliega el nombre de
las ventanas abiertas (incluida la
ventana de trabajo), y permite activar
una ellas. Estas ventanas pueden ser
figuras de Matlab, modelos de
Simulink, o ventanas de ayuda, entre
otros.
Figura 2-4 Men Window
El ejemplo de la Figura 2-4 muestra el contenido de esta ventana cuando se tienen
abiertas las siguientes ventanas:
La ventana Library Browser de Simulink, a partir de la cual se crean all los
programas.
2 figuras (una sin ttulo y la otra llamada Grfico de la poblacin actual)
La ventana de ayuda de Matlab, llamada Matlab help window.
La ventana Matlab Command Window
Un bloque sin nombre de Simulink
Entonces puede alternarse sin problema una ventana por otra, seleccionando esta ltima
en el men Window
2.1.5 Men Help
El Men Help (ayuda) permite acceder
a una serie de herramientas de ayuda y
tutoriales en los que se explican en
detalle todos los componentes de
Matlab.
A partir del contenido de este Men,
una persona interesada podra
perfectamente aprender a utilizar
Matlab en casi toda su extensin. En la
seccin 2.3 se tratar este tema con
mayor detenimiento.
Figura 2-5 Men Help
2.1.6 Botn New M-file
Es equivalente a FileNewM-File. Los archivos tipo *.m contienen algoritmos
(cdigos) que pueden ser ejecutados por Matlab. Una manera de crearlos es a travs de
este botn. Entonces se abre el editor de Matlab y aparece all un archivo en blanco
donde puede escribirse un algoritmo. Sin embargo, siempre es necesario grabar el
archivo antes de poder utilizarlo.
2.1.7 Botn Open
El botn Abrir permite abrir los archivos asociados con Matlab y Simulink. Es
equivalente a FileOpen. Por ejemplo, puede usarse para abrir los archivos que
contienen algoritmos, mencionados en la seccin anterior. Debe distinguirse entre abrir
un archivo y ejecutarlo. Cuando decimos que abrimos un archivo que contiene un
algoritmo (por ejemplo, un archivo *.m), entendemos por ello que estamos observando
las instrucciones tal y como fueron escritas, sin que ellas sean realizadas por el
programa. Por otra parte, decimos que ejecutamos un archivo o que corremos un
programa, cuando hacemos que el computador realice las tareas que el contenido de ste
le indica. Una manera de hacer esto ltimo es escogindolo luego de hacer FileRun
Script en la ventana de trabajo.
2.1.8 Botones de edicin
Son equivalentes a los explicados en la seccin 2.1.2. Puede verse temporalmente el
nombre un botn si se ubica el puntero sobre l.
2.1.9 Contenido de la ventana de Trabajo
La ventana command window es en realidad un entorno grfico que permite visualizar la
verdadera zona de trabajo de Matlab, llamada workspace (Abreviada WS). Esta zona de
trabajo no es ninguna ventana, sino ms bien el espacio virtual o parte de la memoria de
del computador destinada para Matlab y sobre la cual usted trabaja mientras se
encuentra en la ventana de comandos o cuando utiliza un archivo Script.
Cuando se emplea Matlab, el objetivo siempre es que el computador ejecute una serie
de instrucciones para producir un resultado que puede almacenarse en una o ms
variables, as como en archivos. Con el fin de comunicar estas instrucciones al
programa, es necesario escribirlas en un lenguaje de programacin. La ventana de
trabajo nos brinda formas grficas para introducir ciertas instrucciones bsicas, como
por ejemplo la instruccin salir de Matlab, la cual se ejecuta haciendo clic en
FileExit Matlab. No obstante, en Matlab la mayora de las instrucciones se dan en
forma escrita (es decir, como lneas de un programa), e incluso aquellas que se dan en
forma grfica son mucha veces en ltima instancia lneas de un programa. Por ejemplo,
la forma de escribir salir de Matlab es simplemente quit.
La ventana de trabajo permite escribir la mayora de las instrucciones de Matlab en su
parte modificable (zona marcada con el nmero 9, Figura 2-1) utilizando el teclado
como se hara, por ejemplo, en el bloc de notas. Cada lnea que se escribe en esta
ventana representa una instruccin o un comando (de ah el nombre de command
window) que es ejecutado por Matlab cuando usted presiona la tecla Enter (o Intro).
Una particularidad importante del contenido de esta ventana es que, una vez se ha
pulsado Enter, ste no puede borrarse o modificarse como se hara en un procesador de
texto comn. Lo anterior significa que si comete un error escribiendo una lnea (o
instruccin) en la ventana command window, no puede simplemente corregirlo, sino que
deber repetir la instruccin en una nueva lnea.
El ltimo smbolo indica la lnea que est actualmente activada, es decir, la nica que
es modificable directamente. Para manipular el contenido de la ventana de trabajo
pueden usarse los comandos de edicin; por ejemplo, si se desea borrar todo el
contenido de la ventana puede utilizarse la opcin Clear session del men Edit. Como
se ver ms adelante, este procedimiento no borra las variables existentes. Tambin
puede seleccionarse con el mouse parte de lo que se muestra en la ventana, para luego
copiarlo en un procesador de texto (como Word o bloc de notas) utilizando las
herramientas de edicin.
En la seccin 2.2 se ampliarn algunos de estos temas.
2.1.10 Botn Workspace Browser
Hemos dicho que el WS es el verdadero entorno en el cual trabajamos cuando estamos
en la ventana command window. Ahora bien, como se ver ms adelante, siempre es
posible crear variables desde esta ventana, quedando ellas almacenadas en el espacio
virtual WS. El botn Workspace Browser despliega una ventana homnima que permite
visualizar y manipular las variables creadas en este entorno. Por ejemplo, si escribimos
5 t y luego pulsamos Enter, se crear una variable llamada
t
, que tendr ese nombre,
un tamao, un contenido y una clase determinados, as como tendr asignada una
porcin de memoria virtual del computador medida en Bytes.
Esta ventana permite visualizar o manipular dicha informacin. Alternativamente puede
emplearse el comando whos para tales propsitos (Seccin 2.5.1).
2.1.11 Botn Path Browser
Un programa no es ms que una secuencia de instrucciones esperando a ser realizadas
(ejecutadas). Cuando Matlab recibe la orden de ejecutar un programa que ha sido
grabado, entonces debe buscarlo en el computador. Comoquiera que buscar dicho
archivo en toda la extensin del computador tomara mucho tiempo, Matlab slo busca
en ciertas carpetas previamente seleccionadas por el usuario, y lo hace en un orden
especfico llamado ruta de bsqueda (path). Adems de las carpetas que contienen las
herramientas incluidas en Matlab (llamadas Toolbox), la carpeta que se usa por defecto
para buscar los archivos se llama Work, y en ella pueden normalmente grabarse los
archivos a ejecutar. El botn Path Browser brinda acceso a una ventana homnima
donde puede modificarse la ruta de bsqueda, como se ver en la seccin 2.2.
2.1.12 Botn Simulink Library Browser
El CD de instalacin de Matlab 5.3 contiene, adems de Matlab y sus tutoriales, otros
programas desarrollados por The Math Works, siendo Simulink uno de los ms
importantes. Simulink es una de las herramientas ms utilizadas para modelar sistemas
dinmicos, y en l los programas se crean a travs de diagramas de flujo, siendo
perfectamente compatibles con Matlab. En este texto no utilizaremos Simulink, pero el
lector interesado puede consultar los tutoriales de Simulink incluidos en el CD de
instalacin de Matlab 5.3, a los cuales puede accederse desde el men Help de la
ventana de trabajo. Aqu slo diremos que el botn Simulink Library Browser es un
acceso directo a una ventana homnima que puede considerarse la ventana principal de
dicha herramienta, as como la ventana command window lo es de Matlab.
2.1.13 Botn Help Window
Este botn abre una ventana de ayuda de Matlab, desde la cual podr accederse a una
descripcin sinttica de la mayora de funciones del mismo, aunque para ello deber
saber el nombre de cada una. Esta ayuda sinttica ser de gran utilidad slo si se
aprende a combinar con otras herramientas de ayuda que sern descritas en la seccin
2.3. Presionar el botn Help Window (ventana de ayuda) es equivalente a HelpHelp
Window.
2.1.14 Barra de estado
La barra de estado de Matlab nos dice si ste se encuentra o no realizando alguna tarea
(por ejemplo, ejecutando un programa o realizando algn clculo). En el caso de la
Figura 2-1, en la barra se muestra el mensaje Ready, lo cual significa que Matlab est
listo para realizar la tarea que se le asigne. En caso contrario se mostrara el mensaje
busy (ocupado).
2.1.15 Opciones del teclado Activadas
En este espacio de Matlab se muestran
las opciones del teclado que estn
actualmente activadas, estas son:
mayscula sostenida, teclado numrico
activado y bloquear desplazamiento.
Sus funciones son prcticamente las
mismas que en un procesador de texto.
Figura 2-6 Vista de la barra con las tres
opciones del teclado activadas
2.2 Algunos clculos en la ventana de trabajo
En secciones anteriores emprendimos una descripcin de la ventana de trabajo, ahora
comenzaremos a utilizarla para hacer clculos tal y como se hara en una calculadora,
sin reparar mucho en los detalles de los mismos. Recuerde escribir siempre en la ltima
de las lneas marcadas con y presionar Enter (o Intro) cuando haya terminado.
2.2.1 La nocin de variable
Tal vez el significado de variable en el mbito de la programacin sea un poco diferente
del de variable matemtica. En programacin, puede pensarse en una variable como en
una caja con un nombre propio que contiene una serie de objetos. Algunos de esos
objetos pueden ser nmeros, letras, matrices, smbolos matemticos, o incluso otros
objetos ms generales que contienen a varios de los anteriores. Una condicin necesaria
para la existencia de una variable es que sta tenga un nombre, el cual es usado para
manipularla a ella y a su contenido. Adems est claro que la forma de manipular
variables vara ligeramente dependiendo de los objetos que sta contenga, los cuales
determinan la clase de variable (Seccin 2.5).
Por ahora limitaremos esos objetos a nmeros reales, y observaremos que, a diferencia
de otros programas, en Matlab no es necesario especificar de antemano el tipo de objeto
que contendr la variable, ni an enunciar al principio de los algoritmos todas las
variables que se van a utilizar. Adems, no hay necesidad de distinguir entre nmeros
enteros y racionales, ni an entre reales y complejos. Cuando Matlab encuentra el
nombre de una nueva variable, la crea automticamente y ubica en ella los objetos
deseados. Si la variable ya existe, entonces cambia su contenido y almacena en ella los
nuevos objetos definidos (puede pensarse en ello como desocupar una caja y llenarla
con nuevos objetos). Esta es una de las razones por las cuales Matlab es un lenguaje de
programacin sencillo y verstil. Debe tenerse en cuenta que el aspecto esencial de
Matlab, como su nombre lo indica (Laboratorio de Matrices) es su manejo matricial de
las variables, esto es, que toda variable de Matlab es una matriz
1
.
2.2.2 Creacin de una variable en Matlab
La manera de crear variables en Matlab es simplemente a travs del smbolo igual ( = ),
y se explicar con un ejemplo. Para crear la variable llamada TE, simplemente debemos
almacenar algo en ella, digamos TE=5. Se entiende que inicialmente no existe ninguna
variable (es decir, no existe ninguna caja), y tras ejecutar esta lnea se habr creado
una variable numrica (esto es, que contiene un nmero), llamada TE y en la cual se
encuentra almacenado el nmero 5. Obsrvese que a la izquierda del igual se encuentra
el nombre de la variable, y a la derecha el contenido. De este modo, = es el operador
que asigna variables en Matlab, y no el operador lgico que verifica la validez de una
igualdad
2
.
El nombre de una variable consta de una letra, seguida de cualquier cantidad de letras,
dgitos y sub-guiones ( _ ), aunque Matlab usa slo los primeros 31 caracteres del
nombre de una variable.
Llegado este punto, hay dos consideraciones importantes:
1. Matlab es un Lenguaje de programacin sensible, lo que significa que distingue
las maysculas de las minsculas. Las siguientes son por lo tanto variables
diferentes: Te, tE, te, TE.
1
En un sentido ms estricto, se trata de un arreglo rectangular (array). Aqu se emplear indistintamente
el trmino matriz para referirse a estos arreglos.
2
Este operador lgico es ==.
2. No cualquier nombre es vlido para una variable. Todo nombre debe respetar
una serie de normas:
No puede comenzar por un dgito, por ejemplo: 548, 2TE. En cambio, s
puede contener un nmero despus de una letra, por ejemplo: a2, q01cra
No puede contener espacios, si desea separar palabras, utilice el sub-guin.
Por ejemplo: buen_nombre
No puede contener estos y otros smbolos (signos de puntuacin y
operadores matemticos o lgicos) + - * ^ / . , ; : ? !
# $ ( ) = \ & @ %
No debe ser estrictamente homnima a una funcin de Matlab. Por ejemplo,
la funcin matemtica coseno se calcula con la funcin cos, y no es
aconsejable usar este nombre para una variable, ya que luego no podr
calcularse el coseno de un nmero. En cambio, s puede crearse cos3,
cos_x coseno, costa, o incluso Cos.
Para crear una variable, basta entonces con escribir un nombre vlido, seguido de un
igual y de su contenido, y luego presionar Enter. Este contenido puede escribirse
explcitamente, o ser el resultado de alguna operacin. Si se trata de nmeros decimales,
la parte decimal se separa de la entera a travs de un punto. La coma no es aplicable a la
notacin decimal. Por ejemplo
A = 3
B = 5-2+4+5+6
C=0.6
Lo que hemos hecho en el segundo caso es almacenar en la variable B el resultado de la
operacin indicada. Naturalmente cabe preguntarse lo que sucede cuando se escribe la
misma operacin sin almacenarlo en variable alguna. El resultado en este caso es
5-2+4+5+6
ans =
18
Como vemos, Matlab ha efectuado el clculo y se ha almacenado el resultado en una
variable llamada ans (abreviatura de answer, respuesta). Esto sucede siempre en la
ventana de trabajo. Las variables que se crean desde esta ventana se almacenan en la
memoria virtual WS.
Para ver el contenido de una variable una vez que se ha creado, basta con escribir su
nombre y presionar Enter. Por ejemplo
ans
ans =
18
Lo que prueba que en efecto se haba creado tal variable. Debe tenerse presente que en
la variable ans slo se almacena el resultado de la ltima operacin cuyo resultado no
se ha almacenado en otra variable. Por lo tanto, si ahora escribimos R=7.5, la variable
ans sigue siendo igual a 18, puesto que este resultado se ha almacenado en R.
Como es de esperarse, si se hace lo anterior con una variable an inexistente, se
producir un error, y Matlab mostrar un mensaje diciendo que se trata de un archivo o
variable no definidos. Por ejemplo
variable_desconocida
??? Undefined function or variable 'variable_desconocida'.
Tambin es posible crear una variable a partir de otras. Por ejemplo
A=5
B=3
C=A+6
D=A-B-C
Esto es vlido an para la variable ans
5
ans =
5
k=ans+6
k =
11
Por ltimo, recordando la analoga de la caja, podra suceder que a los objetos de la caja
se les aplicara alguna operacin y se devolvieran a la misma, lo que significa que una
variable se puede crear de nuevo a partir de ella misma. Por ejemplo
A=A+A-1
A =
9
2.2.3 Operaciones elementales con escalares
Ya se ha dicho que para Matlab, toda variable es en ltima instancia una matriz. Por lo
tanto es de esperar que un escalar se considere como una matriz de una fila y una
columna. En la seccin anterior vimos cmo crear una variable, y aprendimos un poco
sobre la manipulacin de las mismas. En esta seccin se vern las operaciones bsicas
con variables que contienen nmeros escalares, mientras que la lista completa de los
operadores de Matlab se tratar despus de haber introducido el uso de las ayudas.
Operacin escalar
Escritura en el
lenguaje de
Matlab
Significado Prioridad
Suma A+B
B A+
4
Resta A-B
B A
4
Multiplicacin A*B
B A*
3
Divisin A/B
B
A
2
Exponenciacin A^B
B
A
1
Tabla 2-1 Algunos operadores para escalares en lenguaje Mquina y sus equivalencias
La Tabla 2-1 indica la manera de escribir en Matlab algunas de las operaciones
matemticas elementales cuando ellas se aplican a escalares. Como puede verse en las
operaciones de divisin y exponenciacin, existe una diferencia importante entre la
forma de escribir las operaciones en el formalismo matemtico tradicional, y la de
hacerlo en Matlab.
En Matlab, toda operacin debe escribirse en una lnea, y para ello se usan a menudo
los parntesis. Por ejemplo, puede escribirse
3
1
5
4
+ como (4/5)+(1/3), y
1 2
6 . 0
como 0.6^(2-1)
Nos referiremos a este cambio en la notacin como el procedimiento de convertir una
expresin a su equivalente en lenguaje de programacin. Debe tenerse presente que el
uso de espacios entre operadores es opcional.
Antes de dar ms ejemplos, conviene decir algo acerca del orden en que se ejecutan las
operaciones elementales, es decir, la prioridad de los operadores. Cuando Matlab
ejecuta una lnea, lo hace siempre en un orden de prioridades que puede ser modificado
por los parntesis. En ausencia de ellos, este orden es el que indica la cuarta columna de
la Tabla 2-1. Ello significa que primero se elevan las potencias, luego se hacen las
divisiones, seguidas de las multiplicaciones, y por ltimo se efectan las sumas y restas;
esto es, se aplica el mismo orden de una calculadora convencional. As, escribir 1/6-
2*5^3+8*4 es equivalente a (1/6)-((2*5)^3)+(8*4), que significa
( ) ( ) 4 * 8 5 * 2
6
1
3
+ .
Debe siempre tenerse cuidado de cerrar cada parntesis abierto, o de lo contrario se
producir un error y se mostrar un mensaje, siendo ste diferente si falta el parntesis
izquierdo o el derecho. Por ejemplo
1-6)
??? 1-6)
|
Missing operator, comma, or semi-colon.
(1-6
??? (1-6
|
A closing right parenthesis is missing.
Check for a missing ")" or a missing operator.
Ejemplo 2-1
Convertir las siguientes expresiones a su equivalente en lenguaje de programacin.
Recuerde que si no existen tales variables se producir un error.
a)
d c
b a
+
b) ( )
n
b a +
c) 5
d)
8
3
2
,
`
.
|
e)
k
p
s
,
`
.
|
1
f)
e d
c
b
a
+
+
+
1
1
1
Solucin
a) (a-b)/(c+d)
b) (a+b)^n
c) La raz cuadrada tiene una funcin especial para calcularla, llamada sqrt.
Por lo tanto puede escribirse como sqrt(5) o como 5^(1/2) y ser
calculada de manera diferente.
d) (2/3)^(1/8)
e) (1/s-p)^-k
f) a+1/(b+1/(c+1/(d-e)))
Ejemplo 2-2
Encontrar el volumen especfico molar (litros/mol) de un gas ideal confinado en un
recipiente a una temperatura de 315.73K y una presin de 260 KPa.
Solucin
La ecuacin de estado del gas ideal es:
T R v P * *
Donde
v
es el volumen especfico molar y R es la constante universal de los gases.
Para utilizar esta ecuacin, primero se asignan las variables y luego se despeja para
hacerla explcita en el volumen. Evidentemente debe tenerse un cuidado especial con las
unidades, pues en el programa slo se manejarn nmeros.
Primero introducimos la temperatura en una escala absoluta; en este caso 315.73 K
T=373.15
T =
373.15
Despus introducimos la presin; en este caso 260 KPa
P=260
P =
260
Ahora calculamos la constante de los gases R (KPa*Lt/mol*K). Para ello se despeja R
y se aplica el hecho experimental de que un mol de un gas ideal confinado a 101.325
KPa y 273.15K ocupa 22.414 litros.
R=101.327*22.414/(1*273.15)
R =
8.3146
Por ltimo se aplica la ecuacin de estado del gas ideal, despejada para el volumen
v=R*T/P
v =
11.9331
El volumen especfico molar es por lo tanto 11.9331 Lt/mol
2.2.3 Algunas observaciones sobre los clculos en la ventana de trabajo
Ya hemos utilizado la ventana de trabajo para realizar clculos elementales cuyos
resultados se han mostrado en la misma. Sin embargo, no siempre es deseable mostrar
estos clculos, como puede ser el caso en el trabajo con vectores y matrices, donde una
sola variable puede contener miles de nmeros. Ahora veremos una manera de evitar
estas molestias, y aprenderemos formas rpidas de repetir comandos sin tener que
copiarlos de nuevo. Adems veremos cmo escribir varios comandos en una sola lnea,
as como la manera de continuar un comando largo en otras lneas.
En Matlab siempre es posible realizar los clculos sin que se muestre el resultado en la
ventana de trabajo. Para ello basta aadir un punto y coma al final de cada comando,
para que no se desarrolle la operacin como en la seccin anterior. Por ejemplo
a=5;
Al igual que antes, la variable se ha creado, pero no se ha mostrado el nmero que
contiene. Lo mismo es vlido para cualquier clculo que se realice. Incluso la variable
ans es manipulada de esta manera. Por ejemplo
7^2;
Y entonces ans contiene el nmero 49 aunque no se haya mostrado, como puede
comprobarse diciendo, por ejemplo
c=ans-49
c =
0
En otros trminos, el punto y coma al final de una instruccin acta como un operador
que le indica a Matlab nuestra voluntad de que no se muestre el resutado de esa
instruccin.
Ahora bien, muchas veces sucede que los comandos resultan ser repetitivos, o que
sencillamente se comete un error al escribir una lnea y se requiere rescribirla. Matlab
brinda la posibilidad de hacer esto rpidamente a travs de las flechas del teclado. La
Tabla 2-2, tomada del tutorial Getting Started with Matlab, sintetiza el uso de estas
teclas.
ctrl-p Recordar lnea anterior
ctrl-n Recordar lnea siguiente
ctrl-b Retroceder un carcter
ctrl-f Avanzar un carcter
ctrl-
ctrl-r
Moverse una palabra a la derecha
ctrl-
ctrl-l
Moverse una palabra a la izquierda
home
ctrl-a Moverse al inicio de la lnea
end
ctrl-e Moverse al final de la lnea
esc
ctrl-u Borrar la lnea
del
ctrl-d Borrar el caracter en el cursor
backspace
ctrl-h Borrar el caracter en el cursor antes del cursor
ctrl-k Borrar hasta el final de la lnea
Tabla 2-2 Teclas usadas para editar las lneas de comandos en la ventana de trabajo
El lector puede ahora experimentar con la informacin suministrada en la Tabla 2-2.
Cabe comentar que la flecha puede usarse incluso despus de haber comenzado a
escribir una lnea, y entonces Matlab buscar inicialmente solamente entre aquellas
lneas que coincidan con la parte que se ha escrito. Esto resulta ser de gran utilidad
cuando se quiere rescribir un comando que se ha utilizado con bastante anterioridad;
entonces se escribe la primera parte de ste, y en tal caso Matlab lo muestra
prontamente al ir presionando sucesivamente la flecha . Tambin puede usarse ctrl-c
(copiar) para copiar la parte seleccionada de una lnea, ctrl-v (pegar) para pegar la
parte que se ha copiado. Para seleccionar parte de una lnea puede usarse el mouse o
tambin mantener presionada la tecla shift y usar las flechas del teclado. Para
seleccionar todo el contenido de la ventana de trabajo, puede irse al men Edit Select
All.
Por ejemplo, si se escribe
a=1+*4
??? a=1+*
|
Missing variable or function.
Entonces puede presionarse la flecha en el teclado, o tambin ctrl-p, y enmendar el
error repitiendo el comando en una nueva lnea. La flecha tiene sentido cuando ya se
ha presionado la flecha , y entonces se muestra la lnea que estaba escrita antes de
presionar . Se trata pues de un retorno.
Tambin es posible escribir comentarios en la ventana de trabajo, los cuales pueden
servir para explicar lo que se est realizando. La parte que en una lnea se encuentra
despus del smbolo porcentaje (%) se considera como un comentario y no se ejecuta,
por ejemplo
a=5 %Estamos creando la variable a
a =
5
De esta manera se harn comentarios en los ejemplos de esta gua.
Algunas veces sucede que se desea escribir varios comandos en una sola lnea. Para ello
puede emplearse una coma (,) o un punto y coma (;) entre cada comando y entonces el
resultado se mostrar en el primer caso y se suprimir en el segundo. No es necesario
dejar espacio entre los comando. Por ejemplo
a=10,b=5
a =
10
b =
5
Lo que ha hecho el programa es leer esta serie de instrucciones de izquierda a derecha,
como si cada una estuviera en una lnea aparte. Si se escriben estas mismas
instrucciones con punto y coma, las respuestas se suprimen, siendo lo mismo vlido
para cualquier operacin. Tambin pueden alternarse comas con puntos y comas, y
entonces los clculos se muestran slo donde se us coma para separar comandos. Por
ejemplo,
a=3; b=a^3-9; c=b-a, 15^2
c =
15
ans =
225
Por ltimo, puede ser til escribir un comando largo en varias lneas, para lo cual se
deja un espacio y se colocan 3 puntos consecutivos al final de las lneas involucradas.
Debe presionarse Enter cada vez. Por ejemplo
s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ...
- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
2.2.4 Notacin cientfica y nmeros especiales
Muchos de los resultados numricos pueden ser demasiado prolijos cuando se escriben
en toda su extensin, por lo que Matlab tiende a abreviarlos utilizando la notacin
cientfica, basada las potencias del nmero 10. Normalmente escribimos un nmero en
notacin cientfica como
b
a 10 * t
, con
a
un nmero real y b entero (y no los nombres
de una variable). Para utilizar la notacin cientfica en Matlab, estos nmeros se
escriben como ae+b y ae-b. Es decir, se utiliza la letra e, que significa la
multiplicacin por una potencia de diez. Ntese que e, escrita entre nmeros es una
potencia de 10, y no el nmero de Euler, ni una variable. Por ejemplo
10^15
ans =
1e+015
4.5*10^-15
ans =
4.5e-015
Tambin puede emplearse directamente la notacin de Matlab para escribir estos
nmeros. Por ejemplo
-8e+3
ans =
-8000
8/2e-5+1 %primero se divide 8 entre 2e-5, luego se le suma 1
ans =
400001
La Tabla 2-3, una modificacin de la que se encuentra en el mismo tutorial del cual se
tom la Tabla 2-2, muestra la manera introducir ciertos nmeros que suelen aparecer en
los clculos con Matlab, y cuyo conocimiento es de gran utilidad a la hora de crear
ciertos algoritmos.
pi 3.14159265 ( )
i Unidad imaginaria (
1
)
j Igual que i
eps Precisin relativa del punto flotante (
52
2
)
realmin Menor nmero de punto flotante (
1022
2
)
realmax Mayor nmero de punto flotante (
( )
1023
2 * 2
)
Inf Infinito
NaN No es un nmero (Not-a-number)
exp(1) 2.7182818 (e )
Tabla 2-3 Lista de smbolos y nmeros especiales
As, un nmero complejo se escribir como a+bi, o como a+bj, donde a y b son
reales, e i la unidad imaginaria. Por ejemplo
5+3i
ans =
5 + 3i
j^2
ans =
-1
sqrt(-25) %esta es una funcin con una entrada
ans =
0 + 5i
5+i*1e+4
ans =
5 + 10000i
Este ltimo ejemplo que utiliza *i, es posible porque i no es an el nombre de ninguna
variable. En cambio, cuando se ha almacenado otro valor en ella, digamos
i=5;
La misma expresin toma el valor almacenado en la variable i, y no la unidad
imaginaria. As, tenemos
5-2*i %El * hace que i se tome como una variable cuando existe
ans =
-5
5-2i %Como no hay *, i se toma como la unidad imaginaria
ans =
5 - 2i
i-1i
ans =
5 - 1i
Lo mismo es vlido para el nmero j. Para restaurar la unidad imaginaria, debemos
borrar la variable escribiendo
clear i
El nmero eps es una medida de la precisin de los clculos. Representa la distancia en
la recta real, entre el 1 y el siguiente nmero de punto flotante. Los clculos realizados
ms all de eps pueden resultar incorrectos, por lo que ste se usa como la tolerancia
para ciertos mtodos numricos. Su valor es aproximadamente
2.22044604925031e-016, cantidad nfima que puede variar segn el sistema
operativo. Este valor indica que los clculos que normalmente hacemos en Matlab,
tienen una precisin aproximada de 16 cifras decimales. Puede operarse con eps como
con cualquier nmero. Por ejemplo
r=eps*1e+10
r =
2.2204e-006
eps*i
ans =
0 +2.2204e-016i
Existen en Matlab dos nmeros reales que acotan en valor absoluto el intervalo de todos
los nmeros posibles. El mayor nmero que puede utilizarse en Matlab se designa
realmax, y al menor se le llama realmin. Este ltimo puede entenderse como el
ms cercano al cero, mientras que realmax puede tomarse como el ms cercano al
infinito.
realmin
ans =
2.2251e-308
realmax
ans =
1.7977e+308
Esto significa que el nmero
400
10
no puede utilizarse directamente en Matlab, pues de
alguna manera excede su capacidad. Los nmeros mayores que realmax se consideran
como infinito, el cual se escribe en Matlab como inf. Por ejemplo
realmax^2
ans =
Inf
El smbolo inf se obtiene tambin como un lmite, tal como ocurre en la divisin por
cero. Por ejemplo
1/0
Warning: Divide by zero.
ans =
Inf
Tambin existe su versin negativa
-1/0
Warning: Divide by zero.
ans =
-Inf
Las propiedades de inf son bsicamente las mismas de los lmites infinitos
inf-1e+9
ans =
Inf
inf*inf
ans =
Inf
inf*-inf
ans =
-Inf
1/inf
ans =
0
Es de esperar que exista tambin una manera de designar ciertos lmites divergentes,
como el cociente 0/0 o la resta de infinitos. En efecto, el smbolo nan se utiliza para
tales propsitos. Por ejemplo
0/0
Warning: Divide by zero.
ans =
NaN
0*inf
ans =
NaN
inf-inf
ans =
NaN
i*inf
ans =
NaN + Infi
Lgicamente, algunas de sus propiedades son
nan+1
ans =
NaN
nan/0
Warning: Divide by zero.
ans =
NaN
nan^nan
ans =
NaN
Por ltimo, dos nmeros que aparecen comnmente en la matemtica aplicada tienen su
propia notacin en Matlab. El nmero es simplemente el rea de un disco de radio
unidad, mientras que
e
es el nmero de Euler. Para utilizar basta con escribir pi,
siendo su uso anlogo al de la unidad imaginaria. Por ejemplo
pi
ans =
3.1416
pi*1e+5
ans =
3.1416e+005
2*(1+pi*j)
ans =
2.0000 + 6.2832i
Por su parte, el nmero de Euler se calcula como una funcin, escribindose exp(a)
para simbolizar
a
e
. Por ejemplo
exp(1)
ans =
2.7183
exp(0)+exp(-1)*exp(1)
ans =
2
exp(pi*i)
ans =
-1.0000 + 0.0000i
Donde se ve en el ltimo ejemplo que la exponencial compleja tambin est definida y
cumple la identidad de Euler
sen i e
i
+ cos
2.2.5 Uso de las funciones matemticas elementales
En la seccin anterior encontramos que el nmero
x
e
se obtiene a partir de la funcin
exp, anloga a la funcin matemtica ( )
x
e x f . Existen asimismo varias funciones
matemticas que se encuentran en Matlab como funciones en el sentido de la
programacin. En trminos generales puede decirse que una funcin en el sentido usado
en programacin, es un algoritmo con cero o ms argumentos de entrada, y uno o ms
de salida. En esta seccin nos limitaremos a resear el uso de ciertas funciones con un
argumento de entrada y uno de salida.
Para utilizar una funcin, basta con escribir su nombre seguido de unos parntesis que
contienen el argumento de entrada; entonces se obtiene un valor al que llamamos
argumento de salida.
La Tabla 2-4 contiene algunas funciones matemticas de uso muy comn. En la seccin
2.3.2 se ver una manera de obtener la lista completa de estas funciones.
Funcin Nombre en Matlab
Seno Sin
Coseno Cos
Tangente Tan
Valor Absoluto Abs
Logaritmo
Natural
Log
Logaritmo
Decimal
log10
Exponencial Exp
Raz Cuadrada Sqrt
Tabla 2-4 Algunas funciones elementales
Su se ilustra en los ejemplos 2-3 y 2-4. Debe tenerse presente que todas ellas estn
definidas para los nmeros complejos. Tampoco debe olvidarse que, por ser Matlab un
lenguaje sensible, el nombre de las funciones tambin debe respetar la distincin entre
maysculas y minsculas.
Ejemplo 2-3
Escribir las siguientes expresiones en lenguaje el de programacin de Matlab usando
nicamente las funciones de la Tabla 2-4. Tenga presente que las expresiones implcitas
no representan las lneas de un programa y no pueden escribirse directamente en
Matlab.
a) seny senx y x y x + cos cos ) cos(
b)
x i x sen e
ix
cos +
c) a a
2
Solucin
a) cos(x+y)=cos(x)*cos(y)-sin(x)*sin(y)
b) Utilizando j para la unidad imaginaria, tenemos
exp(j*x) = sin(x) + j*cos(x)
c) Utilizando sqrt para la raiz cuadrada y abs para el valor absoluto, se encuentra
sqrt(a^2) = abs(a)
Alternativamente
(a^2)^(1/2)= abs(a)
Ejemplo 2-4
Expresar los siguientes clculos en trminos de las funciones de la tabla 2-4. Use
identidades cuando sea necesario.
a)
36 log
6
b)
( )
,
`
.
|
i
i
sen
ln
c) ( ) y x y x + *
3
Solucin
a) Haciendo uso de la identidad
a
b
b
c
c
a
log
log
log
, puede escribirse este clculo en
trminos de log de log10, as
log(36)/log(6)
ans =
2
log10(36)/log10(6)
ans =
2
b) sin(log(i)/i)
ans =
1
Este resultado es consecuencia directa de la identidad
2
* ln
i i , la cual puede
obtenerse a partir de la identidad de Euler.
c) Aqu se supone que x e y son variables que contienen nmeros. De nuevo
encontramos que es vlido tomar una funcin como argumento de entrada de otra; es
decir, la composicin de funciones es permisible y sencilla en Matlab
sqrt((x-y)^3*abs(x+y));
Esto concluye el ejemplo.
Observemos que para elevar una funcin a una potencia, sta bien puede o no
encerrarse entre parntesis
sin(10)^2
ans =
0.2960
(sin(10))^2 %estos parntesis pueden omitirse
ans =
0.2960
Por ltimo, recordemos que las funciones tangente y logaritmo presentan
discontinuidades, as que
log(0)
Warning: Log of zero.
ans =
-Inf
tan(pi/2)
ans =
1.6331e+016
En este ltimo caso debi haberse obtenido el smbolo infinito como respuesta. Sin
embargo, los mtodos empleados por Matlab para calcular esta y otras funciones son
aproximativos, por lo que en vez de infinito se obtiene un nmero un nmero grande en
valor absoluto.
Terminamos esta seccin con un ejemplo que muestra la manera de realizar ciertos
clculos, que escritos directamente exceden la capacidad de Matlab.
Ejemplo 2-5
Clculo del cociente
b
a
para nmeros grandes.
Solucin
Considrese la expresin
220
500
10 * 6
10 * 12
, cociente que es igual a
280
10 * 6
.
Si intentamos calcularlo directamente en Matlab, resulta
12e500/6e220
ans =
Inf
Lo cual era de esperarse ya que el numerador es mayor que realmax, y se toma como
infinito. Empero, podemos realizar este clculo a partir las propiedades de los
logaritmos, ya que
b a
e
b
a
ln ln
Este artificio evita trabajar directamente con el numerador, utilizando para el efecto el
dos o ms de sus factores, elegidos para que sean menores que realmax. Por lo tanto,
tomando
250
10 * 1 c
y
250
10 * 1 d
, el cociente considerado se calcula como
exp(log(12e250)+log(1e250)-log(6e220))
ans =
2e+280
Que es el valor esperado.
Este artificio es particularmente til en el clculo de combinatorias, donde los
factoriales se transforman en sumas de logaritmos buscando que no excedan el nmero
realmax. El precio a pagar por ello es la prdida de un poco de precisin en el resultado
final.
2.3 Uso de las Ayudas
Son tantas las herramientas incluidas en Matlab, que sera una lstima si el programa no
incluyera ayuda donde se researa su uso. Afortunadamente los creadores de Matlab son
consientes de ello, y han incorporado en l un sistema de ayuda sumamente completo.
El resultado es que existe una ayuda para casi todas las herramientas contenidas en
Matlab. An ms, se incluyen en el CD de instalacin mltiples tutoriales
3
donde puede
aprenderse a utilizar Matlab en casi toda su extensin. En esta seccin describiremos
prolijamente el uso de estas ayudas, puesto que basta con saber emplearlas para
aprender Matlab.
2.3.1 El comando help
Normalmente cuando se escribe un algoritmo, suele incluirse a manera de comentario
una descripcin de su uso en el encabezado del mismo. El comando help es una funcin
que permite ver tal descripcin de los programas. Aunque su uso es sencillo, requiere el
conocimiento previo del nombre de la funcin. Esta funcin de ayuda se usa escribiendo
en la ventana de comandos la palabra help, y tras un espacio y el nombre del archivo o
funcin de Matlab, respetando las maysculas y minsculas. As, por ejemplo para
obtener sobre la funcin sin escribimos help sin, obteniendo:
help sin
SIN Sine.
SIN(X) is the sine of the elements of X.
Overloaded methods
help sym/sin.m
En primer lugar se encuentra el nombre de la funcin, escrito en letra mayscula.
Aunque normalmente las funciones de Matlab tienen su nombre verdadero en
minscula, en las ayudas se encuentran escritas de este otro modo con el fin de
resaltarlas.
As pues, la ayuda nos dice que sin(x) es el seno de los elementos de x, donde x es una
matriz cualquiera.
En algunos casos la ayuda reporta otras funciones con finalidades similares. Por
ejemplo, para la funcin exponencial tenemos
help exp
EXP Exponential.
EXP(X) is the exponential of the elements of X, e to the X.
For complex Z=X+i*Y, EXP(Z) = EXP(X)*(COS(Y)+i*SIN(Y)).
See also LOG, LOG10, EXPM, EXPINT.
Overloaded methods
help sym/exp.m
3
Si no posee estos tutoriales, puede descargarlos de la pgina oficial de The Math
Works http://www.mathworks.com
Lo cual significa que los comandos log, log10, expm, y expint estn relacionados con la
funcin exponencial, como puede comprobarse mirando sus ayudas.
Para ver los temas de ayuda, se escribe nicamente help. Estos se son los mismos que se
encuentran en la Figura 2-7.
2.3.2 La ventana MATLAB Help Window
Haciendo clic en el men HelpHelp Window desde la ventana de trabajo, es posible
acceder a ventana de ayuda MATLAB Help Window, mostrada en la Figura 2-7.
Figura 2-7 Ventana de Ayuda MATLAB Help Window
La informacin contenida en esta ventana de encuentra organizada por temas (help
topics), a los cuales puede accederse haciendo doble clic sobre el nombre. Por ejemplo,
haciendo doble clic en matlab\elfun se obtiene una lista con las funciones matemticas
elementales, ordenadas en varias categoras. Si en esta lista se hace de nuevo doble clic
en sin, entonces se en la ventana aparecer exactamente la misma informacin que se
vio en la seccin 2.1. Se recomienda al lector examinar las funciones de esta lista puesto
que su uso es muy comn.
En resumen, la ventana de trabajo es un entorno grfico que ofrece la misma ayuda de la
funcin help. As, para buscar una funcin especfica cuyo nombre se conoce, se escribe
ste en la regin que en la Figura 2-7 contiene el mensaje MATLAB Help Topics,
ubicada en la parte superior izquierda de la ventana de ayuda, y se presiona enter. El
botn Home sirve para volver a la lista original de los temas de ayuda. El botn Tips
ofrece una descripcin de las funciones de ayuda de Matlab. El men desplegable See
also proporciona vnculos a comandos similares a los consultados, cuando ellos existen.
Por ltimo, el botn Go to Help Desk brinda acceso a una ventana en html que contiene
una lista de productos de The Math Works, as como tutoriales de Matlab y simulink,
incluyendo una amplia lista de funciones de Matlab descritas con gran detalle. Para
acceder a estas ltimas ayudas se utiliza el comando doc, descrito en la siguiente
seccin.
2.3.3 El comando doc y la ayuda en Html
Como se coment antes, existe una ayuda en versin Html que cuenta con informacin
adicional sobre los comandos y funciones de Matlab, adems de tutoriales referentes a
temas diversos como grficas, desarrollo de entornos grficos, articulacin con otros
lenguajes de programacin, etc. El comando doc abre desde la ventana de comandos
una ventana en Html, llamada MATLAB Help Desk. Se recomienda al lector revisar el
vnculo Getting Started de la categora MATLAB Topics, mediante el cual se accede
a un tutorial introductorio a Matlab.
Figura 2-8 Ventana de Ayuda MATLAB Help Desk
Los vnculos sealados en la Figura 2-8 contienen una lista de las funciones de Matlab,
organizadas ya sea por tema o por ndice alfabtico. Si bien esta no es la manera ms
eficiente de buscar ayuda sobre un comando cuyo nombre desconocemos, pero del cual
tenemos una idea de lo que debe hacer, constituye un ltimo recurso en la bsqueda de
tal comando.
Lista de
Funciones
Para obtener ayuda sobre un comando en particular, basta utilizar el comando doc como
se hizo antes con el comando help. Por ejemplo, si se escribe
doc sin
Se abre una ventana como la que muestra la Figura 2-9.
Figura 2-9 Ayuda del sistema Help Desk sobre el comando sin
Cabe anotar que si bien de esta manera se obtiene ms informacin sobre el comando,
no todos los ellos estn reportados en esta ayuda.
Una manera alternativa de acceder a la ayuda en formato Html es desde el men
desplegable See also, en la ventana MATLAB Help Window.
2.3.4 El comando lookfor
Hasta ahora hemos buscado las ayudas de comandos cuyo nombre conocamos de
antemano. Sin embargo, es evidente que este no es el caso general, y es indispensable la
existencia un mecanismo que permita sortear esta dificultad. El comando lookfor es
precisamente este mecanismo, y su uso es bastante sencillo: para buscar un comando
que realice una tarea especfica, se escribe lookfor seguido de una palabra clave (en
ingls), obtenindose as una lista de comandos que la contienen. Esto se ilustra en el
siguiente ejemplo.
Ejemplo 2-6
Encontrar una funcin de Matlab que realice el producto punto de dos vectores.
Solucin
Recordemos del lgebra lineal que el producto punto de dos vectores A y B , denotado
por B A , se define en trminos de sus componentes como el escalar
i i
b a c
,
donde
i
a
,
i
b
son respectivamente las componentes (elementos) de los vectores A y B .
Entonces tenemos las siguientes palabras claves, con sus equivalencias en ingls:
Producto = product
Punto = dot
Vector = vector
Elemento = element
Probando la primera opcin, encontramos al cabo de un tiempo
>> lookfor product
KRON Kronecker tensor product.
CROSS Vector cross product.
DOT Vector dot product.
CUMPROD Cumulative product of elements.
PROD Product of elements.
RESTOREDEFAULTPATH Restores the MATLAB search path to installed
products.
COLLATETRANSLATIONS Searches the MATLAB path for products with save-as
translations.
FINDBLIB Searches the MATLAB path for products with Simulink blocks.
Donde se ve que el comando dot es el buscado, como puede comprobarse mirando las
ayudas help dot y doc dot.
Para obtener ayuda sobre este comando, escrbase help lookfor. Tambin se recomienda
revisar las ayudas correspondientes a los comandos which y what una vez que se haya
visto la ruta de bsqueda (path).
2.4 La notacin matricial en Matlab
Antes de dar inicio a nuestro estudio del Matlab como un lenguaje de programacin,
ms que como una verstil calculadora, aprenderemos algunas formas de introducir y
manipular matrices. Como se ver cuando se estudien los ciclos, el empleo adecuado del
aspecto matricial de Matlab es esencial en el desarrollo de funciones eficientes, ya que
permite realizar un gran nmero de clculos de manera simultnea.
2.4.1 Dos formas de introducir vectores
Comencemos entonces por los vectores, como caso especial de las matrices. Existen
bsicamente dos formas de introducir un vector en Matlab, a saber: la escritura elemento
a elemento y la notacin abreviada (cuando esta es viable).
As pues, para escribir un vector fila en la notacin elemento a elemento o nominal, se
escriben stos separados por espacios o por comas y se agrupan con un corchete
angular
4
. Algunos ejemplos son:
A=[1 3 5]
A =
1 3 5
B=[0,-5,0.5 1/4 1e+2]
B =
4
Para las ayudas de matlab, el corchete se llama Bracket.
Columns 1 through 3
0 -5
0.5
Column 4
0.25
Como se observa en este ltimo ejemplo, es posible combinar las comas con los
espacios para separar los elementos. Adems, un elemento puede ser el resultado de una
operacin, as como un nmero complejo o alguno de los nmeros especiales de la
Tabla 2-3. Obsrvese tambin que en este caso el vector B no puede se mostrado en una
lnea de la pantalla, por lo que Matlab escribe sobre cada elemento la columna a la que
ste pertenece. Si B fuera una matriz, esta especificacin se hara sobre cada columna de
la misma.
Para crear un vector columna por este mtodo, vasta utilizar un punto y coma (;) para
separar cada par de elementos. Por ejemplo
A=[-1; 0; i ;pi; exp(1); 1/0]
Warning: Divide by zero.
A =
-1.0000
0
0 + 1.0000i
3.1416
2.7183
Inf
La introduccin del espacio despus del punto y coma es slo cuestin de esttica.
Ntese cmo la parte imaginaria de los nmeros complejos aparece a la derecha de la
columna. Por consiguiente, las columnas que contienen nmeros complejos tienden a
ser ms anchas que su semejante real. Al igual que antes, la introduccin del punto y
coma al final de una lnea evita que los resultados se presenten en la pantalla.
En ciertas ocasiones los elementos de un vector se construyen segn una regla fija, tal
como una progresin aritmtica con incrementos constantes. En este caso en particular
es til la notacin abreviada de los vectores, la cual utiliza el operador dos puntos
5
(:).
Supongamos que queremos construir un vector fila conteniendo los nmeros pares del 2
al 10. Entonces podramos proceder escribiendo
A=[2 4 6 8 10];
Pero existe evidentemente una diferencia constante e igual a 2 entre cada par de
elementos consecutivos del vector A. Por lo tanto, A queda completamente definido si
decimos que es un vector fila cuyos elementos son los nmeros que se obtienen
iniciando en 2 (elemento inicial) y sumando sucesivamente 2 a cada elemento de A (es
decir, con un incremento de 2 unidades), llegando hasta el nmero 10 (elemento final).
La notacin abreviada para la creacin de vectores hace uso de esta regla fija, y utiliza
para ello el operador dos puntos, escribindose un vector cualquiera similar a A, de la
manera
Inicial: incremento: final. Para el caso anterior tenemos
A=2:2:10 %El resultado es siempre un vector fila
A =
2 4 6 8 10
5
Matlab se refiere a este operador como colon operator, y el operador punto y coma como semicolon.
Ntese cmo con esta notacin no es indispensable agrupar los trminos en un corchete
angular. Para formar de esta manera vectores debe tenerse en cuenta que slo funciona
directamente para elementos reales. Los siguientes ejemplos ilustran un uso un poco
ms general de esta notacin.
A=0:0.1:1 %los incrementos pueden ser decimales
A =
Columns 1 through 7
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
Columns 8 through 11
0.7000 0.8000 0.9000 1.0000
Aa=1:-0.1:0 %incrementos negativos
Aa =
Columns 1 through 7
1.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000
Columns 8 through 11
0.3000 0.2000 0.1000 0
B=pi:pi/10:2*pi %uso de nmeros especiales
B =
Columns 1 through 7
3.1416 3.4558 3.7699 4.0841 4.3982 4.7124 5.0265
Columns 8 through 11
5.3407 5.6549 5.9690 6.2832
Se presenta una especie de error utilizando esta notacin cuando no existe coherencia
lgica entre los incrementos y los elementos extremos. Por ejemplo
A=5:-1:10
A =
Empty matrix: 1-by-0
A es entonces una matriz vaca con una fila y cero columnas, y es invariante frente a
la adicin o la multiplicacin por un escalar. Es decir
A+1
ans =
Empty matrix: 1-by-0
5*A
ans =
Empty matrix: 1-by-0
Lo mismo ocurre cuando se utilizan incrementos nulos en la creacin de un vector.
Cabe hacer notar que el elemento superior o final es en realidad un lmite que no puede
ser excedido por los elementos obtenidos mediante adicin sucesiva de los incrementos,
motivo por el cual ste no est necesariamente contenido en el vector creado. Por
ejemplo
d=[0:3:10] %los corchetes son opcionales
d =
0 3 6 9
Es decir, el 10 no est contenido en d porque el siguiente nmero que se obtiene
sumando el incremento establecido es 12, y ste es mayor que el lmite superior fijado
por dos unidades. Si el incremento no se especifica, se asume igual a una unidad, por
ejemplo
2:5
ans =
2 3 4 5
La combinacin de los dos mtodos presentados en esta seccin permite introducir
fcilmente vectores ms generales. Por ejemplo
A=[1/2 3 -18 0 1:5]
A =
Columns 1 through 7
0.5000 3.0000 -18.0000 0 1.0000 2.0000
3.0000
Columns 8 through 9
4.0 5.0000
5.0
B=[0:2:9 1:2:10]
B =
0 2 4 6 8 1 3 5 7 9
Estos ltimos ejemplos sugieren que los elementos de un vector pueden ellos mismos
ser otro vector. En efecto, si se tienen los 3 vectores fila A, B, C, pueden formarse los
vectores D=[A B C], E=[A C B], y F=[C A B], G=[A A], H=[C C C B], etctera
6
. Estos
vectores pueden tambin combinarse con otros elementos para producir nuevos
vectores, por ejemplo
a=[1 i 0] %elementos complejos no tienen problemas
a =
1.0000 0 + 1.0000i 0
b=[-1 -3 4]
b =
-1 -3 4
c=[15 a 8 b]
c =
Columns 1 through 4
15.0000 1.0000 0 + 1.0000i 0
Columns 5 through 8
8.0000 -1.0000 -3.0000 4.0000
Por ltimo, si algn elemento de un vector cualquiera X debe expresarse mediante la
notacin cientfica, entonces Matlab aplica esta notacin a todo el vector X,
factorizando de sus elementos la potencia de 10 necesaria. Esto puede ser causa de
confusiones cuando da la apariencia de elementos nulos. Por ejemplo
a=[100000; 5.8; 50; 500; 0.3]
a =
1.0e+005 *
1.0000
0.0001
6
El mtodo aqu expuesto es a menudo referido en la ayuda de Matlab como concatenacin
(concatenation). Recordemos que concatenar significa unir o enlazar unas cosas con otras. (D.R.A.E.)
0.0005
0.0050
0.0000
La notacin 1.0e+005 * significa que cada elemento del vector se encuentra reducido
en un factor de 10000. Naturalmente, sta no es ms que una cuestin de forma, y los
elementos del vector no se han alterado. A diferencia del trabajo con escalares, la
notacin cientfica slo se aplica automticamente cuando un vector o una matriz dada
contiene elementos grandes en valor absoluto. En cambio, la presencia de nmeros
pequeos no modifica la presentacin de una matriz. Por ejemplo
b=[0.5 1e-8 3 4 3/100000 0.03]
b =
0.5000 0.0000 3.0000 4.0000 0.0000 0.0300
Puede usarse el comando format para apreciar ms decimales en una variable numrica.
La instruccin format long hace que los resultados de los clculos subsiguientes se
muestren con ms decimales, aunque ello no modifica en modo alguno la precisin real
de los clculos. Para volver a cambiar los decimales se usa format short. Se invita al
lector a revisar las ayudas disponibles para este comando. Para cambiar
permanentemente el formato de los nmeros, se ingresa al men FilePreferences,
donde se elige el formato numrico deseado, as como la fuente y el tamao de la letra
de la ventana de trabajo
7
. Se recomienda activar el formato long g para obtener un buen
nmero de decimales siempre que sea necesario.
2.4.2 Introduccin de Matrices de tamao m*n
La creacin de matrices elemento a elemento queda sugerida por el mtodo de creacin
de vectores fila y vectores columna, visto en la seccin anterior. Para ello se separan
mediante espacios o comas los elementos de una misma fila, mientras que stas se
separan con punto y coma, agrupando todo con corchetes angulares. Debe tenerse
cuidado de que todas las filas contengan la misma cantidad de elementos. Por ejemplo
A=[1 2 3; 8 4 3; 4 0 2]
A =
1 2 3
8 4 3
4 0 2
B=[1:5;-5:1:-1; 0 8 3 10 -40]
B =
1 2 3 4 5
-5 -4 -3 -2 -1
0 8 3 10 -40
Asimismo, es posible crear una matriz a partir de las variables ya existentes, las cuales
pueden ser ellas mismas escalares, vectores, o matrices; siempre y cuando las
dimensiones coincidan. Por ejemplo
a=13
a =
13
aa=[a a-1 a+1 3*a]
7
Cambiar el formato de loose a compact en este men evitar que se deje espacio entre las lneas, de
tal modo que la presentacin de los resultados sea ms compacta.
aa =
13 12 14 39
B=[aa; -3 -2 a.^2 0; 0:1:3]
B =
13 12 14 39
-3 -2 169 0
0 1 2 3
El procedimiento equivalente con los vectores columna es anlogo al anterior, y se
pueden dar combinaciones como
c=[-1; -5; -7]
c =
-1
-5
-7
[B c B]
ans =
13 12 14 39 -1 13 12 14 39
-3 -2 169 0 -5 -3 -2 169 0
0 1 2 3 -7 0 1 2 3
Si no se escribe ningn elemento entre los corchetes, se obtiene la matriz vaca
a=[]
a =
[]
Ejemplo 2-7
Creacin de una tabla de logaritmos.
Las funciones matemticas elementales como las estudiadas en la seccin 2.2.5 se
aplican con facilidad a cada elemento de una matriz, resultando fcil la creacin de una
tabla de logaritmos, como se ve a continuacin
a=[1:10]'; b=log(a); Tabla=[a b]
Tabla =
1 0
2 0.693147180559945
3 1.09861228866811
4 1.38629436111989
5 1.6094379124341
6 1.79175946922806
7 1.94591014905531
8 2.07944154167984
9 2.19722457733622
10 2.30258509299405
2.4.3 Operaciones bsicas entre Matrices y funciones especiales para crearlas
Ahora que hemos visto algunas maneras de crear matrices, procedamos a revisar las
operaciones simples ms comunes que con ellas se efectan. Las operaciones de suma y
resta de matrices se realizan elemento a elemento de la misma forma que se muestra en
la Tabla 2-1. Es posible sumar o restar as dos matrices de iguales dimensiones,
obteniendo una nueva matriz cuyos elementos se obtienen de la suma o resta de los
correspondientes elementos en la misma posicin de tales matrices. Cuando se efecta
la operacin de adicin entre una matriz y un escalar, se suma este escalar a cada
elemento de la matriz, obtenindose otra de iguales dimensiones. Por ejemplo
A=[1:4;4:7;-1 0 -1 0]
A =
1 2 3 4
4 5 6 7
-1 0 -1 0
B=A-5
B =
-4 -3 -2 -1
-1 0 1 2
-6 -5 -6 -5
A+B
ans =
-3 -1 1 3
3 5 7 9
-7 -5 -7 -5
Si bien las operaciones de adicin y sustraccin estn definidas con unicidad, existen
dos tipos de productos entre matrices en los que podemos estar interesados. Uno de
ellos es el producto elemento a elemento, el cual se escribe como A.*B . Para ello se
requiere que A y B sean de igual tamao, o que alguno de los dos sea un escalar. Por
ejemplo:
A=[1 3 5].*[4 3 -2]%multiplicacin elemento a elemento
A =
4 9 -10
B=2.*A %duplica cada elemento de A y lo almacena en B
B =
8 18 -20
C=A.*(B-8)
C =
0 90 280
Anlogamente, la divisin de los elementos de dos matrices se escribe como A./B
C./A
ans =
0 10 -28
A./C
Warning: Divide by zero.
ans =
Inf 0.1
-0.0357142857142857
Y como es de esperarse, lo mismo ocurre con la exponenciacin, la cual se escribe A.^B
A.^(1/2)
ans =
Column 1
2
Column 2
3
Column 3
1.93633660727019e-016 + 3.16227766016838i
A.^[0 2 3]
ans =
1 81 -1000
El punto que precede al operador puede suprimirse siempre que se aplique a un escalar.
Es decir, A.*B es igual a A*B cuando A B son escalares, y lo mismo vale para las otras
operaciones vistas. En las operaciones elemento a elemento que no involucran escalares
debe verificarse que las matrices tengan las mismas dimensiones, o de lo contrario se
produce el siguiente mensaje de error
[1 0]-[1;0]% vector fila menos vector columna
??? Error using ==> -
Matrix dimensions must agree.
La transpuesta de una matriz A se escribe como A. y es la matriz que se obtiene
intercambiando sus filas con sus columnas. De esta forma pueden tambin
transformarse los vectores fila en vectores columna, y viceversa. Por ejemplo
A=[2 3 4].'
A =
2
3
4
A=[i 4-3i; 1 -8+i]
A =
Column 1
0 + 1i
1
Column 2
4 - 3i
-8 + 1i
A.'
ans =
Column 1
0 + 1i
4 - 3i
Column 2
1
-8 + 1i
Si en lugar de escribir A. se escribe A, entonces se obtiene una matriz llamada
transjugada de la matriz A, la cual puede obtenerse transponiendo A, y reemplazando
sus elementos por los correspondientes complejos conjugados
8
. Como consecuencia, si
todos los elementos de A son reales, se verifica la igualdad A.=A
El operador de transposicin tambin se puede escribir despus de un parntesis, por
ejemplo
A=[1 3 5];
B=(A+1)'
B =
8
El complejo conjugado de un nmero
bi a z +
, con
a
y b reales, suele denotarse por
z
y se
define como
bi a z
. Por lo tanto, si z es real, se tiene
z z
.
2
4
6
z=[2:4]+i*[3:5]
z =
Column 1
2 + 3i
Column 2
3 + 4i
Column 3
4 + 5i
(z').' %equivalente a (z.)
ans =
Column 1
2 - 3i
Column 2
3 - 4i
Column 3
4 - 5i
Este ltimo ejemplo muestra que se puede obtener la matriz conjugada de A, como la
transpuesta de la transjugada (en realidad, el orden en que ejecuten las operaciones es
indistinto).
Adicionalmente a las operaciones elemento a elemento, existen en Matlab las
operaciones con matrices que se estudian en el lgebra lineal. As, el producto matricial
9
de A y B puede formarse siempre que A tenga tantas columnas como filas tenga B, y el
resultado es otra matriz con tantas filas como A, y tantas columnas como B. Por
ejemplo:
([1:5]')*([1:5])%Multiplicacin matricial
ans =
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Y puesto que el producto matricial no es conmutativo, tenemos
([1:5])*([1:5]')
ans =
55
Este ltimo resultado equivale al producto punto de los dos vectores considerados.
Ahora puede verificarse que la matriz identidad
10
es el mdulo de la multiplicacin
matricial. Existe una funcin especial para crear esta matriz, llamada eye. El comando
eye(m,n), donde m y n son nmeros enteros, crea una matriz identidad de tamao m*n.
Por su parte, eye(n) crea una matriz cuadrada de orden n. Tenemos entonces:
9
Recordemos que el elemento
ij
c de la matriz C=A*B, donde A es de tamao m*n y B de n*p se
obtiene como
n
k
kj ik ij
b a c
1
. C es una matriz de tamao m*p.
10
Por matriz identidad entendemos aqu aquella que contiene unos en su diagonal principal, y ceros fuera
de ella. Si bien en lgebra lineal se trata normalmente de una matriz cuadrada, le funcin eye de Matlab
permite crear matrices de este tipo que no son necesariamente cuadradas.
A=[-1 4 6; 2 0 8; 12 47 39]
A =
-1 4 6
2 0 8
12 47 39
B=eye(3)
B =
1 0 0
0 1 0
0 0 1
A*B
ans =
-1 4 6
2 0 8
12 47 39
Hasta ahora habamos trabajado nicamente con funciones que contenan un argumento
de entrada, y para usarlas escribamos funcion(argumento). No obstante, existen
funciones tales como eye, para las que se emplea ms de un argumento. En tal caso, los
argumentos de entrada de las funciones se encierran entre parntesis y se separan por
comas, como funcion(argumento1, argumento2,...). Por lo tanto, cuando
escribimos eye(5,3), 5 es el primer argumento de entrada y 3 el segundo.
De otra parte, la funcin eye es slo un ejemplo de las funciones destinadas a la
creacin de matrices especiales
11
. Entre ellas destacan las funciones ones, zeros
12
y
rand. El uso de ellas es completamente anlogo al de la funcin eye. Las primeras dos
originan martices conteniendo elementos que son slo unos y slo ceros,
respectivamente. El tercero de estos comandos merece especial atencin, pues se trata
de una funcin que da origen a matrices con elementos aleatorios (en ingls random, de
ah su nombre) con valores entre cero y uno, los cuales se encuentran uniformente
distribuidos. Haremos un parntesis para explicar en detalle su uso y significado.
En muchos problemas de simulacin es importante disponer de una manera de generar
nmeros aleatorios, como sera el caso si quisiramos hacer una lotera electrnica.
Supongamos ahora que se dispone de una fuente de tales nmeros, y tras haber obtenido
una cantidad suficientemente grande de ellos a partir de esta fuente, definimos unos
intervalos de igual tamao y procedemos a contar cuntos de esos nmeros se
encuentran en un intervalo dado; es decir, determinamos la frecuencia de repeticin de
ese intervalo. Si la tendencia es que cada intervalo tenga la misma frecuencia, entonces
podemos afirmar que esta fuente no tiene preferencia por ningn nmero en particular.
Por el contrario, como la frecuencia de repeticin es igual para cada intervalo, podemos
afirmar que cada nmero tiene la misma probabilidad de surgir de esa fuente. Decimos
entonces que la fuente origina nmeros con una distribucin de probabilidad uniforme.
Esto es precisamente lo que queremos decir cuando afirmamos que la funcin rand
genera nmeros uniformemente distribuidos. Los nmeros contenidos en los arreglos
rectangulares generados por rand oscilan entre 0 y 1, pero son distintos cada vez que se
11
Si se escribe help elmat en la ventana trabajo, se tiene acceso a una lista de tales funciones.
12
Estas funciones no estn limitadas a la creacin de matrices de m*n. En realidad, Matlab permite
manipular arreglos rectangulares de n dimensiones, donde se las matrices son arreglos de 2 dimensiones.
Una manera fcil de crear estos arreglos es utilizando la funcin zeros, ya que el comando zeros(m,n,p,
.) permite crear un arreglo rectangular multidimensional de tamao m*n*p*., donde cada elemento
es 0.
ejecuta el comando. Por ejemplo, si creamos dos veces una matriz de 2*3, obtenemos
algo como
rand(2,3)%funcin de dos entradas
ans =
0.370021621052006 0.364377061057412 0.354897736682523
0.135472321020959 0.403461190884072 0.489071030969134
rand(2,3)
ans =
0.399868442323011 0.321350516107878 0.0683318900993758
0.662271525725172 0.182714976381846 0.612297286574831
La Figura 2-10, creada en Matlab 5.3, prueba que los valores generados por rand se
encuentran uniformemente distribuidos. Para su construccin se ha creado un vector de
10000 elementos con la instruccin rand(1,10000). Luego se ha partido el intervalo
[0 1] en los diez subintervalos que se muestran en la grfica, y se ha implementado un
algoritmo con la finalidad de contar los datos que se encontraban en cada subintervalo
13
.
Por ltimo, esta informacin se ha colocado en una grfica de barras debidamente
etiquetada. Como era de esperarse para una distribucin uniforme, en cada una de las
diez particiones se encuentran aproximadamente mil nmeros
14
.
0.0 - 0.1 0.1 - 0.2 0.2 - 0.3 0.4 - 0.5 0.5 - 0.6 0.6 - 0.7 0.7 - 0.8 0.8 - 0.9 0.9 - 1.0 0.0 - 0.1
0
200
400
600
800
1000
1200
Intervalo del nmero
F
r
e
c
u
e
n
c
i
a
d
e
r
e
p
e
t
i
c
i
n
e
n
e
l
i
n
t
e
r
v
a
l
o
Distribucin de frecuencias para 10000 nmeros generados por la funcin rand
Figura 2-10 Histograma de frecuencias de para los 10000 valores generados por el comando rand
13
Este procedimiento puede resumirse utilizando un comando para grficas llamado histogram.
14
El comando randn genera nmeros que siguen una distribucin normal con media 0 y varianza 1, como
puede consultarlo en la ayuda el lector interesado. La estadstica ensea mtodos para convertir una
distribucin en otra, por lo que no son necesarias ms funciones para otras distribuciones.
Es importante subrayar que una vez que los elementos generados por rand se han
almacenado en una variable, stos permanecen constantes. El siguiente ejemplo muestra
cmo crear matrices con nmeros aleatorios contenidos entre valores arbitrarios a partir
de esta funcin.
Ejemplo 2-8
Utilizando la funcin rand, encontrar un mtodo para crear una matriz de tamao m*n
con elementos uniformemente distribuidos entre los valores reales
a
y b , siendo b a .
Solucin
Mediante la instruccin rand(m,n) es posible obtener una matriz de tamao m*n con
0 y 1 como sus valores extremos, valores no necesariamente contenidos en ella. Sea R la
matriz engendrada de esta manera. Consideremos ahora lo que sucede con los elementos
de R cuando la multiplicamos por una constante escalar X. Se ve al instante que los
valores que antes se encontraban en el intervalo [0 1], se encuentran ahora en [0 X]. Si
sumamos a cada elemento de esta nueva matriz el escalar Y, obtenemos una nueva
matriz cuyos elementos se encuentran uniformemente distribuidos en el intervalo [Y
X+Y]. Si queremos que esta ltima sea la matriz pedida, entonces sus elementos han de
encontrarse en el intervalo [
a
b ].
Por lo tanto, el problema consiste en encontrar los nmeros X e Y que satisfagan
simultneamente las dos ecuaciones lineales correspondientes a los extremos del
intervalo, a saber
b Y X
a Y
+
De donde obtenemos
a b Y b X
a Y
5 2 3
13 4 0
1 3 1
A
,
]
]
]
]
]
z
y
x
X
,
]
]
]
]
]
1
7
16
B
Entonces la solucin del sistema, si es nica, viene dada por
B A X *
1
.
En Matlab creamos primero A y B, de la siguiente manera
A=[1 3 -1; 0 4 -13; 3 -2 5]; B=[16 7 1]';
Y la solucin se puede obtener por cualquiera de los siguientes mtodos
X=inv(A)*B
X =
2
5
1
X=A\B %se usa un mtodo numrico distinto del anterior
X =
2
5
1
X=(B'/A')' %se el mismo numrico mtodo que en X=A/B
X =
2
5
1
En resumen, existen en Matlab dos tipos de operaciones entre matrices. A las que se
efectan elemento a elemento, se les llama operaciones entre arreglos (en ingls
arrays), y normalmente los operadores destinados para ello contienen un punto, como
es el caso de la operacin .*, a la cual nos referimos como multiplicacin de arreglos
rectangulares. El otro tipo de operaciones es el que se refiere a las matrices (en ingls
matrix operations) propiamente dichas, tal y como se entienden en el lgebra lineal.
Ahora se recomienda al lector revisar la ayuda doc arithmeticoperators, donde se
incluyen numerosos ejemplos de estas operaciones.
2.4.3 Manipulacin de Matrices
En secciones anteriores hemos aprendido distintas formas de crear matrices. Dada una
matriz, se plantea el problema de manipular sus elementos por separado, lo cual se
estudia en esta seccin.
Si A es una matriz, en el lgebra lineal es comn denotar al elemento que en la fila i-
sima y la columna j-sima de A, como
ij
a
. Existe en Matlab una notacin equivalente
que se sirve de los parntesis y las comas. As, el elemento
ij
a
se escribe en Matlab
como A(i,j), donde i y j son nmeros naturales que representan respectivamente
la fila y la columna en la que se ubica el elemento en A. Por ejemplo, dadas
A=[2 4; 8 2; -1 5], B=eye(2)
A =
2 4
8 2
-1 5
B =
1 0
0 1
Se tienen las relaciones
A(1,2) % A ;Primera fila, segunda columna
ans =
4
A(2,1) % A ;Segunda fila, primera columna
ans =
8
B(1,2) % B ;Primera fila, segunda columna
ans =
0
c=A(2,2)*B(1,1)
c =
2
Incluso, haciendo uso del valor en c
A(c,1) %equivale a A(2,1)
ans =
8
La misma notacin es vlida para los vectores por constituir stos un caso especial de
las matrices.
La diagonal principal de A se puede almacenar en un vector columna escribiendo
[A(1,1);A(2,2)]
ans =
2
2
O bien con la funcin diag, como
diag(A)
ans =
2
2
Existe una forma alternativa de referirse a los elementos de A, la cual slo utiliza un
nmero como referencia de la posicin. En sta, 2 es el primer elemento y 5 el sexto.
Esto es, para la matriz A del ejemplo anterior, observamos que la posicin de un
elemento queda unvocamente determinada si contamos su posicin a lo largo de las
columnas, de arriba hacia abajo y empezando por la de la izquierda. Es decir,
comenzando en el nmero 2, al cual llamamos elemento en la posicin nmero 1,
contamos los elementos a lo largo de esta columna hasta llegar a -1, que se encuentra en
la posicin 3; luego pasamos al elemento en la parte superior de la siguiente columna,
que es 4 y se encuentra en la cuarta posicin dentro de la matriz A. Seguimos as hasta
haber recorrido la totalidad de la matriz, y terminamos en el 5, ubicado en la sexta
posicin.
Al nmero o par de nmeros con que se identifica la posicin de un elemento, se les
conoce como ndices del elemento en la matriz A. Por lo tanto, tenemos
A(6)%equivale a A(3,3)
ans =
5
A(1,2)-A(4)
ans =
0
A(8)
??? Index exceeds matrix dimensions.
Este ltimo mensaje de error (el ndice excede las dimensiones de la matriz), se ha
generado precisamente porque no hay un octavo elemento en A.
Utilizando el operador dos puntos con esta notacin, es posible referirse a toda una fila
o columna de una matriz dada. Para ello se reemplazan ambos subndices por dicho
operador. As, la fila i-sima de A se escribe A(i,:), y la columna j-sima A(:,j). Por
su parte, la matriz A se escribe A(:,:). En otras palabras, se trata de otro uso del
operador dos puntos, en el que actuando como ndice de una matriz, viene a significar
todos los elementos.
En el ejemplo anterior tenemos
A(:,1) % A ; todos los elementos, columna 1
ans =
2
8
-1
A(2,:) %A ; fila 2, todos los elementos
ans =
8 2
A(:,:) % A ; todos los elementos, todos los elementos
ans =
2 4
8 2
-1 5
Pudiendo efectuarse la multiplicacin elemento a elemento
B(2,:).*A(:,1)'
ans =
14 56 -7
Tambin se encuentra que es posible utilizar vectores como subndices en esta notacin,
y entonces los elementos
il ik ij
a a a , ,
, se aslan en un B vector escribiendo
B=A(i,[j k l]). Si se colocan como subndices un vector y el operador dos
puntos, entonces es posible obtener simultneamente varias filas o varias columnas de
una matriz.
Adicionalmente, siempre es posible convertir una matriz en un vector columna,
obtenido uniendo dicha matriz por sus columnas. Esto se hace con la notacin A(:).
Por ejemplo:
A(1,[2 1]) % fila uno; columnas 2,1 (en ese orden)
ans =
4 2
A(1,[1 2]) % fila uno; columnas 1,2
ans =
2 4
A([2 3],:)% filas 2,3 ; todos los elementos
ans =
8 2
-1 5
A(:)'
ans =
2 8 -1 4 2 5
C=1+B(:)
C =
2
1
1
2
A(C,[1 2])% A; filas 2,1,1,2; columnas 1,2
ans =
8 2
2 4
2 4
8 2
Como se aprecia en este ltimo caso, es posible duplicar filas o columnas escribiendo
varias veces es mismo subndice en un vector. Esta es una propiedad que se usa con
frecuencia para crear el dominio de una grfica tridimensional, y es la base del comando
meshgrid, como se aprecia en el ejemplo 2-11.
Ejemplo 2-11
Dados dos vectores columna A y B, contando A con m elementos y B con n, obtener las
matrices X e Y, de tamao m*n, tal que las filas de X sean copias de A, y las filas de Y
sean copias de B.
Solucin
Dado que A consta de una sola columna, escribir A(:,1) equivale a escribir A. Pero si
escribimos A(:,[1 1]), creando una matriz de tamao n*2. Por ejemplo, tenemos
s=A(:,[1 1])%A; todos los elementos; columnas 1,1
s =
2 2
3 3
4 4
5 5
Por lo tanto, si en lugar del vector [1 1], colocamos en la expresin que define s, un
vector de unos conteniendo m elementos
16
, habremos obtenido la matriz pedida X.
Valendonos para ello de la funcin ones, podemos escribir
X=A(:,ones(1,m))
Donde m es conocido y A es el vector dado. Para el vector Y se escribe
Y= B(:,ones(1,n))
El procedimiento que acabamos de seguir no es otro que una versin corta del algoritmo
de clculo de la funcin meshgrid, de tal suerte que las matrices X e Y se obtienen
escribiendo
[X,Y]=meshgrid(A,B)
Este es un ejemplo de una funcin con dos argumentos de entrada (A y B), y dos
argumentos de salida. Ntese como los argumentos de entrada se escriben entre
parntesis y se separan por comas, mientras los de salida se escriben en corchetes
angulares y se separan tambin por comas. Ms adelante encontraremos ms de estas
funciones y aprenderemos tambin a crearlas.
16
Es indistinto utilizar un vector fila o columna. Es decir, puede usarse ones(m,1) o bien ones
(1,m)
Continuamos esta seccin destacando un hecho importante del operador dos puntos: su
dualidad.
Examinemos lo que sucede cuando el operador dos puntos se encuentra slo en un
parntesis que indica los ndices de los elementos de una matriz, por ejemplo A(1,:).
All lo encontramos significando todas las columnas.
Por otra parte, cuando se define un vector como B=[1:3:15], este operador est
sirviendo como una funcin que abrevia el proceso de creacin del vector B.
Siendo distintos en esencia los dos usos mencionados, no estn exentos de encontrarse
ambos en una misma lnea. Por ejemplo, si tenemos la matriz
A=10*[1:6;-5:2:5]
A =
10 20 30 40 50 60
-50 -30 -10 10 30 50
Entonces hemos visto que podemos escribir
B=A([1 2 1],[1 3 5 2])
B =
10 30 50 20
-50 -10 30 -30
10 30 50 20
Pero siendo un vector fila los ndices referentes a las columnas de A, el vector [1 3 5 2]
se puede escribir en notacin abreviada como [1:2:5 2], y se llega al mismo resultado
B=A([1 2 1],[1:2:5 2])
B =
10 30 50 20
-50 -10 30 -30
10 30 50 20
Si bien hemos usado slo vectores como subndices, Matlab admite tambin utilizar
matrices con nmeros naturales para este efecto, y en tal caso se supone que cada
elemento en la matriz representa un ndice. Es decir, si se escribe Z=X(Y), donde X es
una matriz cualquiera, mientras que Y es una matriz que contiene nmeros naturales, se
obtiene otra matriz Z del tamao de Y, en la que cada elemento
ij
z
es el elemento de X
indicado por el ndice en
ij
Y
. Por ejemplo, si tenemos A y B como en el ltimo
ejemplo, entonces ninguna puede usarse como Y para cualquier matriz X ya que ambas
contienen elementos negativos. Pero si tenemos
C=1+round(11*rand(2,3))
C =
8 10 9
5 7 6
Entonces podemos crear
D=B(C)
D =
30 20 50
-10 50 30
Resultado que se entiende mejor reescribiendo B como B(:). Para ver tambin la
posicin de cada elemento, escribimos
[[1:12]' B(:)]
ans =
1 10
2 -50
3 10
4 30
5 -10
6 30
7 50
8 30
9 50
10 20
11 -30
12 20
Donde la columna de la izquierda representa la posicin o ndice del elemento en B,
mientras a la derecha se encuentra B(:). Puede observarse que el elemento C(1,1) es
8, y el octavo elemento de B es 30, valor que a su vez se ha asignado a D(1,1).
Anlogamente, C(2,3)=6, B(6)=30, y D(2,3)=30.
De este modo, el proceso de asignacin ya descrito de la matriz Z=X(Y) puede
resumirse en el siguiente enunciado:
Para cada y= Y(i,j) se hace Z(i,j)=X(y).
Otros ejemplos son
A(C)
ans =
-50 40 10 30
20 -30 10 -10
20 20 30 30
A(C')
ans =
10 30
30 40
50 -10
E=A'
E =
10 -50
20 -30
30 -10
40 10
50 30
60 50
E(C)
ans =
-30 10 -10
50 -50 60
C(C)
??? Index exceeds matrix dimensions.
Este ltimo error era de esperarse ya que, por ejemplo, C(2,3) es igual a 10, pero C slo
contiene seis elementos, as que C(10) no existe y se produce el error que indica el
mensaje.
El ejemplo 2-13 de la siguiente seccin tiene por objeto hacer conciente al lector de la
simplificacin que representa este manejo directo de las matrices como subndices.
2.4.3 Modificacin de los valores contenidos en una Matriz
Considrese el problema de resolver un sistema de ecuaciones lineales con n
ecuaciones y m incgnitas. El enfoque del lgebra lineal para resolver uno de tales
sistemas es representarlo en su forma matricial, como se vio ya en el ejemplo 2-10. Si
bien el mtodo la matriz inversa expuesto all es de gran utilidad y sencillez, est
restringido a sistemas de ecuaciones cuya solucin es nica. Expondremos brevemente
ahora un mtodo ms general para abordar el problema de la solucin de un sistema de
ecuaciones lineales, llamado Eliminacin de Gauss. Se recomienda al lector que no est
familiarizado con este mtodo su consulta en los textos introductorios de lgebra lineal.
Tomemos, a ttulo de ejemplo explicativo, el sistema de ecuaciones del ejemplo 2-10.
En su representacin matricial nos hemos olvidado de las incgnitas y hemos colocado
sus coeficientes en la matriz A, de tal manera que cada una de sus filas representa una
ecuacin, mientras que cada columna conciente los coeficientes de una variable distinta
en cada ecuacin. Ahora bien, es un hecho conocido que dos o ms ecuaciones pueden
siempre multiplicarse por un escalar no nulo, as como sumarse para obtener una nuevas
ecuaciones cuya solucin no es la misma contenida en el sistema original.
Si ampliamos A en una columna para que incluya los trminos independientes,
encontramos
17
]
]
]
]
]
]
]
1 5 2 3
7 13 4 0
16 1 3 1
A
En esta representacin matricial del sistema de ecuaciones lineales, efectuar operaciones
entre ecuaciones equivalente a hacerlo entre las filas de A. Por ejemplo, para eliminar la
variable x de la ltima ecuacin, basta con hacer cero su coeficiente en la matriz A, lo
cual puede lograrse si se resta de la fila que la contiene (tercera fila), el triple de la
primera fila de A. Esto equivale a restar de la tercera ecuacin el triple de la primera,
para obtener la nueva ecuacin que no contiene la variable x
47 8 11 + z y
Si desechamos la tercera ecuacin del sistema original y consideramos el nuevo sistema
formado por sus dos primeras ecuaciones y la que acabamos de obtener, habremos dado
un paso hacia delante en nuestra bsqueda de los valores para los cuales se satisface el
conjunto de ecuaciones dado ya que stos son los mismos para ambos sistemas, el viejo
y el nuevo. Si B es la representacin del nuevo sistema, entonces tenemos.
17
Aqu est tcito un igual que separa la ltima columna del resto de la matriz. Tambin pudo invertirse el
signo de los elementos independientes, y entonces las ecuaciones se supondran igualadas a cero. Ambas
posibilidades son equivalentes ya que slo difieren en la forma de leer la respuesa.
]
]
]
]
]
]
]
1 5 2 3
7 13 4 0
16 1 3 1
A
]
]
]
]
]
]
]
47 8 11 0
7 13 4 0
16 1 3 1
B
Que es la representacin matricial de
47 8 11
7 13 4
16 3
+
+
z y
z y
z y x
Si introducimos la notacin
i
F para denotar la fila i-sima, el paso de la matriz A a la
matiz B puede representarse como
1 3 3
* 3 F F F
. Este es un ejemplo de una
operacin entre las filas de una matriz.
Puesto que intercambiar las filas de la matriz B no altera el sistema ms que en su
orden, podemos aadir el intercambio de filas a nuestra lista de operaciones entre filas.
Bajo la notacin anterior, las tres operaciones aceptadas pueden escribirse como
i i
F k F * (multiplicacin por escalares)
j i i
F F F + (suma de filas)
j i
F F
(Intercambio de filas)
Mediante el uso adecuado de estas operaciones
18
, el sistema anterior se convierte en
]
]
]
]
]
]
]
1 1 0 0
5 0 1 0
2 0 0 1
S
Esta matriz, conteniendo unos en su diagonal principal y ceros debajo de ella, recibe el
nombre de Matriz escalonada. En particular, la matriz S mostrada, por contener tambin
ceros por encima de esta diagonal, es una Matriz escalonada reducida, de la cual se lee
directamente la solucin
1
5
2
z
y
x
El procedimiento expuesto para convertir una matriz en su equivalente matriz
escalonada, recibe el nombre de Eliminacin Gaussiana. En la eliminacin Gaussiana, la
solucin final se obtiene por sustitucin regresiva, por ejemplo, si en un sistema
cualquiera se llega a la matriz escalonada
18
Las operaciones entre filas se hacen arreglando cada columna de la matriz, de izquierda a derecha, hasta
obtener S .
]
]
]
]
4 1 0
0 3 1
T
Entonces se lee directamente
4 y
, mientras que
x
se obtiene reemplazando este valor
en la ecuacin que representa la primera fila; para encontrar
12 3 0 y x
. Este
reemplazamiento es a veces llamado sustitucin regresiva.
Por otra parte, si se contina este proceso de realizar operaciones entre filas, tambin
conocido como reduccin, se puede llegar a obtener la matriz escalonada reducida, y
entonces el mtodo se llama eliminacin de Gauss-Jordan, el cual tiene la ventaja de
evitar la sustitucin regresiva.
Antes de ver la implementacin manual de este mtodo en Matlab, procederemos a
revisar las formas de modificar el contenido de una matriz.
Si M es una matriz, entonces es posible cambiar un elemento cualquiera en ella,
volvindolo a definir tal y como si se tratara de una variable.
Por ejemplo, sea
M=[1 3 5;-7 3 0;-2 1 1]
M =
1 3 5
-7 3 0
-2 1 1
Colocamos un cero en la posicin central de M as
M(2,2)=0
M =
1 3 5
-7 0 0
-2 1 1
Debe notarse que ahora la matriz contenida en la variable M ha cambiado, y ya no ser la
misma cuando intentemos realizar clculos con ella.
Mediante este mtodo es posible modificar ms de un elemento cada vez, utilizando la
notacin de la seccin anterior, incluyendo el uso de un solo ndice para ubicar un
elemento en la matriz. En particular, resulta til el operador dos puntos para realizar
operaciones sobre filas o columnas. Algunos ejemplos son:
M(2)=M(3)%Se modifica aquello que est a la izquierda del igual
M =
1 3 5
-2 0 0
-2 1 1
M(1,:)=[10 15 26]%Se redefine la primera fila
M =
10 15 26
-2 0 0
-2 1 1
M(:,2)=ones(3,1)%se redefine la segunda columna
M =
10 1 26
-2 1 0
-2 1 1
M(:,1)=2*M(:,1)%Se duplica la primera columna
M =
20 1 26
-4 1 0
-4 1 1
Para intercambiar dos filas es necesario almacenar una de ellas temporalmente en una
variable, tal como ans. Por ejemplo
M(2,:)
ans =
-4 1 0
M(2,:)=M(1,:)
M =
20 1 26
20 1 26
-4 1 1
M(1,:)=ans
M =
-4 1 0
20 1 26
-4 1 1
La Tabla 2-5 resume el empleo en Matlab de las tres operaciones entre filas. Las
operaciones entre columnas se realizan de modo anlogo, ubicando el operador dos
puntos del otro lado de la coma.
Operacin Notacin Escritura en Matlab
19
Multiplicacin de la
fila j por un escalar
t
j j
tF F A(:,j)=t*A(:,j)
Intercambio de la fila
j con la fila k k j
F F
B=A(:,j)
A(:,j)=A(:,k)
A(:,k)=B
Suma de la fila k a la
fila j
k j j
F F F + A(:,j)+A(:,k)
Tabla 2-5 Operaciones entre filas
El siguiente ejemplo ilustra la manera de emplear esta notacin para resolver un sistema
de ecuaciones lineales paso a paso en Matlab. Este conocimiento nos ser til para el
tercer captulo, donde crearemos un algoritmo que haga esto por nosotros
20
.
Ejemplo 2-12
Utilizar la Eliminacin de Gauss-Jordan para resolver el sistema de ecuaciones
19
Se supone que las filas se encuentran en la matriz A
20
De hecho Matlab incorpora una funcin llamada rref que nos permite reducir una matriz, aunque el
algoritmo utilizado all sigue otro mtodo de reduccin.
8 2
2 4 3
20 6 5 2 2
+
+ +
w x
w z y
w z y x
Solucin
21
Primero observamos que el mtodo de la inversa no es aplicable a este sistema, dado
que no posee solucin nica. Puesto que el sistema es independiente y de tamao 3*4,
las infinitas soluciones se pueden escribir con respecto a un solo parmetro.
Procedemos a almacenar el sistema en la matriz A
A=[2 2 -5 6 20; 0 1 -3 4 2; 2 0 0 -1 8]
A =
2 2 -5 6 20
0 1 -3 4 2
2 0 0 -1 8
A continuacin operamos de tal modo que la primera columna se convierta en [1 0
0]. Primero hemos de dividir toda la primera fila por el primer elemento de A
22
, lo
cual es posible pues este es no nulo; en caso contrario sera necesario intercambiar las
filas de A.
A(1,:)=A(1,:)/A(1)
A =
Columns 1 through 3
1 1 -2.5
0 1 -3
2 0 0
Columns 4 through 5
3 10
4 2
-1 8
Ahora se resta de la tercera fila de A, la primera fila multiplicada por el primer elemento
de la tercera
A(3,:)=A(3,:)-A(3,1)*A(1,:)
A =
Columns 1 through 3
1 1 -2.5
0 1 -3
0 -2 5
Columns 4 through 5
3 10
4 2
-7 -12
Procediendo con la segunda columna de A, deseamos operar hasta transformarla en [0
1 0], cuidando de no alterar la primera columna. Con este fin nos valemos de la
21
Si el lector intenta seguir l mismo la solucin en el computador, encontrar til copiar la matriz A en
otra variable para recuperarla en caso de que cometa errores. Tambin puede ahorrar mucho tiempo
utilizando las flechas del teclado para modificar los comandos repetitivos.
22
Buscando la generalidad del mtodo, en esta solucin no copiamos directamente un elemento de A. Por
ello no escribimos A(1,:)=A(1,:)/2. Esto nos permitir luego crear un programa de aplicacin general.
segunda fila de A
23
, la cual no modificamos pues ya contiene un 1 donde as lo
queremos.
A(1,:)=A(1,:)-A(1,2)*A(2,:)
A =
Columns 1 through 3
1 0 0.5
0 1 -3
0 -2 5
Columns 4 through 5
-1 8
4 2
-7 -12
A(3,:)=A(3,:)-A(3,2)*A(2,:)
A =
Columns 1 through 3
1 0 0.5
0 1 -3
0 0 -1
Columns 4 through 5
-1 8
4 2
1 -8
Finalmente, nos queda convertir la tercera columna de A en [0 0 1]. Con tal fin se
emplea como pivote la tercera fila de A.
A(3,:)=A(3,:)/A(3,3)
A =
Columns 1 through 3
1 0 0.5
0 1 -3
0 0 1
Columns 4 through 5
-1 8
4 2
-1 8
Esta es la forma escalonada de la matriz A. Los subsiguientes pasos marcan la
diferencia entre el mtodo de Gauss-Jordan y el mtodo de Gauss.
A(1,:)=A(1,:)-A(1,3)*A(3,:) %Se convierte en A(1,3) en 0
A =
Columns 1 through 3
1 0 0
0 1 -3
0 0 1
Columns 4 through 5
-0.5 4
4 2
-1 8
A(2,:)=A(2,:)-A(2,3)*A(3,:) % Se convierte en A(2,3) en 0
A =
23
En el empleo de este mtodo es comn llamar fila pivote a aquella que sirve de apoyo para las
operaciones de reduccin.
Columns 1 through 3
1 0 0
0 1 0
0 0 1
Columns 4 through 5
-0.5 4
1 26
-1 8
En esta ltima matriz (que es escalonada reducida) puede leerse
8
26
4
2
1
+
w z
w y
w x
Parametrizando la solucin con respecto a t, obtenemos
t z
t y
t x
t w
+
+
8
26
2
1
4
Lo cual concluye la solucin del problema.
Adems de escalares, en esta notacin tambin pueden utilizarse vectores como ndices
de la matriz que va a modificarse. Por ejemplo, dada
A=[6 3 2; 9 7 10];
Podemos redefinir los elementos en la primera y tercera posicin de la primera fila,
escribiendo
A(1,[1 3])=[10 -5]
A =
10 3 -5
9 7 10
Adems es tambin vlida la notacin abreviada del operador dos puntos.
En ocasiones es til referirse en esta notacin al ltimo elemento de una fila o columna,
sin importar su tamao. Para ello se escribe como end como ndice. Por ejemplo
A(end) %ltimo elemento contado por las columnas
ans =
10
A(end,end) %ltima fila, ltima columna
ans =
10
A(1,end) %primera fila, ltima columna
ans =
-5
A(end,2) %%ltima fila, segunda columna
ans =
7
Podemos entender end como el nmero que representa el subndice de la posicin final
de la fila o la columna de una matriz ya creada. Por lo tanto, no es extrao que pueda
sumarse, restarse o multiplicarse. Sin embargo, end slo funcionar dentro de los
parntesis que contienen los subndices de una matriz o vector.
A([end end-1],1) %filas ltima y penltima, columna 1
ans =
-1
10
Combinando adecuadamente end con el operador dos puntos es posible realizar varias
tareas tiles. En uno de los usos del operador dos puntos, end sirve para modificar la
ltima fila o columna de una matriz. Por ejemplo
A(:,end) %todos los elementos, ltima columna
ans =
-5
15
A(end,:)=A(end,:)-A(1,:) %ltima fila menos primera fila
A =
10 3 -5
-1 4 15
En otro de sus usos combinados, la inversin de un vector se escribe
B=1:3:16; B(end:-1:1)
ans =
16 13 10 7 4 1
Finalmente, es posible borrar elementos de un vector hacindolos igual a la matriz vaca
a=[1 3 5 7 -5]; a([2 4])=[]
a =
1 5 -5
El mismo procedimiento se usa para suprimir filas o columnas en una matriz. Por
ejemplo, dada
m=ones(5); m([3 2],:)=-5*m([3 2],:)
m =
1 1 1 1 1
-5 -5 -5 -5 -5
-5 -5 -5 -5 -5
1 1 1 1 1
1 1 1 1 1
Pueden borrarse las filas segunda tercera escribiendo
m([2 3],:)=[]
m =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
Ejemplo 2-12
Sean B y C las matrices del final de la seccin 2.4.2, obtener la matriz D=B(C)
empleando nicamente escalares como subndices.
Solucin
En aquella seccin tenamos las matrices
B
B =
10 30 50 20
-50 -10 30 -30
10 30 50 20
C
C =
8 10 9
5 7 6
Para resolver el problema partiremos almacenando en D una matriz de ceros del tamao
requerido, y luego modificaremos uno por uno todos de sus elementos hasta haber
terminado. As pues, como D y C deben tener el mismo tamao, copiamos
D=zeros(2,3)
D =
0 0 0
0 0 0
Recordando que si C(i,j)=c entonces D(i,j)=B(c), podemos sintetizar el
proceso en un paso y modificar cada elemento D(i,j), escribiendo
D(i,j)=B(C(i,j)). En aras de la brevedad, todo el proceso se copiar en un par de
lneas que en conjunto tienen de 6 comandos, uno por cada elemento modificado.
D(1,1)=B(C(1,1)); D(1,2)=B(C(1,2)); D(1,3)=B(C(1,3)); ...
D(2,1)=B(C(2,1)); D(2,2)=B(C(2,2));D(2,3)=B(C(2,3))
D =
30 20 50
-10 50 30
Ntese cmo los puntos suspensivos han permitido continuar escribiendo en la siguiente
lnea.
Evidentemente, una matriz C ms grande requerira de muchas ms lneas para lograr
obtener D=B(C). Si bien en un algoritmo es posible implementar con facilidad la
tcnica recin descrita, el tiempo que tardara en hacerlo considerablemente mayor que
el requerido por el comando B(C). Esta mayor eficiencia es precisamente la razn por la
cual hemos dedicado tantas pginas a la manipulacin de matrices, y con suerte los
frutos comenzarn a verse en el captulo tercero.
2.4.4 Funciones que actan sobre matrices y sobre arreglos rectangulares
Ya hemos visto que las funciones matemticas elementales pueden aplicarse
directamente a todos los elementos de un arreglo rectangular. Tambin nos encontramos
ya con la funcin inv, la cual vimos que permite calcular la inversa de una matriz. En la
ayuda help elmat es posible encontrar otras funciones tiles en la manipulacin de
matrices y de arreglos en general. En esta seccin comentaremos algunas de esas
funciones, prestando especial atencin a las que son ms utilizadas en una amplia gama
de algoritmos que cumplen diferentes propsitos.
La Tabla 2-6 contiene las funciones que se estudian en esta seccin. Se supone que A es
una matriz cualquiera; X es un vector fila o columna, y B es una matriz cuadrada.
Comando Argumento de salida
size(A) Vector fila con el tamao de A
length(X) Longitud de X
sum(A)
Vector fila con las sumas a lo
largo de las columnas de A
prod(A)
Vector fila con los productos a lo
largo de las columnas de A
max(A)
Vector fila con los mayores
elementos de las columnas de A
min(A)
Vector fila con los menores
elementos de las columnas de A
union(X1,X2)
Vetor fila con el conjunto unin
de X1 y X2
intersect(X1,X2)
Vetor fila con el conjunto
interseccin de X1 y X2
diag(A)
Vector columna con la diagonal
principal de A
det(B) Determinante de B
El comando size (tamao), tiene como argumento de salida un vector fila que contiene
las dimensiones del arreglo rectangular al que se le aplica. Este conocimiento es de
particular importancia cuando se pretende crear funciones generales que acten sobre
arreglos de cualquier tamao. Veamos su uso con algunos ejemplos:
p=ones(4,3);
size(p)
ans =
4 3
Puesto que s es tambin un vector, podemos reconstruir p escribendo
p=ones(s(1),s(2))
p =
1 1 1
1 1 1
1 1 1
1 1 1
La variable ans tambin puede someterse a esta funcin, por ejemplo
[-1:.5:10]';
size(ans)
ans =
23 1
Por ltimo, este comando puede aplicarse a una parte de una matriz. Por ejemplo
t=zeros(20,30);
size(t(10:end,[1 3]))%filas dcima a ltima, columnas 1 y 3 de t
ans =
11 2
Resultado que es el tamao de la matriz indicada.
El comando length, cuando se aplica a un vector, devuelve el nmero de elementos que
contiene. Si se aplica a una matriz, devuelve la mayor de sus dimensiones. Por ejemplo
length(pi:pi/50:100*pi)
ans =
4951
length(t)
ans =
30
5:10:length(t) %length puede usarse para crear vectores
ans =
5 15 25
El comando sum es de gran utilidad para escribir sumatorias sin tener que recorrer a
ciclos. Para ilustrar su uso, apliqumoslo a las llamadas matrices mgicas, matrices
cuadradas para las que la suma a lo largo de una fila o columna es constante. El
comando magic(n) crea en Matab la matriz mgica de orden n. Por ejemplo
M=magic(3)
M =
8 1 6
3 5 7
4 9 2
Realizando la suma a lo largo de sus columnas, obtenemos
sum(M)
ans =
15 15 15
Para sumar los elementos de cada fila, basta con transponer la matriz
sum(M')
ans =
15 15 15
El uso del comando prod es completamente anlogo
prod(M)%producto de las columnas
ans =
96 45 84
Y puesto que M(:) devuelve un vector columna con todos los elementos de M,
podemos multiplicarlos todos ellos escribiendo
prod(M(:))%producto de todos los elementos de M
ans =
362880
Para ver el mayor de los elementos en un vector X, se usa max(x). Cuando este
comando se aplica a una matriz, se obtiene el mayor elemento de cada columna.
Obsrvese que leght(A) es equivalente a max(size(A)). Por otra parte, si A
contiene elementos complejos, entonces se usa automticamente su valor absoluto, es
decir, max(abs(A)). La funcin min es completamente anloga.
max(5:10:337)
ans =
335
min(prod(M)) %menor de los productos de las columnas de M
ans =
45
[max(M); max(M')] %[Mayores en columnas; Mayores en filas]
ans =
8 9 7
8 7 9
En otro de sus usos, si se escribe C=max(A,B), se obtiene una matriz de igual tamao
que A y B, en la que el elemento
ij
c
corresponde al mayor de los elementos
ij
a
y
ij
b
S=round(10*rand(size(M)))
S =
4 9 4
6 7 9
8 2 9
max(M,S)
ans =
8 9 6
6 7 9
8 9 9
Adicionalmente, la funcin max puede tener ms de un argumento de salida. Para las
separar los argumentos de salida se una funcin, stos se encierran entre corchetes y se
separan por comas. As, una funcin con m entradas y n salidas se escribe
[salida_1,...,salida_m]=funcion(entrada_1,...,entrada_n)
El segundo argumento de salida de max es un vector que contiene los ndices que
indican la posicin donde se ubican en la columna de la matriz los elementos mayores.
Por ejemplo
[a,b]=max(M)
a =
8 9 7
b =
1 3 2
Lo que significa que el 8 est de de primero en su columna, el 9 est de tercero en la
suya, y el 7 de segundo. Ntese que se han creado simultneamente dos variables.
Ahora veremos dos funciones que son tiles cuando las matrices se toman en el sentido
del lgebra lineal.
El determinante de una matriz cuadrada se calcula fcilmente a travs del comando det.
Para la matriz mgica de orden tres, se tiene
det(M)
ans =
-360
Ahora se puede probar que la matriz mgica de orden seis es singular, esto es, que su
determinante es cero
det(magic(6))
ans =
0
Propiedad que tienen todas las matrices mgicas de orden par.
La diagonal principal de una matriz (cuadrada o no), se obtiene con el comando diag.
Por ejemplo
diag(M)
ans =
8
5
2
diag(S.^2)
ans =
16
49
81
diag(magic(6))
ans =
35
32
2
17
14
11
Por lo tanto, la traza de una matriz A, entendida como la suma de los elementos de su
diagonal, se escribe sum(diag(A)).
Ejemplo 2-14
Calcular las siguientes sumatiorias en Matlab
a)
8
3 i
i
b)
200
10
2
i
i
c)
+
200
10
2
) log( ) log(
i
i i i
Solucin
La idea consiste en almacenar en un vector cada elemento de la sumatoria, y utilizar
luego la funcin sum para efectuar su suma. Es decir, si la sumatoria es
q
p i
i
a , entonces se crea un vector X con los elementos correspondientes
q q p p
a a a a , ,..., ,
1 1 +
; y luego se evala sum(X).
a) Puesto que los valores van de 3 a 8 con incrementos de 1, escribimos
a=3:8;
sum(a) %Se pudo escribir directamente sum(3:8)
ans =
33
b) Se procede a crear un vector cuyos elementos se elevan al cuadrado, y luego se
calcula su suma
a=[10:200];
sum(a.^2) %o bien: sum([10:200].^2)
ans =
2686415
c) Aqu existen varias formas de proceder. Sin aplicar la propiedad distributiva de la
sumatoria, podemos escribir
sum(log(a)-log(a+a.^2))
ans =
-853.430879527389
Si la aplicamos, podemos tomar la diferencia de las dos sumatorias resultantes para
escribir
sum(log(a))-sum(log(a+a.^2))
ans =
-853.430879527389
Ahora el lector puede replantear el ejemplo 2-5 para escribirlo en trminos de
sumatorias. Se propone tambin que aplique el artificio all expuesto para calcular el
cociente del factorial de dos nmeros grandes.
Aunque aqu no lo mostramos, el uso de la funcin prod es anlogo al de sum, y el
factorial de un nmero natural n siempre puede escribirse como prod(1:n).
2.4.5 Concatenacin y la expansin escalar
Terminamos nuestro estudio de las matrices haciendo nfasis en la ya mencionada
concatenacin, por constituir sta una herramienta muy utilizada en cierto tipo de
algoritmos que contienen rutinas repetitivas llamadas ciclos.
Para esta discusin tomaremos las matrices
A=magic(3)
A =
8 1 6
3 5 7
4 9 2
B=magic(4)
B =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Veremos primero cmo formar nuevas matrices y vectores a partir de ellas. Observemos
que podemos hacer referencia a las primeras columnas tres de B escribiendo
B(:,1:end-1) % todos los elementos, columnas 1 hasta penltima
ans =
16 2 3
5 11 10
9 7 6
4 14 15
Podemos formar una nueva matriz C uniendo A con esta parte de B a travs de sus
columnas. Para ello las encerramos entre corchetes punto y coma.
C=[A;B(:,1:end-1)]
C =
8 1 6
3 5 7
4 9 2
16 2 3
5 11 10
9 7 6
4 14 15
La matriz resultante contiene encima a A, bajo la cual se hallan las primeras tres
columnas de B. Naturalmente, la concatenacin ha sido posible porque ambas tienen el
mismo nmero de columnas. Si intentsemos unirlas por las filas, obtendramos el error
C=[A B(:,1:end-1)]%A tiene una fila menos
??? All matrices on a row in the bracketed expression must have the
same number of rows.
Sin embargo, tambin es posible transponer B(:,1:end-1) para tornarla en una matriz
de 3*4, y entonces s puede efectuarse la concatenacin por filas
Cc=[A B(:,1:end-1)']
Cc =
8 1 6 16 5 9 4
3 5 7 2 11 7 14
4 9 2 3 10 6 15
Observemos tambin que en este proceso de formacin de matrices, podemos aplicar
funciones y clculos como elementos de la nueva matriz formada
D=[A, round(9*rand(size(A)))] %El segundo "elemento" es una ...
matriz aleatoria del tamao de A
D =
8 1 6 4 3 1
3 5 7 8 7 2
4 9 2 1 0 2
En un uso algo ms general de la concatenacin, pueden crearse matrices a partir de
otras no slo empleando la notacin de los vectores, sino como matrices ellas mismas.
Por ejemplo, podemos crear una matriz cuadrada que contenga las potencias de A,
escribiendo
potencias=[A A.^2;A.^3 A.^4]
potencias =
8 1 6 64 1 36
3 5 7 9 25 49
4 9 2 16 81 4
512 1 216 4096 1 1296
27 125 343 81 625 2401
64 729 8 256 6561 16
Es decir, hemos formado la matriz
]
]
]
]
4 3
2
A A
A A
, donde los exponentes se refieren a la exponenciacin elemento a elemento.
Ahora cabe preguntarnos lo que sucede cuando intentamos concatenar de este modo una
matriz y un escalar. Por ejemplo
[B 5]
??? All matrices on a row in the bracketed expression must have the
same number of rows.
En estos casos se produce siempre el mismo error. Sin embargo, s existe una forma de
ampliar una matriz dada aumentndola en un escalar; entonces, Matlab rellena los
elementos restantes con ceros para completar la matriz. Para hacerlo, basta con definir
una parte de la matriz que exceda su tamao. Por ejemplo, en la matriz A que tenemos,
intentamos introducir un elemento en una cuarta fila de A, obtenemos
A(4,1)=16
A =
8 1 6
3 5 7
4 9 2
16 0 0
Como vemos, los elementos restantes se han rellenado con ceros. Si en cambio se
redefine toda una columna o fila empleando un escalar, ste se copia en toda esa
columna o fila, exista o no. Por ejemplo
A(2,:)=-1 %se redefine la fila dos, ya existente
A =
8 1 6
-1 -1 -1
4 9 2
16 0 0
A(:,5)=8 %Se crea la quinta fila
A =
8 1 6 0 8
-1 -1 -1 0 8
4 9 2 0 8
16 0 0 0 8
En este ltimo caso, puesto que no exista tampoco la fila cuatro, sta se ha rellenado
con ceros. Estos procedimientos para aumentar matrices definiendo sus nuevas filas o
columnas reciben el nombre de expansin escalar.
Tambin es posible aplicar la expansin escalar para crear simultneamente filas y
columnas, como en
B(6,6)=3
B =
16 2 3 13 0 0
5 11 10 8 0 0
9 7 6 12 0 0
4 14 15 1 0 0
0 0 0 0 0 0
0 0 0 0 0 3
Restauramos las matrices originales volvindolas a crear
A=magic(3);B=magic(4);
Se pueden redefinir rpidamente todos los elementos de una matriz utilizando los dos
puntos
A(:)=0 %o bien A(:,:)=0
A =
0 0 0
0 0 0
0 0 0
Tambin es vlido copiar vectores o an matrices en las filas o columnas an
inexistentes de una matriz
A(:,6)=[1 4 3]' %se crea la sexta columna de A
A =
0 0 0 0 0 1
0 0 0 0 0 4
0 0 0 0 0 3
De nuevo se han introducidos los ceros necesarios en la quinta columna. Para borrar una
las primeras tres columnas, la hacemos iguales a la matriz vaca
A(:,1:3)=[]
A =
0 0 1
0 0 4
0 0 3
Podemos copiar una parte de B en esta ltima matriz. Digamos que sea la parte de B que
va de la primera a la penltima fila, y de la tercera a la ltima columna. Queremos
copiarla en la parte de A que va de la primera a la ltima fila, en la primera y segunda
columnas. Escribimos entonces
A(:,[1 2])=B([1:end-1],[3:end])
A =
3 13 1
10 8 4
6 12 3
Por ltimo, observemos que es fcil copiar elementos de un vector en una matriz
utilizando un solo subndice
d=2:3:14 %se crea el vector d
d =
2 5 8 11 14
s(1:length(d))% los primeros length(d) elementos en s
ans =
3 10 6 13 8
s(1:length(d))=-d %cambiamos esos elementos por los de -d
s =
-2 -11 1
-5 -14 4
-8 12 3
El siguiente ejemplo aplica parte de los conocimientos adquiridos sobre vectores y
matrices.
Ejemplo 2-15
Dados dos vectores A y B, donde A tiene tantos o ms elementos que B, generar un
tercer vector fila C que contenga los elementos intercalados de ambos, hasta donde sea
posible. Esto es, si hay n elementos en B, entonces C=[a1 b1 a2 b2an bn]
Solucin
Si A B no son vectores columna, entonces podemos escribir
A=A(:); B=B(:);
Para que as lo sean.
Adems, puesto que n=length(B) y nos interesan los n primeros elementos de A,
escribimos
Aa=A(1:length(B));
De suerte que el problema planteado se reduce a encontrar una forma de intercalar dos
vectores columna de igual tamao. En este punto hacemos uso del siguiente artificio: Si
a y b son vectores fila de igual tamao, entonces se puede formar la matriz de dos filas
[a; b]. Observemos con un ejemplo lo que sucede cuando se leen sus columnas
a=[1:3]; b=-[3:-1:1]; X=[a;b]
X =
1 2 3
-3 -2 -1
Para leer las columnas, escribimos
X(:)
ans =
1
-3
2
-2
3
-1
Evidentemente, la lectura de las columnas de X equivale al vector intercalado de a y b.
Para que el resultado sea un vector fila, basta con transponer este resultado, de modo
que podemos obtener el vector intercalado C escribiendo
X=[Aa; B]
C=X(:).'
Donde para transponer se ha usado .' en lugar de ', ya que los elementos de A y
B bien podran ser complejos.
Finalmente, podemos generalizar ms la respuesta si levantamos la restriccin de que
length(A)>length(B). Para ello, una vez que A y B son vectores columna,
almacenamos en S el menor se estos dos nmeros, escribiendo
S=min(length(A),length(B))
Y luego se redefinen tanto A como B diciendo
A=A(1:s); B=B(1:s)
En conjunto, hemos de realizar los siguientes pasos en el orden en que se escriben:
%1.Transformar A y B en vectores columna
A=A(:); B=B(:)
%2. Almacenar en S el menor de los tamaos de A y B
S=min(length(A),length(B));
%3. Crear la matriz X, compuesta de las filas dos filas
%correspondientes a los primeros S elementos en A y B
X=[A(1:S).'; B(1:S).'];
%4. El vector resultante C, se obtiene leyendo las columnas de X.
%Se transpone para que sea un vector fila
C=X(:).';
La secuencia lgica de pasos o instrucciones que acabamos de escribir, y mediante la
cual se obtiene un resultado cada vez que se ejecuta en su totalidad; es lo que
comnmente denominamos algoritmo. En el captulo tercero se ver cmo se almacena
una algoritmo en un archivo, de tal manera que no sea ms necesario escribir estos
pasos cada vez que se desean llevar a cabo.
De esta manera damos por concluida la introduccin a las matrices de elementos
numricos. Ahora procederemos a estudiar otros tipos de variables, y veremos que su
manipulacin es en esencia la misma que acabamos de ver para las matrices.
2.5 Diversos tipos de variables y su manipulacin
Hasta ahora hemos empleado Matlab como una calculadora de alta capacidad, y por ello
nos hemos limitado a las variables que contienen nmeros. Si bien para efectos de
clculo pueden resultar suficientes estas variables y tal vez otras que se manejen como
smbolos matemticos, el uso de Matlab como lenguaje de programacin requiere de la
manipulacin de tipos adicionales de variables, que sern estudiados en esta seccin.
As, por ejemplo, para la creacin de una base de datos que almacene el nombre y el
telfono de varios individuos, es necesario al menos tratar con variables que contengan
cadenas de caracteres, y en las cuales se almacenen los nombres de aquellos individuos.
Hemos de recordar que la clase o tipo de una variable se define segn su contenido.
2.5.1 Nmeros de precisin doble y sencilla. Funciones para ver y manipular los
tipos de variables
Todas las variables que hemos empleado hasta ahora son nmeros de doble precisin
(double). La precisin hace referencia a los decimales que emplea el programa para
realizar los clculos. Las variables de precisin doble contienen nmeros de punto
flotante que se calculan con 16 cifras significativas en el intervalo
308
10
a
308
10 .
Por defecto, todas las variables numricas de Matlab son de precisin doble, a menos
que se especifique lo contrario. Nmeros de precisin sencilla se pueden obtener con la
funcin single. Cuando X es una matriz, single(x) crea una variable de precisin
sencilla, en la que los clculos no consideran tantos dgitos. La ventaja de ello se debe
en parte a que una variable de precisin simple ocupa alrededor de un 50% menos de
memoria, comparada con una de precisin doble.
Para ver una lista de las variables existentes, se emplea el comando who. Por ejemplo,
supongamos que nicamente hemos escrito en Matlab los comandos
a=rand(50,60); b=pi; c=single(a); 84;
Entonces podemos ver las variables que se han creado, escribiendo who
who
Your variables are:
a ans b c
Cuando no existe ninguna variable, who no regresa ningn resultado.
El comando clear permite borrar variables y no genera error cuando estas an no
existen
24
. Para emplearlo se escribe clear, seguido de espacios y los nombres de las
variables que se desean borrar. Por ejemplo
clear a ans www %Borra las variables "a" y "ans"
Verificamos que se han borrado escribiendo
who
Your variables are:
b c
Cuando se escribe
clear all
Se borran todas las variables almacenadas en la memoria virutal Workspace
Para ver una lista que incluye informacin sobre las variables, se emplea el comando
whos. Por ejemplo
a=rand(50,60); b=pi; c=single(a); 84; whos
Name Size Bytes Class
a 50x60 24000 double array
ans 1x1 8 double array
b 1x1 8 double array
c 50x60 12000 single array
Grand total is 6002 elements using 36016 bytes
La primera columna de la lista contiene el nombre de la variable, la segunda su tamao;
la tercera el espacio que ocupa en WS, y la cuarta indica la clase de variable que es.
24
El comando clc slo deja en blanco la ventana de trabajo, pero no borra las variables de la memoria WS.
Esta ltima columna nos dice que c es diferente de las dems variables, pues su
precisin es sencilla, motivo por el cual ocupa slo 12000 Bytes, en comparacin
con los 24000 de a.
La frase del final nos dice que en total las matrices contienen 6002 elementos y ocupan
una memoria virtual de 36016 bytes.
La misma informacin puede verse en la ventana Workspace Browser, que se abre
desde el men FileShow Workspace, o bien escribiendo en la ventana de trabajo la
palabra workspace.
Figura 2-11 Ventana Workspace Browser
En esta ventana puede seleccionarse una variable haciendo click en su nombre. Luego
puede borrarse del botn delete, o puede presionarse open para abrir una ventana desde
la cual es posible ver y modificar la informacin contenida en la variable, en un entorno
grfico similar al de Excel. Para ampliar el tema se sugiere leer la ayuda doc workspace.
Tambin es posible conocer directamente la clase de una variable X mediante el
comando class(X). Por ejemplo
class(pi^3) %el argumento puede ser el resultado de un clculo
ans =
double
class(c) % o bien: class(single(a))
ans =
single
2.5.2 Acerca de la precisin de los clculos
Hemos dicho que en la notacin cientfica un nmero se expresa como
b
a 10 * t
. Una
representacin de un nmero
x
en la forma
n
r x 10 * t
, donde
r
es un nmero real
tal que 1
10
1
< r y
n
es un entero, se dice que es la notacin cientfica normalizada
para el nmero 0 x .
Ahora bien, los computadores utilizan normalmente en sus clculos el sistema binario
en lugar del decimal, y entonces la notacin cientfica adopta la forma
m
q x 2 * t . El
nmero
q
se denomina mantisa y el entero
m
exponente. En un ordenador binario
tanto
q
como
m
estarn representados como nmeros en base 2. Puesto que la mantisa
q
est normalizada, en la representacin binaria empleada se cumplir que 1
2
1
< q .
Los computadores construidos en un sistema binario, emplean esta notacin cientfica
normalizada para realizar sus clculos, y en el proceso deben realizar ciertas
aproximaciones, de modo que los nmeros ocupen un tamao determinado. La manera
como se ataca el problema de las aproximaciones, define si un nmero es flotante o si es
de punto fijo, y tambin radica all la veradera distincin entre los nmeros de precisin
doble y sencilla. Una discusin ms profunda sobre estos temas queda fuera del
alacance de esta gua, pero puede consultarse en
http://www.uv.es/~diaz/mn/node11.html.
2.5.3 Cadenas de caracteres
Por caracter entendemos cada uno de los smbolos que pueden escribirse utilizando un
teclado, y an algunos ms. Las letras, los nmeros, los signos de puntuacin, e incluso
un espacio son algunos ejemplos de caracteres. Una cadena de caracteres (en ingls
string) no es ms que un conjunto ordenado de caracteres, tal como una palabra o una
frase.
Los computadores disponen generalmente de un cdigo especial para introducir la
mayora de los caracteres, llamado cdigo ASCII. En este cdigo, a cada caracter le
corresponde un nmero especial, y pueden escribirse stos en varios procesadores de
texto como
Alt + CODIGO
Es decir, para escribir el caracter con el cdigo 64, se escribe este nmero en el teclado
numrico manteniendo presionada la tecla Alt. Cabe resaltar que las maysculas y
minsculas poseen diferentes cdigos, al igual que las vocales con y sin tilde.
Para Matlab, una cadena de caracteres no es ms que un vector cuyos elementos son
caracteres. Para dar a entender que se estn escribiendo caracteres, stos se encierran
entre aprstrofes. Por ejemplo
a='Esta es una cadena de caracteres.'
a =
Esta es una cadena de caracteres.
['Obsrvese que los corchetes angulares son opcionales']
ans =
Obsrvese que los corchetes angulares son opcionales
c='Puede leerlo?'
c =
Puede leerlo?
Observemos el operador ' no est transponiendo una matriz, sino abriendo y cerrando el
espacio dentro del cual va la cadena de caracteres.
Para probar que en cada caso se trata de un vector para el cual cada caracter corresponde
a un elemento, hallamos su transpuesta escribiendo
c' %El espacio es tambin un caracter
ans =
P
u
e
d
e
l
e
e
r
l
o
?
Este tipo de variables son llamadas char por Matlab, as que
class(c)
ans =
char
Adems, el resultado (o argumento de salida) de la funcin class en s mismo una
cadena de caracteres, de modo que
class(class(8))
ans =
char
Entendidas como vectores, la manipulacin variables tipo char es sencilla, y bastante
similar a la ya vista.
s=c([1 2 4 end-1 end-3 end])
s =
Peor?
length(c) %el resultado es un nmero "double"
ans =
14
Si se desea almacenar caracteres en una matriz, debe tenerse presente que cada caracter
es un elemento, as que cada fila o columna debe tener igual cantidad de caracteres. Por
esta misma razn, separar los elementos por espacios es intil. Por ejemplo
A=['mire' 'el'; 'problema']
??? All rows in the bracketed expression must have the same
number of columns.
Este error se produce porque la primera fila 'mireel' no tiene tantos elementos como
la segunda 'problema'. En efecto
length(['mire' 'el'])
ans =
6
length(['problema'])
ans =
8
Para evitarlo podemos simplemente colocar espacios para completar los elementos
necesarios. Estos espacios son tambin caracteres y deben ir entre ' .
A=['mire ' 'el '; 'problema']
A =
mire el
problema
Y puesto que A es una matriz, se cumple
25
size(A) %A tiene un tamao definido
ans =
2 8
A(1,2)='%' %Pueden modificarse sus elementos
A =
m%re el
problema
Esto significa que el resultado del ejemplo 2-15 es aplicable a vectores que contienen
cadenas de caracteres. Por ejemplo
clear all; a='Primer Vector'; b='vector 2';
s=min(length(a),length(b))
s =
8
X=[a(1:s); b(1:s)]
X =
Primer V
vector 2
c=X(:)'
c =
Pvreicmteorr V2
Despus de este procedimiento, el comando whos reporta las variables
whos
Name Size Bytes Class
X 2x8 32 char array
a 1x13 26 char array
b 1x8 16 char array
c 1x16 32 char array
s 1x1 8 double array
Grand total is 54 elements using 114 bytes
Cuando una cadena de caracteres se suma a un nmero, Matlab reemplaza cada caracter
por su correspondiente cdigo ASCII. Por ejemplo
b+0
ans =
118 101 99 116 111 114 32 50
Esto significa que v puede escribirse como Alt+118, 2 como Alt+50, y as
sucesivamente. Algunas veces esto puede servir para deducir el cdigo ASCII de un
carcter desconocido, como lo ilustra el ejemplo 2-16.
La concatenacin es vlida cuando las variables implicadas son todas de la misma clase,
pero cuando se intentan combinar en una matriz variables char y variables numricas,
los nmeros en estas ltimas se interpretan como el cdigo ASCII cuando esto es
posible. De lo contrario se produce un error. Por ejemplo, si tenemos
25
Tambin es posible borrar algunos caracteres igualndolos a la matriz vaca. Adems, puede invertirse
una frase almacenada en w, escribiendo w(end:-1:1)
a='magic(3)' %no estamos creando una matriz mgica
a =
magic(3)
Intentamos colocar el nmero 120 en la segunda posicin de esta cadena de caracteres,
escribiendo
a(2)=120
a =
mxgic(3)
Donde la a se cambi por una x puesto que 120 es el cdigo ASCII de este caracter
Para ver el caracter que se obtiene a partir de un nmero puede utilizarse la funcin
char, cuyas ayudas debe consultar el lector. Si lo que se desea es convertir un una
variable numrica en una cadena de caracteres, se emplea para ello la funcin num2str.
Por ejemplo
num2str([4 3; pi 2])
ans =
4 3
3.1416 2
class(ans)
ans =
char
Tambin se deja al lector la consulta de las ayudas respectivas.
Ejemplo 2-16
En programacin es frecuente utilizar los operadores lgicos y y , que en Matlab
se escriben respectivamente & y |. Encontrar el cdigo ASCII de estos operadores.
Solucin
Puesto que en alguna ayuda han de encontrarse estos operadores, podremos copiarlos de
all y almacenarlos en una variable tipo char, a la cual le sumaremos el nmero cero
para ver su cdigo ASCII.
Ya que en ingls estos operadores lgicos se llaman respectivamente and y or,
podra usarse el comando lookfor para encontrar las ayudas respectivas en Matlab. Sin
embargo, son tantos los resultados para estos casos, que es preferible explorar los temas
de ayuda. Entre estos temas, el que nos interesa ahora es help ops (que contiene
ayuda sobre los operadores de Matlab), y en l encontramos los operadores lgicos
and y or.
Ahora pedimos ayuda sobre cada uno
help and
& Logical AND.
A & B is a matrix whose elements are 1's where both A and B
have non-zero elements, and 0's where either has a zero element.
A and B must have the same dimensions unless one is a scalar.
C = AND(A,B) is called for the syntax 'A & B' when A or B is an
object.
help or
| Logical OR.
A | B is a matrix whose elements are 1's where either A or B
has a non-zero element, and 0's where both have zero elements.
A and B must have the same dimensions unless one is a scalar.
C = OR(A,B) is called for the syntax 'A | B' when A or B is an
object.
See also XOR.
Seleccionamos los operadores necesarios con el puntero, y copiamos cada uno con
EditCopy, o bien presionando Ctrl+c.
Los pegamos con EditPaste, o bien con Ctrl+v para formar la lnea
t=['&' '|']
t =
&|
Sumando cero a este vector, encontraremos sus cdigos ASCII
t+0
ans =
38 124
As, hemos encontrado los operadores lgicos para y y , que son respectivamente
& y |; y pueden escribirse en el teclado presionando Alt+38 y Alt+124. La
operacin inversa, la obtencin de un caracter dado su cdigo ASCII, es realizada por
una funcin llamada char, as que
char(ans)
ans =
&|
Esto concluye el ejemplo.
Ejemplo 2-17
Codificacin de mensajes.
La guerra ha comenzado y a usted se le asigna la misin de encriptar mensajes usando
Matlab para evitar que su enemigo los entienda, al menos por un tiempo. Qu hara?.
Solucin
Observemos que a cada caracter en un mensaje le corresponde un cdigo ASCII. Si
logramos modificar este cdigo de una manera que slo nosotros conozcamos,
habremos encriptado satisfactoriamente el mensaje.
Para hacerlo comenzamos almacenando el mensaje como vector fila en una variable
char, que llamaremos M. Cuando realizamos una operacin entre esta variable y un
nmero, Matlab toma el cdigo ASCII correspondiente a cada caracter en ella, as que
podemos modificar estos cdigos simplemente realizando alguna operacin con M.
Deseamos que los nmeros que resulten de esta operacin sean los cdigos de otros
caracteres.
As, si nuestro mensaje es
M='La invasin se aproxima';
Procedemos a multiplicarlo por 2 y a sumarle 1, para obtener
2*M+1
ans =
Columns 1 through 12
153 195 65 211 221 237 195 231 211 487 221 65
Columns 13 through 23
231 203 65 195 225 229 223 241 211 219 195
Nos valemos del comando char para convertir estos nuevos cdigos ASCII en sus
caracteres correspondientes. El mensaje as encriptado lo almacenamos en la variable
Cripta
Cripta=char(2*M+1)
Cripta =
AAA
Este es el mensaje que interceptara el enemigo. El receptor puede restituir el mensaje
original aplicando la operacin inversa a los nuevos cdigos.
Para restituirlo, hemos de restarle 1 y dividir entre 2 el resultado
R=char((Cripta-1)/2)
R =
La invasin se aproxima
Esto concluye el ejemplo.
Como se ver ms adelante, algunas veces es conveniente guardar instrucciones para
Matlab en una variable tipo char. Para ello debe tenerse presente que lo que en ella se
almacene, debe poder ser ledo por Matlab sin que se produzcan errores. Por ejemplo,
escribimos
a0='1+3' %no se evala la suma
a0 =
1+3
a='clear all' %no se ejecuta la instruccin, slo son caracteres
a =
clear all
b='[1:3:10]'% los corchetes aqu son tambin caracteres
b =
[1:3:10]
c='m=3/4' %Contiene la instruccin de crear m
c =
m=3/4
d='pi-*3' %Aqu se ha copiado un error
d =
a-*3
El comando eval permite evaluar estas expresiones, es decir, ejecuta las instrucciones
que se indican en la cadena de caracteres.
Entonces podemos escribir
eval(a0)
ans =
4
k=eval(b)
k =
1 4 7 10
eval(c)
m =
0.75
eval(d) %se produce el error esperado
??? pi-*
|
Missing variable or function.
eval(a) %Borra todas las variables, incluso a
Este comando tambin puede usarse con variables que ya existen, por ejemplo
t=0:10; eval('t.^2')
ans =
0 1 4 9 16 25 36 49 64 81 100
Si t no existiera, se producira el error que ya conocemos.
El comando eval puede tambin usarse para evaluar simultneamente varias expresiones
contenidas en una misma cadena de caracteres, como en
eval(['x=3; y=4, z=x-1'])%El primer resultado no se muestra por el ;
y =
4
z =
2
Puesto que ' abre y cierra las cadenas de caracteres, nos preguntamos por la forma de
indicar la transposicin de una matriz. La manera de hacerlo consiste simplemente en
colocar dos apstrofes consecutivas (''), que Matlab leer como una, sin cerrar la
cadena de caracteres. As
eval('[1 i-1 0]''+3')
ans =
4
7
3
Ntese que las expresiones eval('t') y eval(t) son conceptualmente diferentes.
Si tenemos t='sin(pi)', entonces la primera equivale a escribir t y presionar Enter
en la ventana de trabajo, mientras en el segundo caso Matlab ejecuta la cadena de
caracteres que contiene la variable t. As, encontramos
eval('t')
t =
sin(pi)
eval(t)
ans =
1.2246e-016
Finalmente, observamos que eval es una funcin que puede tener dos argumentos de
entrada, los cuales se separan por comas. As, eval(x,y) evala la expresin en x,
y si sta produce un error, entonces evala la expresin en y. Por ejemplo, si tenemos
a=magic(2);
Entonces a slo tiene cuatro elementos, de modo que se produce un error si intentamos
eval('a(5)')
??? Index exceeds matrix dimensions.
Pero si escribimos
eval('a(5)','a(4)')
ans =
2
Matlab detecta este error e intenta ejecutar la segunda expresin. Se recomienda ahora
revisar la ayuda doc eval.
2.5.4 Objetos inline
Una manera breve de crear ciertas funciones sencillas en las que para un valor dado se
evala una breve expresin, es almacenar estas expresiones como objetos inline. Dichos
objetos representan un tipo muy especial de funciones que pueden escribirse en la
ventana de trabajo, sin necesidad de almacenarlas en un archivo. Se trata de una clase
particular de variables cuya manipulacin, aunque sencilla, no est del todo basada en la
notacin matricial, siendo ms bien anloga a la notacin para funciones que se usa en
Clculo.
Para crear uno de estos objetos, se emplea el comando inline, que se escribe como
G=inline(expresin). Dicha expresin debe ser una cadena de caracteres
(string), esto es, una variable tipo char. Esto significa que toda variable t para la que se
copie inline(t) debe pertenecer a la clase char. El argumento de salida de este
comando, es una variable del tipo inline. Algunos ejemplos son
F=inline('8*x-3/x') %Crea una funcin de x, vlida para escalares
F =
Inline function:
F(x) = 8*x-3/x
G=inline('sin(y.^2)') %Crea una funcin de y, vlida para vectores
G =
Inline function:
G(y) = sin(y.^2)
H=inline('pi') %Una funcin constante, x es la variable por defecto
H =
Inline function:
H(x) = pi
inline('t-3') %Convierte temporalmente ans en un objeto inline
ans =
Inline function:
ans(t) = t-3
Entero=inline('round(H)') %Aqu H es diferente de la variable del WS
Entero =
Inline function:
Entero(H) = round(H)
whos
Name Size Bytes Class
Entero 1x1 832 inline object
F 1x1 830 inline object
G 1x1 834 inline object
H 1x1 820 inline object
ans 1x1 822 inline object
Grand total is 194 elements using 4138 bytes
El parecido con la notacin de funciones en clculo se extiende tambin a su uso.
F(1) %reemplaza x por 1 y evala
ans =
5
H(inf) %H es constante, no importa lo que se reemplace
ans =
3.1416
G(magic(2)) %Reemplaza en G una matriz
ans =
0.84147 0.41212
-0.2879 -0.7568
Ntese que aqu F(1) no indica el primer elemento de F, lo que muestra que la notacin
matricial no es directamente aplicable a un objeto inline.
La razn de que G sea til para vectores o matrices, y no as F, radica en que la
expresin inline del primero contiene el operador .^, que es la exponenciacin
elemento a elemento; en tanto que F emplea la divisin /, que en este contexto es slo
aplicable a escalares. Esto muestra que la manera de proceder cuando se evala una
expresin almacenada como objeto inline, es reemplazar en ella sus variables por los
valores indicados. As, cuando se escribe F(a), se sustituye en x en la en la expresin
por el valor que indica a, y luego es como si se copiara esta expresin en una lnea y se
presionara Enter. Por lo tanto, las expresiones que se almacenen de esta manera pueden
involucrar cualquier comando de Matlab que se pueda invocar desde la ventana de
trabajo.
Uno de los rasgos distintivos de un objeto inline es que las variables que maneja son
internas, y por lo tanto diferentes de aquellas que se encuentran en el WS. As, la
variable clase inline que hemos llamado Entero, contiene una expresin escrita en
trminos de cierta variable interna llamada H, pero con este mismo nombre estamos
almacenando en la memoria WS otro objeto inline independiente. Dado que las variables
de una funcin inline no emplean la memoria virtual WS, no se produce confusin y es
posible manipular Entero sin que se superpongan ambas variables, la interna y la
externa. Dicho de otro modo, H es la manera como hemos llamado al argumento de
entrada de una funcin inline almacenada el nombre Entero, y decimos que es su
variable interna; pero otro H es tambin el nombre de una variable del WS (que en este
caso en particular contiene otro objeto inline), sin que ambas se superpongan en modo
alguno. Esta es la principal diferencia entre evaluar una expresin char con la funcin
eval, y hacerlo crendola como una variable inline, pues, como ya vimos, en el primer
caso se utilizan las mismas variables almacenadas en WS, mientras en el segundo se
toman estos nombres como variables internas e indepentidentes. Por ejemplo, si se tiene
x=3; s='x^3-2';
Entonces eval(s) reemplaza x por 3 y ejecuta, obteniendo
eval(s)
ans =
25
Lo que significa que utiliza para la x en s el valor de la variable x que se encuentra
en la memoria WS. En cambio, si se tiene
x=3; s=inline('x^3-2');
Entonces la x que aparece en s es una variable interna, completamente independiente
de la x en la memoria WS, pudindose escribir
s(0), s(inf), s(x)
ans =
-2
ans =
Inf
ans =
25
La composicin de funciones creadas como objetos inline no representa mayores
problemas si lo que se desea es evaluar ciertos puntos de la funcin compuesta
( ) ( ) x g f g f . Por ejemplo
G(F(1)) %equivale a G(5)
ans =
-0.13235
Entero(H(5)) %equivale a Entero(pi)
ans =
3
En sntesis, el comando inline crea una funcin que maneja variables internas, a las que
llamamos argumentos de entrada. Evaluar un objeto inline para un argumento de
entrada corresponde a sustituir este argumento en la variable interna de ese objeto.
Puede pensare en ello como tener una expresin tipo char que se va a evaluar con eval,
y en la que un caracter en especial (la variable interna), se reemplaza cada vez por un
valor distinto (el argumento de entrada), sin que se creen nunca variables adicionales en
WS.
Hemos dicho variables internas, porque un objeto inline puede manejar
simultneamente varios argumentos de entrada. Por ejemplo
s=inline('max(x,y)-x^2+y^2')
s =
Inline function:
s(x,y) = max(x,y)-x^2+y^2
s(5,3)
ans =
-11
El teorema de Pitgoras para el espacio tridimensional queda
Pitagoras=inline('sqrt(a^2+b^2+c^2)')
Pitagoras =
Inline function:
Pitagoras(a,b,c) = sqrt(a^2+b^2+c^2)
Pitagoras(3,4,5)
ans =
7.0711
M=inline('a1-a2')
M =
Inline function:
M(a1,a2) = a1-a2
Aqu es evidente que importa el orden en que se escriban los argumentos de entrada del
objeto inline, siendo diferentes M(5,3) y M(3,5). En los casos anteriores no
especificamos el orden en que deban escribirse las variables, por lo que se dispusieron
en orden alfabtico. Para definir otro orden se coloca un segundo argumento de entrada
durante la creacin del objeto inline, as:
Pitagoras2=inline('sqrt(a^2+b^2+c^2)','c','b','a')
Pitagoras2 =
Inline function:
Pitagoras2(c,b,a) = sqrt(a^2+b^2+c^2)
Observemos que es posible (aunque no muy til) crear un objeto inline anidado, tal
como
h=inline('inline(t)')
h =
Inline function:
h(t) = inline(t)
Entonces, cuando t es una cadena de caracteres que indica una instruccin, h(t)
definir un objeto inline que la evale.
t='sin(1./x)';
f=h(t)
f =
Inline function:
f(x) = sin(1./x)
f(0) %lmite divergente
Warning: Divide by zero.
> In C:\MATLABR11\toolbox\matlab\funfun\@inline\subsref.m at line 25
ans =
NaN
En este ltimo aviso nos dice adems que los objetos inline son creados por archivos
que estn en la carpeta funfun (funciones de funciones), la cual tiene su propio tema de
ayuda (help funfun) que puede revisar el lector.
Adicionalmente, observemos que los argumentos con que se llama inline no son
necesariamente nmeros. Por ejemplo, la funcin idntica (
x y
) puede crearse como
Idem=inline('e')
Idem =
Inline function:
Idem(e) = e
Idem(5)
ans =
5
Pero entonces tambin se aplica a caracteres
Idem('caracter')
ans =
caracter
class(ans)
ans =
char
Notemos taben que se generan errores cuando se especifican inadecuadamente las
variables de un objeto inline
ss=inline('x^2','a','b','c')
ss =
Inline function:
ss(a,b,c) = x^2
ss(2,3,4) %Nunca se reemplaza x
??? Error using ==> inline/subsref
Error in inline expression ==> x^2
??? Undefined function or variable 'x'.
Ahora nos preguntamos por lo que sucede cuando se suma un nmero a un objeto inline
s+1
??? Error using ==> +
Function '+' not defined for variables of class 'inline'.
Como vemos, la suma no est definida para estas variables. Lo mismo sucede con las
dems operaciones matemticas elementales.
La conversin de una cadena de caracteres almacenada en una variable a uno de estos
objetos se realiza sin complicaciones, siendo incluso vlido almacenar el nuevo objeto
inline en una variable con el mismo nombre que originalmente contena la cadena de
caracteres. Esto se entiende fcilmente si recordamos la analoga planteada entre una
variable y una caja.
campana_gauss='exp(-x.*x)' %Cadena de caracteres
campana_gauss =
exp(-x.*x)
class(campana_gauss) %Comprobamos la clase de variable que es
ans =
char
campana_gauss=inline(campana_gauss) %Redefinimos la variable
campana_gauss =
Inline function:
campana_gauss(x) = exp(-x.*x)
class(campana_gauss) %Ahora es un objeto inline
ans =
inline
El proceso contrario, la obtencin de una cadena de caracteres a partir de un objeto
inline, se realiza aplicando a este ltimo el comando char.
s=inline('i*x') %la unidad imaginaria no se reconoce como variable
s =
Inline function:
s(x) = i*x
w=char(s) %Se convierte la funcin en una cadena de caracteres
w =
i*x
class(w)
ans =
char
En algunas ocasiones se requiere saber cules son las variables internas de un objeto
inline, o de una expresin guardada como una cadena de caracteres. Una forma de
hacerlo es a travs del comando symvar
cuadratica=inline('a*x^2+b*x+c','x','a','b','c');
variables=symvar(cuadratica)
variables =
'x'
'a'
'b'
'c'
symvar('j*sin(x-a)') %No reconoce la unidad imaginaria
ans =
'a'
'x'
class(variables) %Otra clase de variable
ans =
cell
Como vemos, el argumento de salida de symvar pertenece a otra clase de variable,
llamada cell (Seccin 2.5.6). Tambin notamos que las variables se retornan en el orden
requerido cuando symvar se aplica a un objeto inline, y en orden alfabtico cuando se
trata de objetos char.
Ejemplo 2-18
Dadas dos funciones inline almacenadas como f y g, mostrar una manrea de crear la
funcin suma h=f+g como objeto inline con los argumentos de entrada dispuestos
alfabticamente.
Verificar para las funciones
) cos( * ) 1 ( ) , ( a x rand a x f +
xyz y x x y z g 3 3 ) , , ( + +
.
Solucin
Intentaremos resolver el problema para las funciones dadas
) , ( a x f
y
) , , ( x y z g
de una
manera general, tal que el mismo mtodo resulte aplicable a cualquier par de funciones.
Comenzamos por crear las funciones que vamos a sumar. Obsrvese que en este caso en
particular, es necesario definir el orden de los argumentos de entrada, as que escribimos
f=inline('rand(1)+x*cos(a)','x','a');
g=inline('3-x+y+3*x*y*z','z','y','x');
La funcin que queremos obtener es
xyz y x a x rand z y x a h 3 3 ) cos( * ) 1 ( ) , , , ( + + + +
El problema se origina porque no podemos simplemente escribir h=f+g, ya que la
suma no est definida para esta clase de variables, y escribirlo da lugar al error
f+g
??? Error using ==> +
Function '+' not defined for variables of class 'inline'.
En cambio, observemos podramos crear directamente la funcin h escribiendo
h=inline('rand(1)+x*cos(a)+3-x+y+3*x*y*z')
Pero debido a que la expresin escrita representa una variable tipo char, es tambin
posible formarla por concatenacin de varias cadenas de caracteres. As, podemos crear
h en varios pasos escribiendo
a='rand(1)+x*cos(a)';
b='3-x+y+3*x*y*z';
t=[a '+' b] %Se "suman" las ecuaciones
t =
rand(1)+x*cos(a)+3-x+y+3*x*y*z
h=inline(t)
h =
Inline function:
h(a,x,y,z) = rand(1)+x*cos(a)+3-x+y+3*x*y*z
Pero a es la cadena de caracteres correspondiente a f, por lo que puede obtenerse
escriendo
a=char(f)
a =
rand(1)+x*cos(a)
Anlogamente,
b=char(g)
b =
3-x+y+3*x*y*z
Con lo que queda resuelto el ejercicio. Sin embargo, podemos realizar el mismo
procedimiento en menos pasos escribiendo
t=[char(f) '+' char(g)];
h=inline(t);
Y an en una sola lnea, si se escribe
h=inline([char(f) '+' char(g)])
h =
Inline function:
h(a,x,y,z) = rand(1)+x*cos(a)+3-x+y+3*x*y*z
Que es una solucin ms elegante y compacta para el problema planteado.
Ejemplo 2-19
Generacin de los puntos de una curva en dos dimensiones utilizando una funcin
inline.
Solucin
Ms adelante veremos que la grfica de una curva bidimensional en Matlab se realiza
uniendo por segmentos de recta los puntos consecutivos cuyas coordenadas ( ) y x, se
encuentran en dos vectores, X e Y (el nombre de estos vectores es indistinto). Cuando
existe una funcin explcita y=f(x) que genera los puntos de la curva, entonces Y puede
escribirse como una funcin inline, que se evala para cada vector X dado.
En este ejemplo, denotemos por
x
al mayor entero que es menor que el nmero real
x
. Intentaremos construir la grfica de la funcin
( ) x sen x x y +
2
, para 5 5 x .
Primero debemos almacenar en un vector X todos los puntos de este intervalo que
deseamos considerar; cuantos ms puntos se tomen, tanto mejor es la grfica de la
curva. Para ello podramos escribir X=[-5:0.01:5], pero en esta ocasin haremos
algo diferente. La instruccin X=linspace(a,b,n) crear un vector fila X que
contiene n elementos igualmente espaciados en el intervalo [a b], siempre que sea a<b.
Tomando 100 puntos de nuestro intervalo, escribimos
X=linspace(-5,5,100);
Ahora almacenaremos en y una funcin inline que nos de el punto ( ) t y para cada
t
en
X. El comando de Matlab que calcula
x
es floor(x). Por ejemplo
floor([pi -1.1 5.9 1.1 1/2 -4/9])
ans =
3 -2 5 1 0 -1
As que este comando formar parte de la expresin de nuestra funcin inline, de modo
que creamos
y=inline('floor(t.^2)+sin(t)')%Ntese que se coloca .^ y no ^
y =
Inline function:
y(t) = floor(t.^2)+sin(t)
Puesto que y se puede usar con vectores, calculamos las coordenadas
y
de los 100
puntos como
Y=y(X);
La grfica se crea simplemente con plot(X,Y)
Ejemplo 2-20
Crear como objeto inline la funcin
( ) ( )
5
0
1
m
m x x y
Solucin
Recordemos que la letra griega pi se utiliza como abreviacin de una serie de
multiplcaciones (productoria), anloga a la sumatoria. As, tememos
q q
q
p j
p p j
a a a a a
1 1
...
+
. En particular,
N
k
k N k
1
! * ... * 3 * 2 * 1
(Siempre que sea
0 > N )
En la seccin 2.4.4 se vi que una manera de escribir una sumatoria en Matlab consiste
en crear primero un vector con todos los elementos a ser sumados, y luego aplicarle a
ste el comando sum. Si en este procedimiento utilizamos prod en lugar de sum,
entonces se obtiene la productoria de los elementos del vector. Por lo tanto, puede
escribirse ! n como prod(1:n), siempre que sea 0 > n .
Para expresar de este modo la multiplicatoria pedida, observemos primero que el ndice
m
toma los valores 0, 1, 2, 3, 4 y 5; que se abrevian en un vector como [0:5]. A cada
elemento en este vector hemos de restarle 1 y el resultado se resta de
x
, quedando el
vector x-([0:5]-1). ste es el vector que contiene los valores de los elementos de
la productoria, de suerte que slo resta aplicarle el comando prod. As, hemos
encontrado que
( )
5
0
1
m
m x
prod(x-([0:5]-1))
Ahora que sabemos cmo se escribe la productoria, procedemos a crear la funcin que
la contiene, valendonos del comando inline. Si y es la variable que ha de contener esta
funcin, entonces la creamos escribiendo
y=inline('prod(x-([0:5]-1))')
y =
Inline function:
y(x) = prod(x-([0:5]-1))
Observemos que, por la forma como se ha definido la funcin, x est limitado a valores
escalares, o eventualmente a un vector fila de 6 elementos (que tiene el mismo tamao
que 0:5). En efecto, se llega a un error cuando se intenta
y([1 2])
??? Error using ==> inline/subsref
Error in inline expression ==> prod(x-([0:5]-1))
??? Error using ==> -
Matrix dimensions must agree.
Podemos ver algunos de sus valores en una especie de tabla almacenndolos en una
matriz formada por concatenacin, escribiendo
VALORES=[-5:5; y(-5) y(-4) y(-3) y(-2) y(-1) ...
y(0) y(1) y(2) y(3) y(4) y(5)]'
VALORES =
-5 60480
-4 20160
-3 5040
-2 720
-1 0
0 0
1 0
2 0
3 0
4 0
5 720
Ntese que aqu x no est limitado a valores enteros, ni an reales. Por ejemplo
y(pi*i)
ans =
1730.44779670308 - 2213.68478917688i
En el captulo tercero veremos una forma de hacer que Matlab evale esta funcin para
un gran nmero de valores.
2.5.5 Variables simblicas
Las variables simblicas descritas en esta seccin representan la clase de variable ms
cercana a aquellas que se tratan normalmente en el Clculo. La creacin y manipulacin
de estos smbolos es posible gracias a un paquete de herramientas incluidas en Matlab,
llamado Symbolic Math Toolbox. En este paquete se incluyen comandos que permiten
realizar analticamente operaciones como la integracin y derivacin; solucionar
sistemas de ecuaciones (incluidas ecuaciones diferenciales); factorizar, simplificar, o
desarrollar expresiones algebraicas; evaluar funciones especiales; y obtener
transformadas de Laplace y Fourier, entre otros. El lector puede consultar una lista de
estas aplicaciones en la ayuda help toolbox\symbolic.
Aunque el paquete de matemtica simblica permite realizar fcilmente una gran
diversidad de clculos, el precio a pagar por ello es un mayor consumo de tiempo en
cada operacin que involucre variables simblicas. Comoquiera que la utilidad de
recurrir a un computador para que efecte clculos por nosotros radica ante todo en la
posibilidad de reducir considerablemente el tiempo que toma realizarlos, debe procurar
evitarse el uso de tales variables en los programas destinados a procesar grandes
cantidades de datos.
Para crear una variable simblica nos valemos del comando sym, mediante el cual un
smbolo o variable matemtica se almacena en una variable (en el sentido utilizado en
programacin). Cuando el argumento de entrada de sym es del tipo char, el resultado es
un nmero o variable simblica. Si el argumento es un nmero o matriz escalar, el
resultado es una representacin simblica de los valores numricos dados.
As, la instruccin
a=sym('x') %Ntese que el argumento de "sym" es del tipo char
a =
x
Almacena a el smbolo matemtico x en la variable a. Adems
class(a) % "a" es una variable simblica
ans =
sym
x % "x" no existe
??? Undefined function or variable 'x'.
h=sym([1 3 5; pi -1 0])
h =
[ 1, 3, 5]
[ pi, -1, 0]
h.^2
ans =
[ 1, 9, 25]
[ pi^2, 1, 0]
Podemos considerar tambin que la variable a contiene una funcin derivable (la
funcin idntica), a partir de la cual pueden formarse muchas otras funciones. Por
ejemplo
y=a^2
y =
x^2
z=a^2/(1-a)
z =
x^2/(1-x)
Estas son tambin variables que contienen funciones, y puesto que la mayora de las
funciones matemticas elementales estn tambin incluidas en el paquete de matemtica
simblica, podemos tambin escribir
w=sin(a)-exp(1/a)
w =
sin(x)-exp(1/x)
M=abs(y)-atan(z)
M =
abs(x)^2-atan(x^2/(1-x))
El comando pretty permite visualizar estas expresiones (que se encuentran en lenguaje
de programacin) en su equivalente notacin matemtica. Se invita al lector a probar las
siguientes instrucciones: pretty(M), pretty(w), pretty(h).
Para evitar confusiones, normalmente deseamos que el smbolo creado se almacene en
una variable homnima. Para nuestros siguientes ejemplos nos serviremos de s y t,
que podemos crear as:
clear all; s= sym('s'); t= sym('t');
Pero por llamarse igual en cada caso el smbolo y la variable que contiene, el comando
syms permite crearlas de manera abreviada. Para ello se separan sus nombres mediante
espacios, as
syms s t
whos % Ntese que las variables sym ocupan ms memoria que las dems
Name Size Bytes Class
s 1x1 126 sym object
t 1x1 126 sym object
Grand total is 4 elements using 252 bytes
Ahora creemos las funciones
A=t-(sin(t)^2+cos(t)^2)
A =
t-sin(t)^2-cos(t)^2
B=exp(t)*exp(2*t+1)
B =
exp(t)*exp(2*t+1)
C=(s+t)*sin(abs(s-t))
C =
(s+t)*sin(abs(-s+t))
D=s^3-s^2-s+1
D =
s^3-s^2-s+1
Haremos algunos clculos con ellas. Comencemos por utilizar simple para simplificar
cada una de ellas
26
:
A=simple(A)
A =
t-1
B=simple(B)
B =
exp(3*t+1)
C=simple(C)
C =
(s+t)*sin(abs(-s+t))
D=simple(D)
D =
s^3-s^2-s+1
Si deseamos saber los smbolos que contiene la variable C, escribimos
27
findsym(C) % Devuelve los smbolos en C
ans =
s, t
class(ans) % El resultado es una cadena de caracteres
ans =
char
Utilizamos subs para sustituir realizar sustituciones en una variable simblica, por
ejemplo
subs(A,t,0) % Reemplaza "t" por "0"
ans =
-1
subs(A,s,0) % "A" no contiene "s", no sucede nada
ans =
t-1
subs(A,5.1) % Reemplaza el smbolo en "A" por "5.1"
ans =
4.1
class(ans)
ans =
double
Tambin es vlido reemplazar un smbolo por la expresin simblica almacenada en
otra variable, de suerte que la composicin de dos funciones G F - o bien ( ) ( ) t G F - se
escribe subs(F,t,G), donde F, G y t son variables de Matlab, y t es contiene el
smbolo en F que se va a sustituir por el contenido de G. Por ejemplo:
26
La simplificacin de estas expresiones se basa en una especie de proceso de ensayo y error en el que se
prueban varias simplificaciones y al final se elige la mejor. Para ver la lista de estos ensayos, no almacene
el resultado en una variable.
27
Este comando devuelve el smbolo como tal, y no la variable que lo contiene, as que para
a=sym('t'), findsym(a) devuelve t. Adems ntese que la respuesta, para el caso de mltiples
variables, se ordena alfabticamente.
subs(A,t,5*t^2)
ans =
5*t^2-1
subs(B,t,A)
ans =
exp(3*t-2)
subs(C,s,1/s-t)
ans =
1/s*sin(abs(-1/s+2*t))
Para hacer sustituir varias variables simultneamente, tanto sus nombres como sus
contenidos se encierran entre llaves o entre corchetes y se separan por comas o por
espacios. Por ejemplo
subs(C,[s t],[1 -2]) %sustituye s por 1 y t por -2
ans =
-0.141120008059867
subs(C,[s, t],{1 -2})
ans =
-0.141120008059867
subs(C,{s t},{1, -2})
ans =
-0.141120008059867
subs(C,{s, t},[1, -2])
ans =
-0.141120008059867
La misma notacin sirve para reemplazar unos smbolos por otros.
Para derivar una funcin de este tipo, empleamos el comando diff, con el cual puede
calcularse la derivada n-sima de una funcin F con respecto a una variable t,
escribendo diff(F,t,n). Cuando n no se especifica, se asume igual a 1; si la
variable no se especifica, se toma aquella que se encuentra de primera segn findsym.
Por ejemplo
diff(D,s) %O tambin: diff(D)
ans =
3*s^2-2*s-1
diff(D,3) %Tercera derivada de "D"
ans =
6
diff(C,t) %Primera derivada con respecto a "t"
ans =
sin(abs(-s+t))+(s+t)*cos(abs(-s+t))*abs(1,-s+t)
La integracin se logra con el comando int, donde la integral
b
a
dv S
, se escribe
int(S,v,a,b). Si a y b no se especifican se obtiene una funcin primitiva de S; si
v no se especifica, sucede igual que con diff. Cuando la integral no puede evaluarse
directamente, se deja indicada o se expresa en trminos de funciones especiales. Por
ejemplo
int(A,s)
ans =
(t-1)*s
int(A,t)
ans =
1/2*t^2-t
int(cos(t),0,pi)
int(cos(t),0,s)
ans =
sin(s)
M=int(exp(-t^2)) % erf es la funcin error
M =
1/2*pi^(1/2)*erf(t)
subs(M,6)
ans =
0.886226925452758
Observemos tambin que las matrices pueden contener smbolos como elementos, por
ejemplo
S=[A B; C D]
S =
[ t-1, exp(3*t+1)]
[ (s+t)*sin(abs(-s+t)), s^3-s^2-s+1]
d=simple(det(S))
d =
(s^3-s^2-s+1-exp(3*t+1)*sin(abs(-s+t)))*t-s^3+s^2+s-1-
exp(3*t+1)*sin(abs(-s+t))*s
El manejo de estas matrices simblicas es completamente anlogo al de las ya
estudiadas, pero debe tenerse cierto cuidado con los smbolos creados de esta manera ya
que son por defecto nmero complejos. As, si escribimos
S'
ans =
[ -1+conj(t), sin(abs(-s+t))*conj(s+t)]
[ exp(1+3*conj(t)), 1+conj(s^3-s^2-s)]
Obtenemos no slo la transpuesta de la matriz, sino sus elementos conjugados, como lo
indica la funcin conj. Para crear un objeto simblico que represente un nmero real, se
coloca esto como argumento adicional de las funciones sym syms, as
syms n m real; f=sym('f','real');
La solucin de ecuaciones o sistemas de ecuaciones se logra fcilmente con el comando
solve, cuyo uso en profundidad, as como el de diff, int y dsolve se deja como consulta
al lector. El ejemplo siguiente muestra cmo utilizar solve para resolver algunas
ecuaciones:
Cabe hacer notar que en algunas sustituciones numricas es posible que el resultado
contine siendo una variable sym, casos en los que conviene utlizarse eval para que se
evalen estas expresiones. Esto equivale a convertir una variable sym con slo nmeros,
en su correspondiente nmero del tipo double.
Ejemplo 2-21
Utilizando el comando solve, resolver las siguientes ecuaciones o sistemas de
ecuaciones:
a) 0
2
+ + c bx ax
b) 2 sin + x x e
x
c)
y x
yz x
z y x
+
+ +
1 3
4 2
10
2 2 2
Solucin
a) Resolveremos la ecuacin cuadrtica respecto a x. Es evidente que existen dos
soluciones analticas, y ambas deben ser calculadas por solve. Para utlizar este
comando, bien podramos crear primero los smbolos involucrados en las ecuaciones, o
escribir estas directamente en los argumentos como cadenas de caracteres
28
. Haciendo
esto ltimo, encontramos
W=solve('a*x^2+b*x+c','x') % 'x' al final indica que se resuelve
respecto a 'x'
W =
[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]
[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]
class(W)
ans =
sym
b) Aqu la solucin obtenida es numrica, pero la ecuacin se copia de manera similiar
solve('exp(x)=x-sin(x)+2') %el segundo argumento es aqu opcional
ans =
-2.5095147812379364096540276682961
class(ans) %El resultado es an simblico
ans =
sym
c) Las tres ecuaciones se separan por comas, as como las variables en el orden en que
se desea la solucin. Debe haber tres argumentos de salida (uno por cada variable), y
estos se colocan a la izquierda del igual, encerrados como un vector entre corchetes.
[Y,X,Z]=solve('x^2+y^2+z^2=10','2*x-y*z=4','3*x+1=y','y','x','z');
28
Si se copian las ecuaciones como smbolos, no van entre comillas y se ingresan despejadas, sin copiar
=0.
Aqu el resultado es extenso, pues las operaciones se dejan indicadas y siguen siendo
tipo sym, como verificamos escribiendo
class(Y),class(X),class(Z)
ans =
sym
ans =
sym
ans =
sym
Como veremos a continuacin, estas expresiones se convierten en nmeros double
evalundolas con eval, as que la respuesta numrica la podemos hallar escribiendo
Y=eval(Y)
Y =
0.652318626380776
0.106223568135152
-1.0126044305913 + 0.311612876116814i
-1.0126044305913 - 0.311612876116814i
X=eval(X)
X =
2.95695587914233
1.31867070440546
-2.03781329177389 + 0.934838628350441i
-2.03781329177389 - 0.934838628350441i
Z=eval(Z)
Z =
-0.911532960721837
-2.87225070753154
2.55855850079336 + 0.867897748209717i
2.55855850079336 - 0.867897748209717i
Esto concluye el ejemplo.
Como acabamos de ver, en algunas ocasiones se presenta la necesidad de convertir un
smbolo numrico a su equivalente nmero double. La manera de hacer esto es a travs
de la funcin eval, y el procedimiento funciona siempre que la expresin simblica slo
contenga nmeros, o de lo contrario puede producirce un error. El proceso contrario, la
obtencin de la versin simblica de un nmero, se logra mediante el comando sym, y
entonces no es necesario introducir el nmero como variable char. Por ejemplo
a=sym(1/10) %Igual que sym('1/10')
a =
1/10
class(a)
ans =
sym
De esta manera es posible evitar el error introducido en los clculos numricos, debidos
a la limitada precisin del punto flotante. Podemos tambin redefinir temporalmente pi
escribiendo
pi=sym('pi')
pi =
pi
Para restaurar pi, podemos borrar la variable pi escribiendo
clear pi %Restaura el valor numrico de pi
pi
ans =
3.14159265358979
eval(a) % El resultado es del tipo "double"
ans =
0.1
Si se desea ver un nmero con cierta cantidad de dgitos, entonces se emplea vpa. Por
ejemplo
vpa(pi,29) % pi con 29 dgitos
ans =
3.1415926535897932384626433833
vpa(sqrt(2),2) %La raz de 2 con dos dgitos
ans =
1.4
class(ans) %El resultado es simblico
ans =
sym
Se deja al lector la consulta de las ayudas respectivas, as como del comando digits, que
se encuentra ntimamente realicionado con vpa. Aqu termina nuestro estudio
introductorio de las variables simblicas en Matlab. El lector debe tener presente que
muchas de las funciones utilizadas en esta seccin tienen una aplicacin ms general de
lo que aqu se muestra, y es por ello que se le invita a consultar las ayudas respectivas.
2.5.6 Objetos tipo cell
Hasta ahora hemos tratado con diversas clases de variables, y hemos encontrado que
todas ellas, salvo tal vez los objetos inline, aceptan una representacin matricial. Sin
embargo, el manejo matricial que hemos dado a estas variables tiene al menos estas dos
limitaciones:
I) No es posible agrupar en una matriz ms de una clase de variable
II) Todos los elementos de una matriz son de tamao unitario. Esto es, que un
elemento no puede ser l mismo una matriz.
En esta seccin estudiamos una nueva clase de variable: los arreglos rectangulares
llamados cell.
Los objetos tipo cell son una clase ms general de matrices, y su importancia radica
fundamentalmente en que no estn sujetas a las limitaciones I y II. As, por ejemplo, si
A es un objeto cell de tamao 2*2, entonces uno de sus elementos puede ser una matriz
numrica de tamao 5*3; otro una cadena de caracteres; un tercero, ser un objeto inline;
e incluso un cuarto puede ser l mismo otro objeto tipo cell. Ntese que, an cuando
cada elemento pueda ser de tamao y naturaleza diferente, es indispensable que cada
fila posea igual cantidad de elementos, ya que se trata de arreglos rectangulares.
Los objetos cell pueden entenderse fcilmente como matrices, y para trabajar con ellos
basta cambiar en la notacin matricial precedente a los corchetes y parntesis por las
llaves { }. As, para crear un objeto cell, sus elementos se encierran entre llaves en
lugar de corchetes; los elementos de una misma fila se separan por espacios o comas, y
las filas mediante punto y coma. Por ejemplo
A={1 3; -2 1} %Aqu cada elemento es una matriz double de 1*1
A =
[ 1] [3]
[-2] [1]
class(A)
ans =
cell
size(A) %Esta funcin tambin funciona para objetos cell
ans =
2 2
Para que uno de los objetos sea una matriz, basta con encerrarlo entre corchetes
B={'a' 3 1; [10 0 1;-3 -5 40] 4 3}
B =
'a' [3] [1]
[2x3 double] [4] [3]
Observemos que la matriz de 2*3 que es tan grande como B- introducida se ha dejado
indicada, lo cual se debe a que su forma y tamao no la hace apta para mostrarla
completa. Ntese que en B coinciden elementos double y char. Otros ejemplos son
C={['abc;123'],eye(3),inline('x-sin(x)'),sym('w')} %Vector tipo cell
C =
'abc;123' [3x3 double] [1x1 inline] [1x1 sym]
D={rand(1,9); 1:5; {4 'x' -9}} %Vector columna tipo cell
D =
[1x9 double]
[1x5 double]
{1x3 cell }
En vista de que la finalidad de los arreglos cell es almacenar varios tipos de objetos, las
operaciones matemticas no estn definidas para ellos; en efecto
B+1
??? Error using ==> +
Function '+' not defined for variables of class 'cell'.
Como consecuencia, en esta seccin estudiaremos nicamente la manipulacin de los
arreglos rectangulares y su contenido. Dos operaciones que s son vlidas son la
transposicin y la transjugacin, como puede verificar el lector escribiendo C' y C.'.
Las mismas llaves que se emplean para crear objtetos cell, sirven para llamar a sus
elementos, y gran parte de la notacin matricial sigue siendo vlida cambiando los
parntesis por llaves. Debe tenerse presente que cuando se escribe A{i,j}, se hace
referencia al objeto que se encuentra en esa posicin dentro de la estructura cell, y este
objeto tiene su propia clase y tamao. Por ejemplo
A{2,1} %Segunda fila, primera columna
ans =
-2
class(ans)
ans =
double
C{2}
ans =
1 0 0
0 1 0
0 0 1
El operador dos puntos tiene los usos ya vistos, pero el resultado a menudo no puede
almacenarse en una sola variable. Por ejemplo
B{2,:} %Segunda fila, todos los elementos
ans =
10 0 1
-3 -5 40
ans =
4
ans =
3
B{:} %Todos los elementos de B
ans =
a
ans =
10 0 1
-3 -5 40
ans =
3
ans =
4
ans =
1
ans =
3
Aqu sucedi que, no siendo posible almacenar objetos de tan distinta naturaleza en una
sola variable que no sea tipo cell
29
, stos se han mostrado en varias variables. Por esta
misma razn, se produce un error al escribir
H=B{2,:}
??? Illegal right hand side in assignment. Too many elements.
29
En realidad, es posible almacenarlos tambin en ontras variables, pertenecientes a la clase struct
(estructuras), las cuales se usan a menudo para almacenar bases de datos.
Si lo que se desea es aislar algunos elementos de una variable cell en otra, se usan
parntesis en lugar de corchetes. Por ejemplo
H=B(2,:) %Segunda fila, tomada como "cell"
H =
[2x3 double] [4] [3]
class(H)
ans =
cell
W=D([2 3]) %Segundo y tercer elemento en "D"
W =
[1x5 double]
{1x3 cell }
class(W) %El resultado sigue siendo cell
ans =
cell
En realidad, la la notacin A(i,j) cuando A pertenece a esta clase, hace referencia a
un nuevo arreglo cell, formado con los elementos de A en las posiciones que indican i y
j.
Cuando varios elementos de un objeto cell son de igual clase y tamao, es posible
almacenarlos en una matriz agrupndolos entre corchetes. Esta matriz se est formando
por concatenacin de los elementos de objeto tipo cell, y es por lo tanto vlida la
notacin ya estudiada. As, si tenemos
S={eye(2),magic(2), rand(2); 'este es tipo char',zeros(2), ones(2)}
S =
[2x2 double] [2x2 double] [2x2 double]
'este es tipo char' [2x2 double] [2x2 double]
Podemos aislar los elementos tipo double en S, escribiendo
S{[1 3:6]} %elementos 1 y 3 a 6
ans =
1 0
0 1
ans =
1 3
4 2
ans =
0 0
0 0
ans =
0.444703364353194 0.791937037427035
0.615432348100095 0.921812970744803
ans =
1 1
1 1
De modo que si agrupamos esta expresin entre corchetes, se crea la matriz
K=[S{[1 3:6]}] %Los corchetes van fuera de las llaves
K =
Columns 1 through 3
1 0 1
0 1 4
Columns 4 through 6
3 0 0
2 0 0
Columns 7 through 9
0.444703364353194 0.791937037427035 1
0.615432348100095 0.921812970744803 1
Column 10
1
1
size(K),class(K)
ans =
2 10
ans =
double
Esto mismo es vlido siempre que cada elemento considerado sea del mismo tipo y su
tamao sea tal que puedan concatenarse; por ejemplo, dos vectores fila clase char
pueden concatenarse de varias formas para originar distintas matrices
[S{2};S{2}] % El ; separa dos filas
ans =
este es tipo char
este es tipo char
[S{2} ' - ' S{2}] %Concatenacin en un vector fila
ans =
este es tipo char - este es tipo char
En este ltimo caso se interpuso la cadena de caracteres - entre ambos vectores.
La notacin matricial de los objetos cell permite aislar el elemento en una posicin, y
utlizarlo para hacer otras operaciones. Por ejemplo, si tenemos
F={inline('x^3-y^2'),magic(3); single([-8 0; pi 1/3]), sym('w')}
F =
[1x1 inline] [3x3 double]
[2x2 single] [1x1 sym ]
Entonces podemos ailsar en R el elemento tipo inline escribiendo
R=F{1}
R =
Inline function:
R(x,y) = x^3-y^2
Y habremos creado una variable inline que puede manejarse como ya vimos
R(2,3) %Reemplaza x=2, y=3
ans =
-1
Existe sin embargo una forma directa de evaluar la expresin inline contenida en F.
Observemos que para evaluar esta expresin, hemos escrito R(2,3), pero resulta que a
su vez es R=F{1}, por lo que podemos resumir estas dos instrucciones como
F{1}(2,3)
ans =
-1
Donde vemos que primero se hace referencia al elemento inline como miembro de la
estructura cell, y luego de ubicarlo se escribe lo que de l se requiere. Del mismo modo,
la tercera columna de la matriz double en F{1,2} puede ailarse y transponerse en dos
pasos escribiendo
aa=F{1,2}
aa =
8 1 6
3 5 7
4 9 2
aa(:,3)'
ans =
6 7 2
O en un paso escribiendo
F{1,2}(:,3)' %O bien: F{3}(:,3)' ; (F{3}(:,3))'
ans =
6 7 2
Y asmismo, un objeto simblico puede crearse con el ltimo elemento de F,
escribiendo
t=F{end}
t =
w
y=t^2-int(log(t^2))
y =
w^2-log(w^2)*w+2*w
O en un paso, puesto que t=F{end}, escribimos
y=F{end}^2-int(log(F{end}^2))
y =
w^2-log(w^2)*w+2*w
class(y)
ans =
sym
Y como ya mencionamos antes, un objeto cell puede contener como elemento a otro
objeto cell, de manera que si tenemos
clear all; AA={4,{5 9; -1 {'fin'}}}
AA =
[4] {2x2 cell}
Podemos ir llamando sucesivamente sus elementos para transponer la cadena de
caracteres, escribiendo
a1=AA{2}
a1 =
[ 5] [ 9]
[-1] {1x1 cell}
a2=a1{4}
a2 =
'fin'
a3=a2{1}
a3 =
fin
a4=a3'
a4 =
f
i
n
Proceso en el que hemos creado las siguientes variables variables
whos
Name Size Bytes Class
AA 1x2 682 cell array
a1 2x2 490 cell array
a2 1x1 98 cell array
a3 1x3 6 char array
a4 3x1 6 char array
Grand total is 35 elements using 1282 bytes
Para hacer todo esto en un solo paso, bastara con escribir
a4=AA{2}{4}{1}'
a4 =
f
i
n
Lo cual se hace ya que a4=a3', pero a3=a2{1}, y a su vez a2=a1{4}, que se obtiene
como a1=AA{2}.
Con esta sencilla notacin, es fcil redefinir un elemento de un objeto cell de modo
anlogo a como se haca con las matrices. Por ejemplo, para cambiar el primer elemento
de AA por la matriz mgica de tamao 3, se escribe
AA{1}=magic(3)
AA =
[3x3 double] {2x2 cell}
Y si se desea multiplicar por 5 la primera fila de esta matriz en AA{1}, se escribe
AA{1}(1,:)=5*AA{1}(1,:)
AA =
[3x3 double] {2x2 cell}
Para reemplazar el elemento la cadena de caracteres 'fin' por su transpuesta, podra
escribirse AA{2}{4}{1}=a4, o directamente
AA{2}{4}{1}=AA{2}{4}{1}'
AA =
[3x3 double] {2x2 cell}
Operacin que se verifica escribiendo
AA{2}{4}{1}
ans =
f
i
n
En cambio, la modificacin de ms de un elemento contiene complicaciones
adicionales, ya que se produce un error cuando intentamos
AA{1,:}=0
??? Insufficient outputs from right hand side to satisfy comma
separated list expansion on left hand side. Missing [] are the most
likely cause.
Error que persiste cuando se colocan los corchetes que all se sugieren. Dejaremos esta
operacin para cuando se halla visto la concatenacin de arreglos cell
La concatenacin de un arreglo cell es posible en Matlab, pero no es tan sencilla como
las que ya se han estudiado. Antes, si tenamos la matriz
A=[1:4; -4 2 0 0]
A =
1 2 3 4
-4 2 0 0
Podamos aadir una columna de cuatros escribiendo
A=[A [4 4]']
A =
1 2 3 4 4
-4 2 0 0 4
Sin que el uso de unos corchetes dentro de otros ocasionara inconvenientes. Esto era
posible porque todos los elementos en A deban ser de tamao unitario, y entonces el
vector [4 4]' no poda interpretarse como un solo elemento, sino como los dos
elementos de toda una columna. En cambio, cuando se trata de un objeto cell, este
vector representa slo un elemento, a menos que se indique lo contrario. De este modo,
si sedeamos introducir la cadena columna {'ms'; 1e+3} en la variable
a={zeros(2), 'otro', inline('2^x')}
a =
[2x2 double] 'otro' [1x1 inline]
No podemos simplemente escribir
a={a {'ms'; 1e+3}}
a =
{2x2 cell} {2x1 cell}
Ya que cada uno de los dos trminos se considera entonces como un elemento tipo cell.
En efecto
a{:}
ans =
[2x2 double] [ 3]
'otro' [1x1 inline]
ans =
'ms'
[1000]
Sin embargo, recordemos que existe una forma alternativa de concatenar matrices, la
cual estudiamos junto con la expansin escalar. En esta otra notacin, siempre se
especificaban las posiciones de la matriz que deban ser modificadas. As, otra forma de
concatenar A, sera
A(:,5)=[4 4]' %Define el contenido de la quinta columna
A =
1 2 3 4 4
-4 2 0 0 4
Pero esta es justamente la notacin que se requiere para concatenar objetos cell, ya que
no deja dudas respecto qu es lo que se est definiendo (un elemento, o una columna,
por ejemplo). Por lo tanto, la manera correcta de aadir esta tercera columna en a es
a(:,3)={'ms'; 1e+3} %define la tercera columna
a =
[2x2 double] [ 3] 'ms'
'otro' [1x1 inline] [1000]
Donde se ve que deben usarse siempre parntesis en lugar de corchetes, pues se hace
referencia al objeto cell como tal, y no a su contenido.
Ntse que las expresiones a{2} y a(2) son conceptualmente diferentes: las llaves
hacen referencia al conenido de esa posicin, sin tener en cuenta el arreglo al que
pertenece, mientras que los parntesis indican un subarreglo cell que se forma a partir
del elemento en la segunda posicin de a . As, cuando escribimos
a{2}
ans =
otro
El resultado es una variable char, que estaba contenida en la segunda casilla de a. Por el
contrario, escribiendo
a(2)
ans =
'otro'
Se crea unl sub-arreglo cell que consiste en el segundo elemento de a.
Por esta razn, cuando se empleen parntesis a la izquierda del igual para encerrar los
subndices de lo que se va a redefinir, aquello que se ubique a la derecha del igual debe
ser un objeto cell. Por ejemplo, para cambiar el primer elemento en a por un 5,
podramos escribir a{1}=5. Pero si en lugar de llaves se usaran parntesis,
obtendramos el error
a(1)=5
??? Conversion to cell from double is not possible.
Ya que 5 no es tipo cell, sino double. Debe pues escribirse este nmero como objeto
cell, as
a(1)={5} %Encerrarlo entre llaves lo hace tipo cell
a =
[ 5] [ 3] 'ms'
'otro' [1x1 inline] [1000]
De este modo, una expansin escalar de a sera
a(3,1)={0}
a =
[ 5] [ 3] 'ms'
'otro' [1x1 inline] [1000]
[ 0] [] []
Donde se aprecia que en lugar de rellenarse con ceros, los objetos cell se completan con
matrices vacas.
Esta nueva notacin que emplea parntesis en lugar de llaves es precisamente la que
sirve para redefinir varios elementos de una sola vez, porque con ella damos a entender
que se modifica el sub-arreglo cell A(i,j).
Por ejemplo, redifinimos la primera fila de a para que conste de matrices vacas
escribiendo
a(1,:)={[]} %Recuerde encerrar el elemento entre corchetes
a =
[] [] []
'otro' [1x1 inline] [1000]
[ 0] [] []
Los elementos en las posiciones 2, 3 y 4 se obtienen en una estrucutura cell mediante la
expresin
a([3 2 1],[1 2]) % Filas 3, 2, 1; Columnas 1,2
ans =
[ 0] []
'otro' [1x1 inline]
[] []
Para copiar el contenido de elementos en las posiciones 2, 5, y 7 en las posiciones 1, 4
y 9 se utilizan parntesis, quedando la operacin
a([1 4 9])=a([2 5 7])
a =
'otro' [1x1 inline] []
'otro' [1x1 inline] [1000]
[] [] []
Para redefinir la tercera fila, escribimos algo como
a(3,:)={sym('y') nan -i*inf}
a =
Inf 'otro' [1x1 inline] []
'otro' [1x1 inline] [ 1000]
[1x1 sym] [ NaN] Inf [NaN -i]
Resultado que se ve algo confuso, pero que se ratifica con el tamao de a
size(a)
ans =
3 3
Ahora que hemos visto el manejo de estos arreglos rectangulares, podemos manipular el
argumento de salida del comandodo symvar. Por ejemplo, sea
clear all, s=inline('(a1^2-a2^3)/(x+y)*exp(1+c*z)')
s =
Inline function:
s(a1,a2,c,x,y,z) = (a1^2-a2^3)/(x+y)*exp(1+c*z)
v=symvar(s)' %El resultado es un vector cell con elementos char
v =
'a1' 'a2' 'c' 'x' 'y' 'z'
Formaremos por concatenacin una funcin inline F que exprese la suma de los
elementos en v. Para ello, observemos que dichos elementos son variables char, y como
tales pueden concatenarse con otros caracteres en un vector fila, agrupndolos con
corchetes. El vector resultant se convierte de char a inline de la manera que ya se ha
visto.
Para obtener el elemento i-simo en v, se escribe v{i}; el caracter + se escribe '+'.
Por lo tanto, tenemos
F=inline([v{1} '+' v{2} '+' v{3} '+' v{4} '+' v{5} '+' v{6}])
F =
Inline function:
F(a1,a2,c,x,y,z) = a1+a2+c+x+y+z
Alternativamente, la concatenacin pudo llevarse a cabo paso a paso en una variable
intermedia G, as
G=v{1}; %Primero se inicia G, y luego se va aumentando
G=[G '+' v{2}]; G=[G '+' v{3}];G=[G '+' v{4}] ...
;G=[G '+' v{5}];G=[G '+' v{6}]
G =
a1+a2+c+x+y+z
Finalmente se obtiene F a partir de la cadena de caracteres G
F=inline(G)
F =
Inline function:
F(a1,a2,c,x,y,z) = a1+a2+c+x+y+z
Esta ltima forma es en realidad la ms importante, pues se presta para ser realizada en
un programa mediante cierto procedimiento iterativo llamado ciclo, como se ver en el
siguiente captulo.
2.6 Algunos comandos para graficar
Matlab es un Software que cuyas aplicaciones se enmarcan en tres grandes ejes, que
son:
Programacin: posibilidad de hacer clculos numricos, as como de crear y
ejecutar algoritmos e incorporarlos como funciones.
Grficas: incluye visualizacin de datos, presentacin de grficas y creacin de
entornos grficos interactivos (GUI).
Interfaz con otros lenguajes de programacin: interoperabilidad, extensibilidad.
(Por ejemplo, se acopla con FORTRAN y C).
Hasta este momento slo hemos operado a Matlab en virtud de la posibilidad que brinda
para hacer clculos. La creacin de nuevas funciones es un tema del captulo tercero, y
en esta seccin principia el estudio de un tema que ser tratado en el captulo cuarto: la
creacin de grficas.
La creacin de grficas y animaciones constituye una de las aplicaciones ms
importantes y acogedoras de Matlab, y en esta seccin nos tratatremos con algunos
comandos que permiten representar la informacin grficamente la informacin.
Matlab provee una variedad de funciones para anotar para visualizar los datos
almacenados en vectores, as como funciones para hacer anotaciones en estas grficas e
imprimirlas; aqu aprenderemos tanto comandos para trazar curvas paramtricas en el
plano y en el espacio (y an superficies), as como comandos que sirven para etiquetar
ejesm, colocar ttulos, y dems anotaciones que suelen hacerse en las grficas.
El lector interesado puede ampliar estos temas revisando las ayudas correspondientes a
los comandos listados en help matlab\graph2d, help matlab\graph3d y help
matlab\specgraph. En particular, se recomienda la lectura del tutorial Using MATLAB
Graphics , includo en los vnculos de la ventana help desk.
2.6.1 El comando plot
Comenzamos nuestro estudio con las curvas bidimensionales, las cuales se construyen
con plot a partir de los datos contenidos en vectores. Si se desea graficar una curva
bidimensional de esta manera, primero se generan varios puntos de la misma y sus
coordenadas
) , ( y x
se almacenan en dos vectores. Por ejemplo, supngase que
queremos graficar la funcin ( ) x sen y . Entonces creamos primero un vector con las
abscisas de los puntos que se desean considerar. Por ejemplo, este vector puede ser
A=linspace(-pi,2*pi,300);%Vector fila con 300 puntos entre -pi y 2*pi
Puesto que cada ordenada est relacionada con los elementos de A por la ecuacin
( ) x y sin , el vector correspondiente se genera como
B=sin(A);
Para crear una grfica sencilla, basta entonces con escribir
plot(A,B)
Entonces se abre una nueva ventana titulada Figure No.1 que contiene unos ejes
(llamados axes) en un fondo blanco, y dentro de los cuales se ubica una lnea azul
continua que representa la grfica de la funcin ( ) x sen y para 2 x , tal como
se aprecia en la Figura 2-12.
Acerca de la figura creada, podemos hacer las siguientes observaciones:
Se ha abierto una nueva ventana, que dice contener una figura (figure). Esta
ventana tiene su propio men y barra de herramientas, y su fondo es gris.
En la ventana se encuentra una regin blanca (axes) la cual contiene la grfica
como tal.
La lnea (line) que representa los puntos indicados por los vectores, es de color
azul y de trazo continuo. Adems no tiene un marcador (marker) que indique
cules fueron estos puntos (por ejemplo, estrellas, cuadrados, puntos gruesos )
Los ejes no estn etiquetados, no existe cuadrcula, y tampoco ttulo.
Los lmites inferior y superior del eje vertical estn ceidos a la curva. Esto
significa que corresponden a min(B) y max(B), respectivamente (en este caso
-1 y +1).
Los lmites inferior y superior del eje horizontal no estn ceidos a la curva, sino
que se encuentran en los nmeros enteros correspondientes a floor(min(A))
y ceil(max(A)). (En este caso -4 y +8)
El tamao relativo de los ejes se ha escalado, alterando la apariencia real de la
curva. Para este caso en particular, el trazo vertical de -4 a 1 mide lo mismo que
el horizontal entre -4 y 8; es decir, este trazo se ha amplificado en un factor de
12/5. (Lo que significa que doce unidades del eje x miden lo mismo que 5 del eje
y)
kjh
2.3 M-Files
Los archivos Tipo M contienen cdigo en el lenguaje de Matlab, es decir, son archivos
que contienen algoritmos aptos para ser ejecutados por Matlab. Estos archivos pueden
crearse usando cualquier editor de texto y guardndolos con extensin *.m (por
ejemplo, en el bloc de notas), siempre y cuando los comandos estn en el sencillo
lenguaje de programacin de Matlab. Existen dos clases sustancialmente diferentes de
Archivos M: scripts (guiones) y funciones. Para explicar la diferencia entre ambos,
haremos primero una reflexin acerca de las variables y el WS.
Hemos dicho que cuando se realizan tareas desde la ventana de trabajo, las variables se
creadas se almacenan en la memoria virtual WS. Ahora bien, este no es necesariamente
el caso cuando se utiliza un archivo M. En tal caso, puede suceder que el algoritmo all
contenido utilice las mismas variables que se han creado desde la ventana de trabajo, o
incluso que este cree nuevas variables en el WS las cuales pueden manipularse entonces
desde la ventana de trabajo. Diremos entonces que se trata de un archivo script, y el
resultado neto de ejecutar el programa es equivalente a copiar las mismas lneas
correctamente separadas por comas (o punto y coma) en la ventana command window.
Por otra parte, podra suceder que el archivo M utilizara sus propias variables por fuera
del WS, y entonces no podramos modificarlas desde la ventana de trabajo. An ms, si
existiera la variable
2 . 3 p
en esta ventana, y el archivo M contuviese la instruccin
3 . 1 100 p
, entonces ambas variables seran en efecto distintas, y tras correr el
programa del archivo M, an encontraramos
2 . 3 p
, es decir, que la variable ha
permanecido inalterada. Esta situacin es la que se presenta con las funciones, las
cuales pueden considerarse como cajas negras con argumentos de entrada y salida, de
alguna manera independientes de la ventana command window.
Hecha esta distincin, trataremos cada uno de ellos por separado.
2.2.1 Archivos Script
En un sentido estricto, puede decirse que son archivos que no aceptan argumentos de
entrada ni poseen argumentos de salida, operando con los datos del WS. Al igual que las
funciones, para crearlos basta con ir al Men FileNewM-File. Entonces se abre el
Editor de Matlab y se procede a escribir all el algoritmo tal y como se hara en la
ventana command window, con la diferencia de que ahora puede directamente cualquier
lnea, ya que presionar Enter no ejecuta las lneas. En cambio, es necesario grabar estos
archivos para poder ejecutarlos. La extensin comnmente utilizada es *.m