← MATLAB EspañolChapter 10 of 13

Patrones de Programacion

## Objetivos de Aprendizaje - Aplicar patrones de programacion en MATLAB - Depurar codigo efectivamente - Manejar errores apropiadamente - Escribir codigo mantenible ## Organizacion del Codigo ### Scripts vs Funciones ```matlab % Script: comandos en secuencia % Usar para: procesamiento de datos, analisis rapido % Las variables persisten en el espacio de trabajo a = 10; b = 20; c = a + b; disp(c); % Funcion: reutilizable, alcance aislado % Usar para: codigo reutilizable, algoritmos function result = add(a, b) result = a + b; end ``` ### Organizacion de Proyectos ```text myproject/ main.m % Punto de entrada functions/ processData.m % Procesamiento de datos visualize.m % Funciones de graficacion utils/ helper.m % Funciones utilitarias config/ settings.m % Configuracion ``` ## Depuracion ### Modo de Depuracion ```matlab % Establecer puntos de interrupcion % Hacer clic en el numero de linea o usar: dbstop in functionName at lineNumber % Ejecutar en modo de depuracion myFunction(input) % Recorrer dbstep % Ejecutar siguiente linea dbstep in % Entrar en funcion dbstep out % Salir de funcion % Inspeccionar variables whos % Listar variables del espacio de trabajo disp(variable) % Mostrar valor % Reanudar y salir dbcont % Continuar ejecucion dbquit % Salir del modo de depuracion ``` ### Opciones de dbstop ```matlab dbstop in functionName % Detener en entrada de funcion dbstop in functionName at line % Detener en linea especifica dbstop if error % Detener en error dbstop if warning % Detener en advertencia dbstop if naninf % Detener en NaN o Inf ``` ### Depuracion con Print ```matlab % Mostrar valores de variables x = 10; fprintf('x = %d\n', x); % Salida de depuracion condicional DEBUG = true; if DEBUG disp('Debug: entrando al bucle'); end % Usando keyboard function process() % ... keyboard; % Pausa ejecucion, vuelve al prompt % Escribir 'return' para continuar % Escribir 'dbquit' para salir end ``` ## Manejo de Errores ### try-catch ```matlab try result = riskyOperation(); catch ME disp('Ocurrio un error:'); disp(ME.message); end ``` ### Informacion Detallada de Error ```matlab try x = 10 / 0; catch ME disp(['Identificador: ', ME.identifier]); disp(['Mensaje: ', ME.message]); disp(['Linea: ', num2str(ME.stack(1).line)]); disp(['Funcion: ', ME.stack(1).name]); end ``` ### Rethrow ```matlab try x = notAFunction(); catch ME disp('Manejo de error personalizado'); rethrow(ME); % Volver a lanzar con informacion original end ``` ### lastwarn y lasterr ```matlab % Capturar advertencias lastwarn(''); % Limpiar x = sqrt(-1); [msg, id] = lastwarn; % Capturar errores lasterr % Ultimo mensaje de error ``` ## Ejecucion Condicional ### Verificando Entradas ```matlab function result = processData(data, varargin) % Validar entrada requerida if ~isnumeric(data) error('Los datos deben ser numericos'); end % Parsear parametros opcionales p = inputParser; p.addOptional('verbose', false, @islogical); p.addOptional('maxIter', 100, @isnumeric); p.parse(varargin{:}); opts = p.Results; end ``` ### Validacion de Entrada ```matlab function y = compute(x) % Validar tipo validateattributes(x, {'numeric'}, {'finite'}); % Multiples condiciones validateattributes(x, {'numeric'}, {'positive', 'finite', 'nonnan'}); % Validacion personalizada if x < 0 error('x debe ser no negativo'); end end ``` ## Calidad del Codigo ### Convenciones de Nombres ```matlab % Variables: minusculas con guiones bajos (opcional) iteration_count = 0; totalSum = 0; % Constantes: MAYUSCULAS MAX_ITERATIONS = 100; PI = 3.14159; % Funciones: camelCase o snake_case function output = calculateArea(radius) output = pi * radius^2; end % Clases: PascalCase (si se usa POO) classdef MyClass properties Data end end ``` ### Comentarios ```matlab %{ Bloque de comentario de multiples lineas para explicaciones mas largas %} % Comentarios de una linea para: % - Encabezados de funciones % - Calculos complejos % - Elementos TODO % TODO: Agregar manejo de errores % FIXME: Manejar valores negativos % NOTE: Este algoritmo es O(n^2) ``` ## Patrones de Vectorizacion ### Reemplazar Bucles con Operaciones Vectoriales ```matlab % Lento: Bucle result = zeros(1, 1000); for i = 1:1000 result(i) = sin(i) * cos(i); end % Rapido: Vectorizado x = 1:1000; result = sin(x) .* cos(x); ``` ### Indexacion Logica ```matlab % Encontrar y reemplazar A = [1, 2, 3, 4, 5]; A(A > 3) = 10; % A = [1, 2, 3, 10, 10] % Asignacion condicional B = zeros(size(A)); B(A > 2 & A < 5) = A(A > 2 & A < 5); ``` ### Accumarray ```matlab % Agrupar y agregar id = [1, 1, 2, 2, 2, 3]; val = [10, 20, 30, 40, 50, 60]; result = accumarray(id(:), val(:), [], @sum); % result = [30; 120; 60] ``` ## Consejos de Rendimiento ### Preasignacion ```matlab % Mal: Arreglo que crece result = []; for i = 1:1000 result = [result, i^2]; % Lento! end % Bien: Preasignar result = zeros(1, 1000); for i = 1:1000 result(i) = i^2; end % Mejor: Vectorizado result = (1:1000).^2; ``` ### Eficiencia de Memoria ```matlab % Usar tipos apropiados a = int8(10); % 1 byte vs 8 bytes para double % Limpiar variables grandes cuando se terminen largeArray = rand(10000); clear largeArray; % Reutilizar memoria x = zeros(1000); % Preasignar x(:) = newData; % Llenar sin nueva asignacion ``` ### Perfilado ```matlab % Perfilado de ejecucion de codigo profile on % ... tu codigo ... profile viewer % Verificar tiempo tic % ... codigo ... elapsed = toc; % Usar timeit para medicion de funciones f = @() myFunction(data); t = timeit(f); ``` ## Pruebas Unitarias ### Framework de Pruebas Simple ```matlab function testResults = runTests() tests = { @testAdd, @testMultiply, @testDivide }; passed = 0; failed = 0; for i = 1:numel(tests) try tests{i}(); passed = passed + 1; fprintf('PASS: %s\n', func2str(tests{i})); catch ME failed = failed + 1; fprintf('FAIL: %s - %s\n', func2str(tests{i}), ME.message); end end fprintf('\nResultados: %d pasados, %d fallidos\n', passed, failed); end ``` ### Aserciones de Prueba ```matlab function testAdd() result = add(2, 3); assert(result == 5, 'Se esperaba 2+3=5'); end function assert(condition, msg) if ~condition error(msg); end end ``` ## Registro ### Registro Simple ```matlab function logMessage(level, msg) fprintf('[%s] %s: %s\n', datestr(now), level, msg); end logMessage('INFO', 'Procesamiento iniciado'); logMessage('WARN', 'Memoria baja'); logMessage('ERROR', 'Archivo no encontrado'); ``` ### Bandera de Depuracion ```matlab function myFunction(data, debug) if nargin < 2 debug = false; end if debug fprintf('Tamano de entrada: %d x %d\n', size(data)); end % Logica principal... if debug fprintf('Tamano de salida: %d x %d\n', size(result)); end end ``` ## Resumen - Usar scripts para secuencias, funciones para codigo reutilizable - Establecer puntos de interrupcion con `dbstop`, usar `dbstep` para navegar - Envolver codigo riesgoso en bloques `try-catch` - Validar entradas con `validateattributes` - Vectorizar bucles para mejor rendimiento - Preasignar arreglos antes de llenarlos - Usar `profile` y `tic/toc` para optimizacion - Escribir pruebas para verificar correctitud

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →