Inicio / Wikis / Tutoriales / Introducción informal a Matlab y Octave - MATLAB (III)

Introducción informal a Matlab y Octave - MATLAB (III)

(8 opiniones)
Tutorial creado por
05 de Noviembre de 2006
Encriptación

2.8  Sentencias

Como se ha dicho antes, las estructuras esenciales del lenguaje son los contadores y los condicionales. M¨¢s com¨²nmente conocidas como las sentencias do y las sentencias if. Estas estructuras son comunes con el resto de lenguajes de programaci¨®n y de scripting existentes. La primera es un bucle contador que permite ejecutar varias tareas id¨¦nticas secuencialmente con la variaci¨®n de diversos ¨ªndices; se pueden encapsular con otros contadores y con otras sentencias. La segunda permite incluir variaciones en la ejecuci¨®n del c¨®digo seg¨²n el cumplimiento de ciertas condiciones l¨®gicas.

Estos no son las ¨²nicas estructuras de programaci¨®n, son las m¨¢s b¨¢sicas. A partir de ellas se derivan sentencias m¨¢s ¨²tiles y m¨¢s espec¨ªficas como veremos a continuaci¨®n.

2.8.1  La sentencia if

Tenemos tres formas de condicional. La m¨¢s simple es:
if (condici¨®n)
   cuerpo
 endif
 
Por ejemplo:
>> esto=1;
 >> if esto
 ... disp('es esto');
 ... end
 es esto
 
Muchas veces se ver¨¢ que en vez de usar, endif o endfor se usar¨¢ simplemente end. Debemos darnos cuenta que cuando tenemos muchos contadores y condicionales encapsulados es muy importante saber d¨®nde termina cada una de las sentencias. Usar endfor y endif, numerar o usar el tabulado de modo inteligente nos pueden ahorrar muchos quebraderos de cabeza. En esta construcci¨®n s¨®lo tenemos una condici¨®n l¨®gica, que en el caso de no cumplirse se ignorar¨¢ la sentencia entera:
>> esto=0;
 >> if esto
 ... disp('es esto');
 ... end
 
Si queremos que la sentencia no se ignore, y que si la condici¨®n no se cumple impongamos un cuerpo distinto podemos usar la estructura:
if (condici¨®n)   
   cuerpo 1   
 else    
   cuerpo 2   
 endif
 
Ejemplo:
>> esto=1;
 >> if esto
 ...   disp('es esto');
 ... else
 ...   disp('es lo otro');
 ... end
 es esto
 
En la que se ve perfectamente que si no se cumple la condici¨®n 1 inmediatamente se ejecuta el cuerpo2. Si tenemos m¨¢s de una condici¨®n l¨®gica sobre una misma variable podemos usar una condicional m¨²ltiple de la siguiente forma:
if (condici¨®n 1)   
   cuerpo 1   
 elseif (condici¨®n 2)   
   cuerpo 2   
 ...   
 elseif (condici¨®n n)   
   cuerpo n   
 else   
   cuerpo N   
 endif
 
16 Debe recalcarse que la condici¨®n debe ser sobre la misma variable para cerrar la l¨®gica del condicional. En el caso que tengamos condiciones l¨®gicas sobre m¨¢s de una variable podemos encapsular los if sin ning¨²n problema:
if (condici¨®n a)   
   if (condici¨®n b)   
     cuerpo a+b   
   else   
     cuerpo a+bN   
   endif   
 else   
   cuerpo aN   
 endif
 
Es importante que evitemos estructuras l¨®gicas muy complejas, porque son dif¨ªciles de entender y de depurar; a¨²n cuando las ha escrito uno mismo. Se ver¨¢n ejemplos de estas estructuras en la secci¨®n de ejercicios.

2.8.2  La sentencia switch.

Lo forma general del comando es:
switch (variable_switch)
   case (posible_valor_variable_switch)
     comandos
   case (posible_valor_variable_switch)
 ...
   otherwise
     comandos adicionales
 endswitch
 
Esta sentencia es la misma que case en Fortran y switch en C. Un ejemplo de su uso ser¨ªa:
>> a = 'dos'
 >> switch (a)
 case ('uno')
 disp('has escogido el numero 1')
 case ('dos')
 disp('has escogido el numero 2')
 otherwise
 disp('no se que numero has escogido')
 endswitch
 has escogido el numero 2
 

