2012-04-13 25 views
7

Actualmente estoy desarrollando una aplicación básica de procesamiento de imágenes en MATLAB. Tengo que implementar deshacer a la función de estado anterior. Busqué en la red hay uiundo pero solo se deshacen las acciones de la GUI. ¿Hay un comando simple para deshacer? Gracias.MATLAB deshacer un comando

Respuesta

6

Si tiene memoria suficiente, puede almacenar todos los estados de su programa en una estructura y luego insertar esta estructura en circular buffer. La cantidad de elementos en el búfer determinaría la cantidad de niveles de deshacer.

+0

+1: buena idea.Otro es guardar todo en el disco después de cada operación, aunque esto podría ser un exceso :) – Anonymous

6

Me parece que tendrías que implementar tu propio deshacer de varios niveles (o un nivel) usando el Command pattern.

Esto requeriría que ajuste sus operaciones en objetos que contengan la lógica para realizar la acción y restaurar el estado. No hay bala de plata, es necesario un trabajo duro.

2

deshacer general va a ser complicado, pero si usted está interesado sólo en salvar el estado de las variables de MATLAB y volver a un estado guardado, esto podría ser una posible solución:

save_state.m:

SavedStateFolder = '/home/user/matlab_saved_states_folder/'; 
save([ SavedStateFolder, 'saved_state_', sprintf('%06d', (size(dir(SavedStateFolder), 1) - 1)) ]); 
fprintf('state saved in saved_state_%s.mat\n', sprintf('%06d', (size(dir(SavedStateFolder), 1) - 2))); 

undo_index.m:

function undo_index() 
SavedStateFolder = '/home/user/matlab_saved_states_folder/'; 
FilesStruct = dir(SavedStateFolder); 
LastSavedStateIndex = size(FilesStruct, 1) - 2; 
if (LastSavedStateIndex < 1) 
    fprintf('No saved states available.\n'); 
else  
    fprintf('Index of last saved state is %06d\n', LastSavedStateIndex); 
end 
return 

undo.m:

SavedStateFolder = '/home/user/matlab_saved_states_folder/'; 
load([ SavedStateFolder, 'saved_state_', sprintf('%06d', input('Enter saved state index ')) ]); 

Luego puede usar save_state para guardar el estado de las variables de MATLAB o incluso puede prefijar todos sus comandos con save_state; si desea realizar un seguimiento de todos los cambios. Cuando desee volver a un estado previo de variables, puede ejecutar undo_index para averiguar el índice del último estado guardado y luego puede ejecutar undo e ingresar el índice dado por undo_index, o alternativamente cualquier entero positivo más pequeño para regresar a un estado anterior estado de las variables. El primer archivo de estado guardado se llamará saved_state_000001.mat, luego saved_state_000002.mat y así sucesivamente ... Tenga en cuenta que save_state guarda todo en el disco, por lo que usar SSD o un disco RAM puede ser una buena idea si desea probar esto en un bucle con una gran cantidad de datos. Tenga en cuenta también que el contenido anterior de la variable llamada SavedStateFolder se pierde cuando ejecuta save_state o undo. Para evitar esto, se puede reemplazar todas las instancias de SavedStateFolder en save.state.m y undo.m con nombres de las carpetas no modificables, por ejemplo:

save_state.m:

save([ '/home/user/matlab_saved_states_folder/', 'saved_state_', sprintf('%06d', (size(dir('/home/user/matlab_saved_states_folder/'), 1) - 1)) ]); 
fprintf('state saved in saved_state_%s.mat\n', sprintf('%06d', (size(dir('/home/user/matlab_saved_states_folder/'), 1) - 2))); 

undo.m:

load([ '/home/user/matlab_saved_states_folder/', 'saved_state_', sprintf('%06d', input('Enter saved state index ')) ]); 

Tenga en cuenta también que save_state, undo_index y undo suponen que en SavedStateFolder no hay otros archivos excepto ., .. y saved_state_*.mat archivos. También se encuentra la cantidad de archivos saved_state_*.mat y el índice en ejecución que se guardará de esta manera, por lo que si elimina algunos archivos saved_state_*.mat anteriores sin, por ejemplo, creando la misma cantidad de archivos vacíos para reemplazarlos, los recuentos no coinciden y save_state podría guardar el estado sobre un archivo de estado guardado ya existente.