Mauricio Tejada
ILADES - Universidad Alberto Hurtado
Agosto 2017
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 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:
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:
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
@(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!!
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).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
Los Loops son bucles que sirven para realizar operaciones de manera repetida. Existen dos tipos de Loops:
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 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:
for i=10:-1:1
.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
iter = 1;
while iter < 5
disp(iter)
iter = iter +1;
end
1 2 3 4
pause
para introducir una pausa en cada iteración del Loop, el procedimiento continuará cuando cualquier tecla del teclado sea presionada.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:
&&
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.dummy = (condicion)
genera una matriz de dummies si se cumple la condición.A(condicion)
genera una matriz con los elementos de A
que cumplen la condición.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