2.8.3  La sentencia for

As¨ª es como se denomina el contador o sentencia do en Matlab. Su estructura es:
for [variable contador]=[secuencia del contador]
   cuerpo [dependiente o no de la variable contador]
 endfor 
 
Es decir, para una determinada variable, que avanza de 1 en 1 desde el l¨ªmite inferior hasta el l¨ªmite superior ejecutamos el cuerpo. El cuerpo puede depender o no de la variable contador, ¨¦sta puede ser un contador a parte, que simplemente nos imponga que una determinada sentencia se ejecute un n¨²mero fijo de veces. La mayor¨ªa de las veces nuestro cuerpo depender¨¢ de la variable que usemos como contador, es decir, ser¨¢ un ¨ªndice de nuestro cuerpo.

Notemos que lo que utilizamos para contar una secuencia, como en el caso de las submatrices. Lo que har¨¢ el ¨ªndice contador ser¨¢ tomar sucesivamente todos los valores que tengamos en la secuencia. Por ejemplo, si pedimos que una variable haga un bucle de ese tipo:
for i=1:2:10
 
dentro del bucle la variable i tomar¨¢ los valores que salen por pantalla en el caso que llamemos la secuencia:
>> 1:2:10
 ans = 1   3   5   7   9
 
Por ejemplo:
>> for i=5:5:25
 ... disp(i),disp('es multiple de 5')
 ... end
 5
 es multiple de 5
 10
 es multiple de 5
 15
 es multiple de 5
 20
 es multiple de 5
 25
 es multiple de 5
 
Los bucles con contador tambi¨¦n se pueden encapsular, y ¨¦ste encapsulado es esencial cuando trabajemos con matrices de rango mayor que 1. Por ejemplo, si queremos asignar una operaci¨®n compleja a una matriz de rango 3 debemos encapsular 3 contadores:
for i=1:IMAX   
   for j=1:JMAX   
     for k=1:KMAX   
       cuerpo   
     endfor   
   endfor   
 endfor
 

2.8.4  La sentencia while

En vez de controlar el bucle mediante un contador es muy ¨²til controlarlo mediante una condici¨®n l¨®gica. Para eso podemos usar una estructura while.
while (condici¨®n)   
   cuerpo   
 endwhile
 
Ejemplo:
>> a=0;
 >> while a<5
 ... disp(a)
 ... a=a+1;
 ... end
 0
 1
 2
 3
 4
 
S¨®lo debemos tener en cuenta cuando programamos que el uso de un while es mucho m¨¢s cr¨ªtico que el uso de un for. Esto es porque la condici¨®n l¨®gica que controla el bucle debe aplicarse sobre una variable interna en el bucle. Entonces es probable que si programamos mal, la variable que usamos como control nunca llegue a cumplir la condici¨®n que nos para la ejecuci¨®n. En Matlab o Octave no suele ser un gran problema, puesto que el sistema puede reaccionar y cortar el proceso de otro modo, pero en otros lenguajes puede tener consecuencias bastante desagradables. Tambi¨¦n debemos tener en cuenta que los bucles controlados por una condici¨®n l¨®gica no permiten la paralelizaci¨®n en el caso que tengamos una versi¨®n para varios procesadores de Matlab o Octave.

2.8.5  La sentencia do-until

Esta sentencia es equivalente a while con la condici¨®n l¨®gica complementaria.

2.8.6  Las sentencias break y continue

Tanto para el for como para los otros tipos de bucles tenemos variables de control de la ejecuci¨®n que pueden ser de utilidad. La sentencia break dentro de un bucle nos quita el hilo17 del bucle para seguir ejecutando el programa o un bucle externo. Un ejemplo ser¨ªa:
num=103;   
 div=2;   
 while (div*div <= num)   
   if (rem (num, div) == 0)   
     break;   
   endif   
   div++;   
 endwhile   
 if (rem (num, div) == 0)   
   printf ('El divisor menor de %d es %d \n', num, div);   
 else   
   printf ('%d es primo \n', num);   
 endif
 
En cambio la sentencia continue, en vez de sacarnos del bucle, hace que saltemos uno de los pasos del mismo para ir al siguiente estado del contador.

