Programar en Matlab
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).
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
pwd
ans =
'/Users/mauriciotejada/Dropbox/MT/Teaching/MAE - Matlab/Nootebooks'
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
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
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)
:
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
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.
pa = 2;
pb = 3;
pc = -5;
p = [pa; pb; pc];
fx4 = @(x) fxalt(p,x);
fx4(4)
ans =
39
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:
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:
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:
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:
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.
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)~
negativoany
verdadero si algún elemento es no nuloall
verdadero si todos los elementos no nulosfind
encuentra índices de valor no nulos en una matrizisnan
detecta valores NaN en una matrizisempty
detecta si es una matriz vacía.
Ejemplo:
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:
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 deA
que cumplen la condición. - Los condicionales
if
pueden estar anidados entre si y anidados dentro Loops.
Ejemplo del uso de matrices lógicas:
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:
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
subF2 = F(F(:,1)>F(:,2),:) % Alternativa 2
subF2 =
7 1
5 0
7 4
9 3