10. Programación en Matlab

10.1.       m-files

Los m-files son archivos de texto donde guardamos una secuencia de comandos. Dichos archivos son guardados con extensión .m y pueden ser dos tipos:

  • los Scripts son útiles para autorizar un bloque de comandos. Los Scrips operan sobre datos existentes y crean nuevos datos a partir de las operaciones contenidas (y guardados en el espacio de trabajo)
  • Las Funciones son también m-files, pero que tienen el nombre de la función y ejecutan tareas específicas. Si están en el directorio de trabajo, se pueden utilizar como comando de Matlab (built-in-functions).

Los m-files pueden llevar comentarios, esto es bloques de texto que son ignorados por el compilador. Toda línea que comienza con signo de porcentaje (%) es considerada comentarios.

Matlab tiene su propio editor de textos el mismo que cuenta con highlighting y opciones de debbuging.

  • File/New/Script Crea un nuevo m-file en el editor de Matlab.
  • File/Save as … (elegir directorio de trabajo) Guarda el m-file en el directorio de trabajo.
  • alt-cmd-R (F5) Guarda y ejecuta el m-file que esté activo. MAC (WIN).
  • alt-cmd-R (F5) Guarda y ejecuta el m-file que esté activo. MAC (WIN).
  • Ctrl-C Detiene la ejecución del m-file. MAC (WIN).

Comentarios

  1. Una vez que se crea un m-file se abre el editor de Matlab.
  2. El directorio de trabajo es donde se guardan las funciones que se utilizaran en el programa que estén trabajando.
  3. Al ejecutar el m-file por primera vez Matlab preguntara si se desea cambiar la carpeta donde está trabajando Matlab a la carpeta donde se encuentra el m-file.

10.2.       Funciones.

Las funciones son m-files que se guardan con el nombre de la función.

  • Todas aquellas funciones que estén ubicadas en el directorio de trabajo se pueden utilizar como funciones de Matlab.
  • Son buenas prácticas de programación dividir la tarea que queremos realizar en Matlab en tareas simples y asignar una función para cada tarea simple.
  • Las distintas funciones se pueden llamar desde el script principal.

La sintaxis de una función es:

function [output1, output2, …] = nombre_funcion(input1, input2,…)

% Comentario

comandos

end

Ejercicio 10.2.1. Crear un m-file

Se crea un m.-file con la función de nombre fx que evalúa un polinomio de grado 2 y la guarda en el directorio de trabajo (Ilustración 150).

Ilustración 150. función para evaluar un polinomio de segundo grado.

Como se muestra en la ilustración 151 dentro del mismo script se puede ejecutar la función antes creada.

Ilustración 151. Declara la función dentro del mismo script.

El resultado de la función se aprecia en la ventana de comandos (ilustración 152).

Ilustración 152. Resultado de la función evaluada con los datos introducidos al hacer llamar la función, mostrado en la ventana de comandos de Matlab.

Ejercicio 10.2.2. Calcular la media y la desviación estándar de un vector (código en la ilustración 153 y resultado en la ilustración 154).

El nombre de la función que se utiliza para calcular la media y desviación estándar será stat, y se guarda en el directorio de trabajo.

Ilustración 153. Función con el nombre de “stat” para calcular la media y desviación estándar de un vector al azar.
Ilustración 154. Ejecución de la función y despliegue de los resultados en la ventana de comandos de Matlab.

Funciones simples pueden crearse de manera anónima (sin un m-file). Hay dos opciones:

  • Usando el comando inline (código en la ilustración 155 y resultado en la ilustración 156).
Ilustración 155. Definir una función con el comando inline en el editor de Matlab.
Ilustración 156. Función desplegada en la ventana de comandos de Matlab.

Usando el formato @(input) (código en la ilustración 157 y el resultado en la ilustración 158).

Ilustración 157. Emplea la misma función anterior, pero con el comando @input en el editor.
Ilustración 158. Se evalúa la función en el mismo valor 7 obteniendo el mismo valor en la ventana de comandos.

10.3.       Bucles, arreglos y condicionales.

10.3.1.     LOOPS.