2.8.7  La sentencia try

Los bloques de estructura try son de la forma:
try
   cuerpo
 catch 
   alternativa
 end
 
Por ejemplo:
>> a=rand(5,5);b=rand(4,4);
 >> try
 ... a*b
 ... catch
 ... disp('Dimensiones incompatibles')
 ... end
 Dimensiones incompatibles
 
Esta estructura es muy parecida a if-else pero con la particularidad que la condici¨®n l¨®gica es si se produce o no un error. Se usar¨¢ cuando no sepamos si algo puede ejecutarse bien o no y no queramos que el error afecte al resto de la ejecuci¨®n del programa. Primero intentar¨¢ ejecutar la sentencia que hayamos puesto en cuerpo y si devuelve un error ejecutar¨¢ alternativa ignorando el error producido por la primera sentencia.

2.9  Funciones (II)

Tratar la funci¨®n en Matlab s¨®lo desde el punto de vista de un archivo auxiliar es un tremendo error. La escritura y manipulaci¨®n de funciones es la mayor potencia (probablemente la ¨²nica) del lenguaje. Este planteamiento choca con la formulaci¨®n b¨¢sica de la funci¨®n y se acerca m¨¢s a los lenguajes orientados a objetos donde podemos asignar un m¨¦todo a una variable, algo impensable en Fortran. Siendo poco rigurosos podemos decir que si C++ es un lenguaje orientado a objetos Matlab es orientado a funciones.

2.9.1  Funciones matem¨¢ticas b¨¢sicas

Matlab cuenta con una enorme biblioteca de funciones matem¨¢ticas. Su utilidad depende directamente del conocimiento que tengamos de ellas. Mientras intuitivamente ya hemos usado las funciones trigonom¨¦tricas sin y cos, muchas de las presentes en la colecci¨®n ni nos sonar¨¢n. Cumple el objetivo principal de ahorrarnos tener que escribir cualquier funci¨®n m¨ªnimamente conocida. El nombre que reciben estas funciones suele ser bastante descriptivo; la funci¨®n ¦£ se llamar¨¢ gamma y las funciones de Airy se llamar¨¢n airy.

Estas funciones no son archivos .m, se escriben en un lenguaje compilado como C++ o Fortran para que su velocidad sea mayor. No debemos tener miedo a usarlas tanto como sea posible.

2.9.2  La Ayuda(II)

Ya hemos hablado del comando help y c¨®mo debe utilizarse. Nosotros tambi¨¦n podemos dotar nuestras funciones de una ayuda parecida de una manera muy f¨¢cil. Todas las l¨ªneas comentadas entre la sentencia function y la primera sentencia ejecutable nos saldr¨¢n por pantalla si llamamos a la funci¨®n mediante el comando help. Por ejemplo:
function out=derivada_numerica(in)   
 %   
 % funci¨®n derivada_numerica Calcula las diferencias centradas de
 % primer orden de un vector entrada: in (vector) salida : out (vector)
 %
    
   ...   
 end 
 
Cuando hagamos help derivada_numerica obtendremos por pantalla:
funci¨®n derivada_numerica   
  Calcula las diferencias centradas de primer orden de un vector   
    entrada: in  (vector)   
    salida : out (vector)
 
Disponemos tambi¨¦n de dos funciones para manejar los errores de ejecuci¨®n, usage y error. En la secci¨®n 2.9.3 tenemos un ejemplo de c¨®mo se usan. Son de gran utilidad sobre todo cuando hagamos debugging de un programa grande. Si se produce un error en la lectura de los argumentos o en el c¨¢lculo interno se imprime en pantalla toda la cadena de errores que han provocado el fallo, estos mensajes son a menudo demasiado cr¨ªpticos. Si intuimos que la ejecuci¨®n puede fallar en alg¨²n sitio debemos preverlo, es una buena t¨¢ctica pensar el hilo de ejecuci¨®n tanto si funciona correctamente como si no.

18

2.9.3  Argumentos de entrada y salida.

En el apartado anterior dedicado a funciones (2.4.1) hemos sido intencionadamente rigurosos con la sintaxis. Si una funci¨®n retorna s¨®lo una variable pueden omitirse los corchetes:
function salida = entrada (arg)
   salida = ...
 end
 
