Programación · Lenguajes de programación
Tutorial de MATLAB para principiantes
Respuesta corta
MATLAB es un lenguaje y entorno de cálculo numérico de MathWorks en el que todo valor es una matriz. Escribes A * B para un producto de matrices, A .* B para una multiplicación elemento a elemento, indexas desde 1 y sustituyes muchos bucles por expresiones vectorizadas. Incluye gráficos y un amplio conjunto de toolboxes para ingeniería y ciencia. GNU Octave es una alternativa gratuita y de código abierto que ejecuta sin cambios la mayor parte del código básico de MATLAB.
Qué es MATLAB y quién lo usa
MATLAB («matrix laboratory») empezó como una herramienta de Cleve Moler para acceder fácilmente a bibliotecas de álgebra lineal y se convirtió en un producto comercial de MathWorks. Combina un lenguaje, un escritorio interactivo, gráficos y toolboxes para procesamiento de señales, sistemas de control, optimización, estadística, procesamiento de imágenes y aprendizaje automático. Simulink, un producto complementario, modela sistemas dinámicos con diagramas de bloques.
MATLAB se usa mucho en cursos de ingeniería y ciencias, laboratorios de investigación e industrias como la automoción, la aeroespacial y las finanzas. Requiere una licencia de pago (muchas universidades ofrecen una). GNU Octave es software libre con una sintaxis en gran parte compatible; cubre el lenguaje básico y muchas funciones, pero no las toolboxes de MathWorks ni Simulink.
Instala y ejecuta Hello, world
Instala MATLAB desde MathWorks, usa MATLAB Online en el navegador o instala GNU Octave desde octave.org (Windows, macOS, Linux). El código se guarda en archivos .m. Un script es un archivo de comandos; lo ejecutas escribiendo su nombre, sin .m, en la ventana de comandos.
% hello.m
disp('Hello, world!')matlab -batch "hello" # MATLAB from a terminal
octave hello.m # GNU Octave
# Hello, world!Los comentarios empiezan con %. Una línea que termina sin punto y coma muestra su resultado, así que x = 5 muestra x = 5, mientras que x = 5; no muestra nada.
Variables y tipos básicos
Las variables se crean por asignación y no necesitan declaración. Los números son double (punto flotante de 64 bits) por defecto, e incluso un solo número es una matriz de 1 por 1.
| Tipo | Ejemplo | Notas |
|---|---|---|
| double | x = 3.14 | El tipo numérico por defecto |
| tipos enteros | n = int32(42) | int8 a int64, uint8 a uint64; la aritmética satura |
| logical | ok = true | Resultado de comparaciones como x > 2 |
| arreglo de caracteres (char) | name = 'Ana' | Comillas simples; un vector fila de caracteres |
| string | s = "Ana" | Objeto string de MATLAB; Octave trata las comillas dobles como un arreglo de caracteres |
| arreglo de celdas (cell) | c = {'Ana', 30} | Contiene valores de distintos tipos |
| struct | p.name = 'Ana' | Campos con nombre |
x = 10;
y = 3;
x / y % 3.3333
mod(x, y) % 1
x ^ 2 % 100
name = 'Ana';
fprintf('%s is %d years old\n', name, 30)
% Ana is 30 years old
class(x) % 'double'Vectores y matrices
Los corchetes construyen arreglos: los espacios o las comas separan columnas y los puntos y comas separan filas. La indexación usa paréntesis y empieza en 1; end significa el último índice y : significa «todos».
v = [3 1 4 1 5];
v(1) % 3
v(end) % 5
v(2:4) % [1 4 1]
v * 2 % [6 2 8 2 10]
v(v > 2) % [3 4 5] logical indexing
A = [1 2; 3 4];
A(2, :) % second row: [3 4]
A' % transpose: [1 3; 2 4]
A * A % matrix product: [7 10; 15 22]
A .* A % element-wise: [1 4; 9 16]
b = [5; 11];
x = A \ b % solves A*x = b: [1; 2]
z = zeros(2, 3); % also ones, eye, rand
r = 0:0.25:1; % [0 0.25 0.5 0.75 1]Los operadores con punto (.*, ./, .^) trabajan elemento a elemento; sin el punto siguen las reglas del álgebra lineal. El operador barra invertida resuelve sistemas lineales y es más preciso que calcular inv(A) * b.
Control de flujo
score = 85;
if score >= 90
disp('A')
elseif score >= 80
disp('B')
else
disp('C')
end
total = 0;
for k = 1:10
total = total + k;
end
fprintf('total = %d\n', total) % total = 55
n = 3;
while n > 0
n = n - 1;
end
switch 'red'
case {'red', 'green'}
disp('a color')
otherwise
disp('unknown')
endCada bloque termina con end. Muchos bucles pueden sustituirse por una expresión vectorizada: el bucle anterior equivale a sum(1:10), que es más corto y normalmente más rápido. Si tienes que construir un arreglo dentro de un bucle, resérvalo antes, por ejemplo result = zeros(1, 1000);.
Funciones y funciones anónimas
Una función vive en su propio archivo, cuyo nombre coincide con el de la función. Una función puede devolver varias salidas. En las versiones recientes de MATLAB, los scripts también pueden contener funciones locales al final del archivo.
% stats.m
function [m, s] = stats(x)
%STATS Mean and sample standard deviation of a vector.
m = mean(x);
s = std(x);
end[m, s] = stats([2 4 4 5 7]) % m = 4.4000, s = 1.8166
[biggest, where] = max([3 9 2]) % biggest = 9, where = 2
f = @(x) x.^2 + 1; % anonymous function
f(3) % 10
f([1 2 3]) % [2 5 10]
fzero(@(x) x.^2 - 2, 1) % 1.4142, a root near 1
integral(f, 0, 1) % 1.3333Las funciones anónimas, creadas con @, se pasan a menudo a otras funciones como fzero, integral, arrayfun o rutinas de optimización. Escríbelas con operadores elemento a elemento (.^) para que también funcionen con vectores.
Structs y arreglos de celdas
person.name = 'Ana';
person.age = 30;
fprintf('%s is %d\n', person.name, person.age) % Ana is 30
c = {'Ana', 30, [1 2 3]}; % cell array with mixed types
c{2} % 30 (curly braces get the content)
class(c(2)) % 'cell' (parentheses get a sub-cell)
names = {'Ana', 'Ben', 'Cleo'};
numel(names) % 3
upper(names{1}) % 'ANA'MATLAB también tiene un tipo table para datos orientados a columnas con variables con nombre, parecido a una hoja de cálculo; readtable carga en él archivos CSV y Excel.
Manejo de errores
Lanza un error con error, opcionalmente con un identificador como 'demo:negative', y trátalo con try ... catch. El objeto capturado (una MException en MATLAB) tiene los campos identifier y message.
% safe_sqrt.m
function r = safe_sqrt(x)
if x < 0
error('demo:negative', 'Input must be non-negative, got %g', x);
end
r = sqrt(x);
endtry
safe_sqrt(-4);
catch err
fprintf('%s: %s\n', err.identifier, err.message)
end
% demo:negative: Input must be non-negative, got -4Usa warning(...) para problemas que no deben detener el programa. Sin la comprobación, sqrt(-4) no fallaría en absoluto: devuelve el número complejo 0 + 2i.
Un programa pequeño y completo: analizar y graficar datos
% temps.m - analyze a week of temperatures
temps = [21.5 23.0 19.8 25.1 24.3 18.9 22.7];
days = 1:numel(temps);
avg = mean(temps);
[hottest, idx] = max(temps);
above = days(temps > avg);
fprintf('Average: %.2f\n', avg)
fprintf('Hottest: %.1f on day %d\n', hottest, idx)
fprintf('Days above average: %s\n', mat2str(above))
plot(days, temps, '-o')
hold on
plot(days, avg * ones(size(days)), '--')
xlabel('Day'); ylabel('Temperature (C)')
title('Temperatures this week')
legend('Daily', 'Average')
% Average: 22.19
% Hottest: 25.1 on day 4
% Days above average: [2 4 5 7]El script usa indexación lógica para encontrar los días por encima del promedio sin un bucle y después dibuja un gráfico de líneas con marcadores y una línea discontinua para el promedio. El mismo código se ejecuta en GNU Octave.
Adónde ir después
- La documentación de MATLAB de MathWorks, empezando por las páginas de introducción.
- MATLAB Onramp, el curso introductorio interactivo y gratuito de MathWorks.
- El manual de GNU Octave si usas Octave, incluidas sus notas sobre la compatibilidad con MATLAB.
- Aprende después la vectorización,
readtablepara archivos de datos y las funciones de graficación.
Preguntas frecuentes
¿Existe una versión gratuita de MATLAB?
MATLAB necesita una licencia, aunque MathWorks ofrece pruebas y muchas universidades proporcionan licencias de campus. GNU Octave es un programa gratuito y de código abierto que ejecuta la mayor parte del código básico de MATLAB.
¿Cuál es la diferencia entre * y .* en MATLAB?
* es la multiplicación de matrices del álgebra lineal, que exige que coincidan las dimensiones interiores. .* multiplica los elementos correspondientes de dos arreglos del mismo tamaño.
¿GNU Octave es totalmente compatible con MATLAB?
No del todo. La sintaxis básica, las matrices, las funciones y los gráficos son en gran parte compatibles, pero Octave carece de las toolboxes de MathWorks, de Simulink y de algunas funciones recientes de MATLAB, y acepta algunas formas de sintaxis adicionales propias.
¿Por qué MATLAB empieza a indexar en 1?
MATLAB sigue la notación matemática, en la que el primer elemento de un vector o matriz es el elemento 1. Fortran, R y Julia usan la misma convención.
¿Debería aprender MATLAB o Python?
Aprende MATLAB si tu curso, laboratorio o empresa lo usa, sobre todo con Simulink o toolboxes concretas. Python con NumPy, SciPy y Matplotlib es gratuito y de propósito más general, y los conceptos se trasladan de uno a otro.