Introducción a la Programación en MATLAB (C7)

Mauricio Tejada

ILADES - Universidad Alberto Hurtado

Agosto 2017

7. Programar en MATLAB

7.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 de dos tipos:

  • Los Scripts son útiles para automatizar un bloque de comandos. Los Scripts 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 comandos de Matlab (built-in-functions).

Los m−files (scripts y funciones) puede llevar comentarios, esto es bloques de texto que son ignorados por el compilador. Toda línea que empieza con signo de porcentaje (%) es considerada comentarios.

Nota: En Funciones, las primeras líneas que llevan % son consideradas la documentación (help) de la función.

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).
  • fn-SHIFT-F7 (F9) Ejecuta un bloque de comandos del 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 se utilizaran en el programa que estén trabajando.
  3. Al ejecutar el m-file por primera vez, Matlab preguntará si se desea cambiar la carpeta actual donde está trabajando Matlab a la carpeta donde se encuentra el m-file. Acepte. (Esto ocurre sólo si no se cambió el directorio de trabajo previamente).

7.2 Funciones

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

  • Las funciones ubicadas en el directorio de trabajo se pueden utilizar como funciones de Matlab.

  • Es una buena práctica dividir la tarea que queremos realizar con Matlab en tareas simples y asignar una función para cada tarea simple.

  • Son muy útiles para procedimiento repetidos.

  • Las distintas funciones se pueden llamar desde el script (m-file) principal.

La sintaxis de una función es:

function [output1, output2, ...] = nombre_funcion(input1, input2,...) 
% Comentario

comandos

end

Ejemplo 1: Crear un m-file con la función de nombre fx que evalúa un polinomio de grado 2 y guardarla en el directorio de trabajo.

function out = fx(x)
% FX Evalúa un polinomio de segundo grado. Función aplica sólo a escalares.
%    Uso:     
%    val = fx(x)

out = 2*x^2 + 3*x - 5;

end
In [1]:
pwd
ans =

    '/Users/mauriciotejada/Dropbox/MT/Teaching/MAE - Matlab/Nootebooks'
In [2]:
f1 = fx(4)
f2 = fx(1)
f1 =

    39


f2 =

     0

Ejemplo 2: Crear un m-file con la función de nombre stat, que calcula la media y la desviación estándar de un vector, y guardarla en el directorio de trabajo.

function [mean, stdev] = stat(x)
% STAT Calcula la media y la desviación estándar de un vector x.
%      uso:
%      [mean, stdev] = stat(x) 

n     = length(x);
mean  = sum(x)/n;
stdev = sqrt(sum(x.^2)/n - mean^2);

end
In [3]:
xvec = 50+4*randn(100,1);

[media, desv] = stat(xvec)
media =

   50.4923


desv =

    4.6263

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

  • Usando el comando inline
In [4]:
fx2 = inline('2*x^2 + 3*x - 5');
argnames(fx2)
formula(fx2)


fx2(5)
ans =

  cell

    'x'


ans =

    '2*x^2 + 3*x - 5'


ans =

    60
  • Usando el formato @(input):
In [5]:
fx3 = @(x) 2*x^2 + 3*x - 5

out3 = fx3(5)
fx3 =

  function_handle with value:

    @(x)2*x^2+3*x-5


out3 =

    60

Nota Importante!!

  • Las funciones creadas en un m-file cuentan únicamente con la información provista como input y todas las variables creadas al interior de la función son variables locales (esto es, sólo existen dentro de la función).
  • Los argumentos (inputs) de una función pueden contener strings, matrices, vectores, escalares, y funciones.

Ejemplo 3: Crear un m-file con la función de nombre fxalt que evalúa un polinomio de grado 2 y guardarla en el directorio de trabajo.

function out = fxalt(params,x)
% FX Evalúa un polinomio de segundo grado.
%    Uso:     
%    val = fxalt(params,x)
%    params: vector 3 x 1 de parámetros.

a = param(1);
b = param(2);
c = param(3);

out = a*x^2 + b*x + c;

end
In [6]:
pa = 3;
pb = 3;
pc = -5;

p = [pa; pb; pc]
x = 4

val = fxalt(p,x);
disp(val)
p =

     3
     3
    -5


x =

     4

    55

Una forma de transformar la función fxalt para que sólo dependa del argumento x es usar una función anónima.

In [7]:
pa = 2;
pb = 3;
pc = -5;

p = [pa; pb; pc];

fx4 = @(x) fxalt(p,x);

fx4(4)
ans =

    39

7.3 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
Ejemplo:
In [8]:
n = 6;
x = rand(n,1)
sumx   = zeros(n, 1);
sumx(1)= x(1); 

for i = 2:n
    sumx(i) = sumx(i-1)+x(i);
end

sumx
x =

    0.7943
    0.3112
    0.5285
    0.1656
    0.6020
    0.2630


sumx =

    0.7943
    1.1055
    1.6340
    1.7997
    2.4017
    2.6646
  • While Loop: Realiza la misma acción hasta que una condición se cumpla.
while Condición

    Comando 1
    Comando 2
    Comando3
    ...
end
Ejemplo:
In [9]:
delta = 1;

while (delta) > 0.05
    delta = delta/2;
    disp(delta);
end
0.5000

    0.2500

    0.1250

    0.0625

    0.0312

Comentarios:

  • MATLAB es MUY ineficiente al utilizar loops. Es mucho más eficiente realizar la misma tarea con matrices (operaciones vectorizadas).
  • Un for loop puede comportarse de forma descendente: for i=10:-1:1.
  • Podemos anidar varios loops. Por ejemplo:
In [10]:
m = 3;
n = 2;
H = zeros(m,n);

for i = 1:m
    for j = 1:n 
        H(i, j) = 1/(i+j-1);
    end
end

H
H =

    1.0000    0.5000
    0.5000    0.3333
    0.3333    0.2500
  • Podemos utilizar un while loop como un for loop, sólo se necesita definir un contador. Por ejemplo:
In [11]:
iter = 1;

while iter < 5 
    disp(iter)
    iter = iter +1;
end
1

     2

     3

     4
  • Es posible usar el comando pause para introducir una pausa en cada iteración del Loop, el procedimiento continuará cuando cualquier tecla del teclado sea presionada.

7.4 Condicionales y Operadores Lógicos

Los condicionales 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.

Ejemplo:

In [12]:
n = 0; 

if -1 > 0 
    n = 1;
elseif 2 > 0 
    n = 2;
elseif 3 > 0
    n = 3; 
else
    n = 4;
end

disp(n)
2

Otro ejemplo:

In [13]:
A = randn(1)

if A>0
    disp('A es positivo');
elseif A==0
    disp('A es cero');
else
    disp('A es negativo');
end;
A =

    0.4900

A es positivo

Comentarios:

  • 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 = (condicion) genera una matriz de dummies si se cumple la condición.
  • Referenciación: A(condicion) genera una matriz con los elementos de A que cumplen la condición.
  • Los condicionales if pueden estar anidados entre si y anidados dentro Loops.

Ejemplo del uso de matrices lógicas:

In [ ]:
A = [1 4 7 2 8 5 2 7 9]'; 
 B = [2 5 1 4 8 0 3 4 3]';
 
 dummy = A>B

Ejemplo de referenciación:

In [15]:
F = [A B]

subF1 = F(A>B,:) % Alternativa 1
F =

     1     2
     4     5
     7     1
     2     4
     8     8
     5     0
     2     3
     7     4
     9     3


subF1 =

     7     1
     5     0
     7     4
     9     3
In [16]:
subF2 = F(F(:,1)>F(:,2),:) % Alternativa 2
subF2 =

     7     1
     5     0
     7     4
     9     3