Mejores Practicas
## Objetivos de Aprendizaje
- Escribir codigo MATLAB eficiente
- Aplicar tecnicas de vectorizacion
- Seguir estandares de codificacion
- Optimizar el rendimiento
## Estilo de Codigo
### Estructura de Codigo Clara
```matlab
% Bien: Espaciado y organizacion claros
function result = calculateStatistics(data, options)
% Validar entradas
validateInputs(data);
% Procesar datos
processed = preprocess(data, options);
% Calcular estadisticas
result = computeStats(processed);
end
% Mal: Todo el codigo junto
function r=c(d,o)
v(d);p=p(d,o);r=c(p);end
```
### Nombres Significativos
```matlab
% Bien: Nombres descriptivos
velocityData = readData('velocity.csv');
maximumValue = max(velocityData);
% Mal: Nombres cortos/poco claros
v = readData('v.csv');
m = max(v);
```
### Indentacion Consistente
```matlab
% Usar 4 espacios (o tab) para indentacion
for i = 1:10
for j = 1:10
if i == j
matrix(i, j) = 1;
end
end
end
```
## Vectorizacion
### Reemplazar Bucles con Operaciones Vectoriales
```matlab
% Mal: Bucle
result = zeros(1, length(x));
for i = 1:length(x)
result(i) = sin(x(i)) * cos(x(i));
end
% Bien: Vectorizado
result = sin(x) .* cos(x);
```
### Indexacion Logica
```matlab
% Encontrar elementos que cumplen condicion
data = rand(1000, 1);
% Mal: Bucle
high = [];
for i = 1:length(data)
if data(i) > 0.9
high = [high, data(i)];
end
end
% Bien: Indexacion logica
high = data(data > 0.9);
```
### Difusion
```matlab
% Sumar vector fila a cada fila de matriz
A = rand(100, 10);
v = 1:10;
% Mal: Bucle
B = zeros(size(A));
for i = 1:100
B(i, :) = A(i, :) + v;
end
% Bien: Difusion
B = A + v;
```
### Funciones de Arreglos
```matlab
% En lugar de bucles, usar:
% - arrayfun: aplicar funcion a cada elemento
% - cellfun: aplicar funcion a cada celda
% - accumarray: agregar por grupos
data = 1:100;
squares = arrayfun(@(x) x^2, data);
% accumarray para agrupar
id = randi(5, 100, 1);
vals = rand(100, 1);
sums = accumarray(id, vals, [], @sum);
```
## Preasignacion
### Preasignar Arreglos
```matlab
n = 10000;
% Mal: Arreglo que crece
result = [];
for i = 1:n
result = [result, i^2];
end
% Bien: Preasignar
result = zeros(1, n);
for i = 1:n
result(i) = i^2;
end
% Mejor: Vectorizado
result = (1:n).^2;
```
### Preasignar Arreglos de Celdas
```matlab
% Mal
c = {};
for i = 1:100
c{end+1} = process(i);
end
% Bien
c = cell(1, 100);
for i = 1:100
c{i} = process(i);
end
```
## Eficiencia de Memoria
### Usar Tipos Apropiados
```matlab
% No usar double para enteros pequenos
img = uint8(imread('image.png')); % 1 byte por pixel
img = double(imread('image.png')); % 8 bytes por pixel
% Usar single para arreglos grandes si la precision lo permite
largeArray = single(rand(10000));
```
### Limpiar Variables Grandes
```matlab
largeData = rand(10000);
clear largeData
% O reutilizar variable
largeData(:) = newData;
```
### Archivos Mapeados en Memoria
```matlab
% Para archivos muy grandes
m = memmapfile('largefile.dat', 'Format', 'double');
m.Data(1:100)
```
## Medicion de Rendimiento
### Funciones de Tiempo
```matlab
% tic/toc para medicion rapida
tic
result = myFunction(data);
elapsed = toc;
% timeit para medicion precisa de funciones
f = @() myFunction(data);
t = timeit(f);
```
### Perfilado
```matlab
% Iniciar perfilador
profile on
% Ejecutar codigo
myScript
% Ver resultados
profile viewer
% O en ventana de comandos
profview
```
### Perfilado de Memoria
```matlab
% Verificar uso de memoria
memory
% Perfilado de memoria
profile('memory', 'on')
```
## Validacion de Entrada
### Validar Entradas de Funciones
```matlab
function result = processData(data, varargin)
% Validar entrada requerida
if ~isnumeric(data)
error('La entrada debe ser numerica');
end
if ~isvector(data)
error('La entrada debe ser un vector');
end
% Validar usando validateattributes
validateattributes(data, {'numeric'}, {'finite', 'real'});
end
```
### parseargs para Parametros Opcionales
```matlab
function result = func(x, varargin)
p = inputParser;
p.addOptional('alpha', 0.5, @isnumeric);
p.addOptional('maxIter', 100, @(x) x>0 && isscalar(x));
p.addParameter('verbose', false, @islogical);
p.parse(varargin{:});
opts = p.Results;
end
```
## Manejo de Errores
### Mensajes de Error Significativos
```matlab
% Mal
if x < 0
error('Invalido');
end
% Bien
if x < 0
error('x debe ser no negativo. Se recibio x = %g', x);
end
```
### Usar Advertencias
```matlab
if x < 0
warning('x es negativo, usando valor absoluto');
x = abs(x);
end
```
## Documentacion
### Documentacion de Funciones
```matlab
function result = myFunction(arg1, arg2)
%MYFUNCTION Descripcion breve
% Descripcion detallada de lo que hace la funcion.
%
% Entradas:
% arg1 - Descripcion del primer argumento
% arg2 - Descripcion del segundo argumento
%
% Salidas:
% result - Descripcion del valor de retorno
%
% Ejemplo:
% result = myFunction(1, 2);
%
% Ver tambien OTRAFUNCION
% Implementacion de la funcion
end
```
### Comentarios en Linea
```matlab
% Calcular distancia desde el origen
distance = sqrt(x^2 + y^2);
% Normalizar por total (porcentajes)
normalized = distance / sum(distance) * 100;
```
## Pruebas
### Escribir Funciones de Prueba
```matlab
function testMyFunction
% Probar caso basico
assert(myFunction(2, 3) == 6);
% Probar caso borde
assert(myFunction(0, 5) == 0);
% Probar con tolerancia para punto flotante
assert(abs(myFunction(sqrt(2), sqrt(2)) - 2) < 1e-10);
% Probar caso de error
try
myFunction(-1, 1);
error('Debio haber lanzado error');
catch ME
% Error esperado
end
end
```
## Integracion con Control de Versiones
### Encabezados de Funciones para Git
```matlab
function result = myFunction(data)
%MYFUNCTION Descripcion breve
%
% TODO: Agregar validacion de parametros
% FIXME: Manejar entrada vacia
% DATE: 2024-01-15
% VERSION: 1.2
% Autor: Tu Nombre
% Cambio: Agregada caracteristica X
end
```
## Errores Comunes
### Comparacion de Punto Flotante
```matlab
% Mal
if a == b
disp('Igual');
end
% Bien: Usar tolerancia
tol = 1e-10;
if abs(a - b) < tol
disp('Aproximadamente igual');
end
% O usar isequaln para manejo de NaN
if isequaln(a, b)
disp('Igual');
end
```
### Dimensiones de Matrices
```matlab
% Asegurar compatibilidad de dimensiones
A = rand(10, 5);
B = rand(5, 1);
% Verificar tamanos antes de operacion
if size(A, 2) == size(B, 1)
C = A * B;
else
error('Las dimensiones de las matrices deben coincidir');
end
```
### Evitar Variables Globales
```matlab
% Mal: Variable global
global DATA;
DATA = loadData();
% Bien: Pasar como argumento
function result = processData(DATA)
result = analyze(DATA);
end
```
## Resumen
- Usar nombres de variables significativos y formato consistente
- Vectorizar siempre que sea posible en lugar de usar bucles
- Preasignar arreglos antes de llenarlos
- Validar entradas para detectar errores temprano
- Escribir mensajes de error claros
- Documentar funciones con texto de ayuda
- Escribir pruebas para verificar correctitud
- Usar `tic/toc` y `profile` para analisis de rendimiento
- Evitar variables globales; pasar datos como argumentos
- Usar tolerancias para comparaciones de punto flotante
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →