← MATLAB EspañolChapter 13 of 13

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 →