Antes, dije que debes actuar como un científico a la hora de depurar código, que incluyen realizar experimentos y recolectar datos. En esta sección, voy a describir algunos métodos simples para hacer esto.
El scripting consiste en almacenar información en variables y aplicar operaciones a esas variables (por ejemplo, suma, resta). Cuando hay un error de tiempo de ejecución o un error lógico, es probable que alguna variable tenga un valor incorrecto. Un aspecto clave de la depuración es, por lo tanto, evaluar los valores de las variables en diferentes puntos de la ejecución del script. Esto es muy parecido a monitorear las representaciones del cerebro en diferentes momentos después del inicio de un estímulo mientras un participante realiza una tarea.
Hay un par de formas de monitorear variables. Lo más sencillo es imprimir sus valores en la ventana de comandos en puntos clave durante la ejecución del script. Para ver cómo funciona esto, usemos este enfoque para entender qué es lo que está mal con el script Test_Case_4.m.
Ejercicio A2.5: Visualización de Valores de Variables
Abre el guión (si no está ya abierto) y échale un vistazo. El objetivo del script es cargar un conjunto de datos llamado 1_N170.set que se encuentra en la carpeta actual (la misma carpeta que el script). Para lograrlo, comenzamos por obtener la ruta a la carpeta actual con la función pwd (print working directory) y almacenamos el resultado en una variable llamada DIR. Luego concatenamos este valor con '1_n170.set' para crear la ruta completa al archivo, y almacenamos el resultado en una variable llamada Dataset_filename. Luego enviamos Dataset_filename a la función pop_loadset. Pero estamos recibiendo un mensaje de error que indica que Matlab no puede encontrar el archivo que hemos especificado de esta manera.
Para averiguar el origen del error, examinemos los valores de las variables DIR y Dataset_filename. Para lograr esto, agregue las siguientes dos líneas al script, justo después de la línea 5 (es decir, después de las líneas de código que establecen los valores de estas variables):
display (DIR);
display (Dataset_nombre_archivo);
Estos comandos mostrarán los valores de las variables DIR y Dataset_filename en la Ventana de Comandos. Para ver esto, ejecute el script. Deberías ver el mismo mensaje de error en la Ventana de Comandos que antes, pero antes de eso deberías ver algo como esto:
DIR =
'/Users/Luck/ERP_Analysis_Book/Appendix_2_Soluciones/Ejercicios'
Dataset_filename =
'/Usuarios/Luck/ERP_Analysis_Book/Appendix_2_Soluciones/ejercicios1_n170.set'
El valor de DIR será diferente en tu computadora porque tu carpeta actual no es la misma que la mía. No obstante, si lo miras de cerca, debería ser correcto.
Si observa el valor de Dataset_FileName, debería ver el error: no hay barra (o barra diagonal inversa) entre Exercises y 1_n170.set. En otras palabras, el script le dice a Matlab que busque un archivo llamado Exercises1_N170.set en lugar de un archivo llamado 1_N170.set dentro de la carpeta Exercises.
Para solucionar este problema, cambie la Línea 5 de esto:
(pero usa '\' en lugar de '/' si estás en una máquina con Windows). Ahora ejecuta el código. Verá que la variable Dataset_filename ahora tiene una barra (o barra diagonal inversa) entre el nombre de la carpeta y el nombre del archivo, y ahora todo funciona correctamente.
Por cierto, recomiendo aprender a usar el comando fprintf para mostrar los valores de las variables. Es mucho más potente que el comando display. Se explica brevemente en el Capítulo 10, y puedes buscarlo en Google para encontrar más detalles. ¡Muy vale la pena conocer!
Ejercicio A2.6: Panel de espacio de trabajo y panel de variables
Una vez que un script ha dejado de ejecutarse, puede ver lo valioso de una variable simplemente escribiendo el nombre de la variable en la ventana de comandos de Matlab. Prueba esto escribiendo Dataset_filename. También puede ver el valor de una variable mirando el panel Workspace en la GUI de Matlab (que probablemente esté en el lado derecho de la GUI). Este panel debería parecerse a la Captura de pantalla A2.1.
Este panel muestra todas las variables que Matlab conoce. Por ejemplo, actualmente tengo cuatro conjuntos de datos cargados, y el cuarto conjunto de datos está actualmente activo, por lo que CURRENTSET tiene un valor de 4. Para variables más complicadas, se muestran las dimensiones de la variable en lugar del valor. Por ejemplo, ALLEEG es una estructura de datos que contiene todos los conjuntos de datos, y se enumera como una estructura 1x4 para indicar que es una estructura que tiene 1 fila de alto por 4 columnas de ancho (porque tengo 4 conjuntos de datos cargados).
Se puede ver que el panel Workspace en Screenshot A2.1 también contiene las variables DIR y Dataset_filename que fueron creadas por el último script que ejecuté, Test_Case_4.m. También deberías tener estas variables listadas; si no lo haces, vuelve a ejecutar Test_Case_4.m (después de corregir el error). Las cadenas almacenadas en estas variables son demasiado largas para que se vean bien en el panel Workspace, pero Matlab tiene un panel Variables que puede usar para inspeccionar las variables con más cuidado.
Para ver esto, haga doble clic en la variable Dataset_filename en el panel Espacio de trabajo. Debería ver el panel Variables abierto en la GUI de Matlab (probablemente encima de la ventana de comandos). Debería verse algo así como Captura de pantalla A2.2.
Ahora se muestra el valor de la variable Dataset_filename (en la cajita con “1” a la izquierda y “1” a la derecha). Sin embargo, la caja es demasiado pequeña para ver gran parte de la variable. Si colocas el mouse sobre el borde derecho de la caja con el “1” encima del valor de la variable y arrastras hacia la derecha, el cuadro se expandirá, y podrás ver toda la variable (como en la Captura de Pantalla A2.3).
Si has corregido el error en Test_Case_4.m, deberías poder ver la barra (o barra diagonal inversa) entre Exercises y 1_N170.set. Esto puede parecer mucho trabajo ver el contenido de una variable, pero una vez que te practiques en este enfoque, se volverá muy eficiente. Además, es una excelente manera de ver variables más complejas.
Por ejemplo, haga doble clic en la variable EEG en el espacio de trabajo. El panel Variables ahora debería parecerse a la captura de pantalla A2.4. Se pueden ver fácilmente los diversos campos de esta compleja estructura de datos, como el número de canales (el campo nbchan) y el número de puntos de tiempo (el campo pnts). Los valores de voltaje reales se almacenan en el campo de datos, y se puede ver que este campo tiene 33 filas de alto (una fila por cada uno de los 33 canales) y 170750 columnas de ancho (una columna por cada uno de los 170750 puntos de tiempo). Haga doble clic en el campo de datos, y ahora podrá ver los valores de voltaje reales para cada combinación de canal y punto de tiempo. Intente hacer doble clic en otros campos también para tener una idea de qué información se encuentra en la variable EEG.
Ejercicio A2.7: Interrumpir un script para ver valores variables
Los paneles Espacio de trabajo y Variables son excelentes formas de ver los valores de las variables, pero normalmente se puede usar este enfoque solo después de que haya terminado un script. Pero Matlab también contiene un depurador que permite pausar la operación de un script en varios momentos para que pueda examinar los valores de las variables en esos momentos.
Para ver esto en acción, cargue el script Test_Case_5.m. Este script es mucho más complicado que los casos de prueba anteriores, pero en realidad es una versión simplificada del script Step1_pre_ICA_Processing.m del Capítulo 10. Recorre los datos de los primeros cinco sujetos en el experimento N170, cargando el conjunto de datos de cada sujeto, filtrándolo, agregando información de ubicación de canal, renombrándolo y luego guardando el nuevo conjunto de datos en el disco.
No hay un error en este script, pero imaginemos que hubo un problema y que sospechabas que el problema surgió en el bucle que inicia en la Línea 14 y termina en la Línea 32. Si acaba de comenzar a ejecutar el script, no podrá inspeccionar los valores de las variables usando los paneles Espacio de trabajo y Variable hasta que termine el script. Sin embargo, puede establecer un punto de interrupción que haga que el programa se detenga al final de cada vez que el programa pase por el bucle.
Para establecer un punto de interrupción en una línea determinada, simplemente haga clic en el número de línea correspondiente en la ventana del editor para el script (pero asegúrese de que el script se haya guardado primero si ha realizado algún cambio). Por ejemplo, Screenshot A2.5 muestra lo que sucedió cuando hice clic en el 32 correspondiente al número de línea para la sentencia end al final del bucle (Línea 32). Este número de línea ahora está resaltado en un cuadro rojo.
Siga adelante y haga clic en el número de línea para la Línea 32 en el script Test_Case_5.m. Ahora debería tener una caja roja a su alrededor, como en la Captura de Pantalla A2.5. Ahora ejecuta el script. Deberías ver que el script se ejecuta, imprimiendo un montón de información en la ventana de comandos. Sin embargo, solo ha pasado por el bucle una vez y se ha pausado. Se puede decir que se ha pausado porque el símbolo de la ventana del sistema ahora es K>> en lugar de solo >>. También puede ver una flecha verde junto a la instrucción end en la ventana del editor para el script. Y si miras el Workspace, puedes ver que la variable subject (que enlaza de 1 a 5 en este script) está establecida en 1.
Ahora veamos el valor actual de la estructura de datos del EEG. Es posible que ya estés mostrando EEG en el panel Variables, en cuyo caso estás viendo el valor actual de esta variable. Si aún no se muestra, puede hacer doble clic en EEG en el panel Espacio de trabajo para verlo en el panel Variables. Puede ver que el nombre del conjunto se ha actualizado correctamente a 1_N170_filt_chanlocs (aunque ver el nombre completo de este campo puede requerir hacer doble clic en el campo setname en el panel Variable.
Puede reanudar la ejecución del script haciendo clic en el botón Continuar en la barra de herramientas de la parte superior de la ventana del editor para Test_Case_5.m. Cuando haces eso, el script se reanuda y recorre el bucle una vez más. Si ahora observa el valor del campo setname de EEG en el panel Variables, verá que se ha actualizado a 2_N170_filt_chanlocs. Puede hacer clic en el botón Detener en la barra de herramientas de la ventana del editor para salir del script.