Los Loops son bucles que sirven para realizar operaciones de manera repetida. Existen dos tipos de Loops:

  • For Loop: Realiza la misma acción un número determinado de veces. Su sintaxis es como sigue:

for variable = expresión

    Comando 1

    Comando 2

    Comando 3

    …

End

Ejercicio 10.3.1.1. Realizar una suma de matrices empleando el ciclo for y crear una matriz random con el comando rand y una matriz de ceros con el comando zeros de (n,1) (código en la ilustración 159 y resultado de la suma en la ilustración 160).

Ilustración 159. Bucle for para una suma de matrices.
Ilustración 160. Resultado de la suma de matrices aleatorias.
  • While Loop: Realiza la misma acción hasta que una condición se cumpla.

while Condición

    Comando 1

    Comando 2

    Comando3

    …

End

Ejercicio 10.3.1.2. Crear un bucle que divida el valor de nuestra variable mientas ese valor sea mayor a 0.05 (código en la ilustración 161 y resultado en la ilustración 162).

Ilustración 161. Bucle while que analiza si el valor de la variable es mayor al dato de análisis.
Ilustración 162. Datos lanzados por el comando While hasta que se cumple la condición.

Ejercicio 10.3.1.3. Anidar varios loops como se muestra en la ilustración 163.

Ilustración 163. For anidado en el editor de Matlab para crear una matriz.

En la ilustración 164 se puede apreciar como el resultado de anidar los loops se muestra en la ventana de comandos.

Ilustración 164. Matriz del resultado de los for anidados.
  • Es posible utilizar un while loop como un for loop, sólo se necesita definir un contador.

Ejercicio 10.3.1.4. En la ilustración 165 se aprecia el código que se emplea para utilizar el while loop como for loop y en la ilustración 166 el resultado del comando.

Ilustración 165. While loop utilizado como un for de decremento.
Ilustración 166.  Muestreo de valores en la ventana de comandos.

10.3.2.     Condicionales y operadores lógicos.

Sirven para ejecutar un comando si se cumple cierta condición. La sintaxis para condicionales es:

if condicion 1

    comando

elseif condicion 2

    comando

elseif condicion 3

    comando

else

    comando

end

Las condiciones son verificadas de manera secuencial. En cuando se cumple una condición, el comando if ya no continúa con las demás condiciones.

Operadores lógicos

  • < menor a.
  • > mayor a.
  • <= menor o igual a.
  • >= mayor o igual a.
  • == igual a.
  • ~= no es igual a.
  • | o: verdadero si al menos una es verdadera (genera escalar o matriz).
  • || o: verdadero si al menos una es verdadera (genera escalar).
  • & y: verdadero si todas son verdaderas (genera escalar o matriz).
  • && y: verdadero si todas son verdaderas (genera escalar).
  • ~ negativo.
  • any verdadero si algún elemento es no nulo.
  • all verdadero si todos los elementos no nulos.
  • find encuentra índices de valor no nulos en una matriz.
  • isnan detecta valores NaN en una matriz.
  • isempty detecta si es una matriz vacía.

Ejercicio 10.3.2.1. Condicionales en un if para darle valores a la variable “n” (código mostrado en la ilustración 167 y resultado en la ilustración 168).

Ilustración 167. Grupo de condiciones para otorgarle un valor a la variable n que inicia en 0.
Ilustración 168. Resultado del análisis de las conficiones en el if.

Otro ejemplo es utilizar el valor de la variable para utilizar ese dato como parte de las condiciones del if y elseif (ilustración 169).

Ilustración 169. Se crea una variable con un dato aleatorio para emplear las condicionales.

Al ejecutar el comando como lo indica la ilustración 170 en la ventana de comandos se aprecia el resultado.

Ilustración 170. Dato aleatorio de la variable y resultado de las condiciones empleadas en el editor de Matlab.
  • En un condicional es mejor utilizar && y || para asegurarnos que la respuesta es un escalar. Si utilizamos & y | y la respuesta es una matriz, solamente si la condición se cumple para todos los elementos se ejecuta el comando indicado.
  • Matrices lógicas: dummy = (condición) genera una matriz de dummies si se cumple la condición.
  • Referenciación: A(condición) genera una matriz con los elementos de A que cumplen la condición.
  • Los condicionales if pueden estar anidados entre sí y anidados dentro Loops.

Ejercicio 10.3.2.2. Utilizar matrices lógicas ( código en la ilustración 171 y resultado mostrado en la ilustración 172).

Ilustración 171. Comando dummy para conocer si la matriz A es mayor que la matriz B.
Ilustración 172. En el editor de Matlab únicamente cuando la matriz A presenta valores más grandes se genera una nueva matriz, de otro modo elimina los demás datos.

10.3.3.     Switch-Case.

switch (switch_expression), case (case_expression), end evalúa una expresión y elige ejecutar uno de varios grupos de instrucciones. Cada elección es un caso.

El bloque switch prueba cada caso hasta que una de las expresiones de caso sea verdadera. Un caso es verdadero cuando:

  • Para los números, case_expression == switch_expression.
  • Para los vectores de caracteres, strcmp(case_expression,switch_expression) == 1.
  • Para los objetos compatibles con la función eq, case_expression == switch_expression. La salida de la función eq sobrecargada debe ser un valor lógico o convertible a un valor lógico.
  • Para un arreglo de celdas case_expression, al menos uno de los elementos del arreglo de celdas coincide con switch_expression, como se definió anteriormente para números, vectores de caracteres y objetos.

Cuando una expresión de caso es verdadera, Matlab ejecuta las instrucciones correspondientes y sale del bloque switch.

Una switch_expression evaluada debe ser un escalar o un vector de caracteres.

Una case_expression evaluada debe ser un escalar, un vector de caracteres o un arreglo de celdas de escalares o vectores de caracteres.

El bloque otherwise es opcional. Matlab ejecuta las instrucciones solo cuando ningún caso es verdadero.

Ejercicio 10.3.3.1. Mostar un texto diferente de forma condicional, en función de un valor introducido en la línea de comandos es posible, como se aprecia en la ilustración 173.

Ilustración 173. En el editor de comandos se establecen los casos si se digitan números -1,0 y 1 de no ser así proyecta otro mensaje.

Cada que un caso sea ejecutado se despliega en la ventana de comandos como lo muestran las ilustraciones 174, 175, 176 y 177 que representan al caso 1, 0, -1 y otro respectivamente.

Ilustración 174. Se ejecuta el caso donde se digito el 1 positivo en la ventana de comandos de Matlab.
Ilustración 175. Se ejecuta el caso donde se digitó el 0 en la ventana de comandos de Matlab.
Ilustración 176. Se ejecuta el caso donde se digitó el -1 en la ventana de comandos de Matlab.
Ilustración 177. Se ejecuta un valor que no está dentro de los casos del switch entra el otherwise.

Ejercicio 10.3.3.2. Determine qué tipo de gráfica se debe crear en función del valor de plottype. Si plottype es ‘pie’ o ‘pie3’, cree una gráfica circular en 3D. Utilice un arreglo de celdas para contener ambos valores, el código se muestra en la ilustración 178 y el resultado de la gráfica en la ilustración 179.

Ilustración 178. Utilización del switch para mostrar una gráfica en función de los casos establecidos.
Ilustración 179.Al presentarse el caso se genera una gráfica de pastel.

Una case_expression no puede incluir operadores relacionales como < o > para la comparación con switch_expression. Para comprobar la desigualdad, utilice las instrucciones if, elseif, else.

La instrucción switch de Matlab no se pierde como una instrucción switch en lenguaje C. Si la primera instrucción case es true, Matlab no ejecuta las demás instrucciones case. Por ejemplo:

Se crea una variable de tipo numérica con valor de 48 como se muestra en la ilustración 180.

Ilustración 180. Cuando la primera instrucción en Matlab sea verdadera no ejecuta los demás casos.

Matlab evalúa caso por caso dentro de un switch de manera descendente, es por eso que en el momento que un caso resulte ser verdadero desprecia los demás casos y muestra en la ventana de comandos el resultado del caso al que se le dio veracidad en primera instancia como es de apreciar en la ilustración 181.

Ilustración 181. Al ejecutar el código, el primer caso resulta verdadero y no ejecuta los demás casos dentro del switch.
Publica un comentario

Deja un comentario