La funci¨®n nargin retorna el n¨²mero de argumentos de entrada necesarios en una funci¨®n, si lo aplicamos a la funci¨®n entrada que acabamos de definir19:
>> nargin('entrada')
 ans = 1
 
Mientras que dentro de la funci¨®n es una constante cuyo valor es el n¨²mero de argumentos de entrada:
function retval = avg (v)
 % retval = avg(v) v :: vector
 %
 % Calcula la media de los elementos de un vector
   retval = 0;
   if (nargin != 1)
     usage ('avg (vector)');
   endif
   if (isvector(v))
     retval = sum(v) / length(v);
   else
     error ('avg: expecting vector argument');
   endif
 end
 
Este ejemplo adem¨¢s nos sirve para ver el control de errores de una funci¨®n. Las palabras clave usage y error son los mensajes que saldr¨¢n por pantalla si se comete un mal uso o existe un error de ejecuci¨®n respectivamente. Para que entendamos m¨¢s en profundidad se propone esta sesi¨®n de consola:
>> help avg
 avg is the user-defined function from the file
 /home/guillem/CursoScripting/ejercicios/avg.m   
 retval = avg(v)
 v :: vector
 Calcula la media de los elementos de un vector   
 >> v=[1,2,3,4];
 >> avg(v)
 ans = 2.5000
 >> u=[4,3,2,1];
 >> avg(u,v)
 usage: avg (vector)
 error: evaluating if command near line 8, column 3
 error: called from `avg' in file `/home/guillem/C...
 >> w=[1,2;3,4];
 >> avg(w)
 error: avg: expecting vector argument
 error: evaluating if command near line 11, column 3
 error: called from `avg' in file `/home/guillem/C...
 >>
 
Los corchetes son necesarios s¨®lo cuando queramos retornar m¨¢s de una variable:
function [salida1,salida2] = entrada (args)
   salida1 = ...
   salida2 = ...
 end
 
En el caso que dejemos una variable vac¨ªa no vamos a obtener un error sino un aviso:
>> function [x,y,z] = f()
 x=1;
 y=2;
 end
 >> [a,b,c]=f()
 warning: in f near line 7, column 8:
 warning: f: some elements in list of return values are undefined
 a = 1
 b = 2
 c = []
 >>                 
 
Si queremos saber cuantas variables de salida tiene una funci¨®n debemos usar nargout. Una variable de control muy interesante es la palabra clave return, Cuando el hilo de ejecuci¨®n de una funci¨®n pasa por la palabra return inmediatamente retorna la ejecuci¨®n a la consola o al programa principal:
function out = any_zero(v)
 % out = any_zero (v) v :: vector
 %
 % devuelve un mensaje si algun elemento de v es 0
 out = 0;
 for i = 1:length(v)
   if (v (i) == 0)
     out = 1;
     return
   endif
 endfor
 printf ('No se ha encontrado ningun cero \n')   
 >> u=[1,2,3,0];
 >> v=[1,2,3,4];
 >> any_zero(u)
 ans = 1
 >> any_zero(v)
 No se ha encontrado ningun cero
 ans = 0
Valora este capítulo: (8 opiniones)
Autor y licencia de 'Introducción informal a Matlab y Octave - MATLAB (III)'
Guillem Borrell i Nogueras Extraído de: http://torroja.dmt.upm.es/%7Eguillem/matlab/ CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Opiniona sobre 'Introducción informal a Matlab y Octave - MATLAB (III)' (8)

Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.

Opina sobre este tutorial



* Valoración:
* Nombre:
* Correo electrónico:
* Título:
* Comentario:

Wikis relacionados con 'Introducción informal a Matlab y Octave - MATLAB (III)'

El presente texto es una versión ampliada de la conferencia impartida en el ciclo organizado... Más »
El rediseño total o parcial de la estructura organizacional, el impacto de diversas variables macroeconómicas,... Más »
La administración de recursos humanos (personal) es el proceso administrativo aplicado al acrecentamiento y conservación... Más »
Los salarios son uno de los factores de mayor importancia en la vida económica y... Más »
En los años setenta convergen en España una serie de discursos vinculados a conceptos de... Más »
¿Estás seguro de que deseas eliminar este capítulo?