7

我目前正在 MATLAB 上开发一个基本的图像处理应用程序。我必须实现对先前状态功能的撤消。我在网上搜索了uiundo但它只撤消 GUI 操作。有没有简单的撤消命令。谢谢。

4

3 回答 3

6

在我看来,您必须使用命令模式来实现自己的多级(或单级)撤消。

这将要求您将操作包装到包含执行操作和恢复状态的逻辑的对象中。没有灵丹妙药,需要努力。

于 2012-04-13T11:47:18.007 回答
6

如果您有足够的内存可用,您可以将所有程序状态存储在一个结构中,然后将该结构推入一个循环缓冲区。缓冲区中元素的数量将决定撤消的级别数。

于 2012-04-13T13:20:41.877 回答
2

一般撤消会很复杂,但如果您只对保存 MATLAB 变量的状态并返回到已保存状态感兴趣,这可能是一种可能的解决方案:

保存状态.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

撤消.m:

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

然后,您可以使用save_state保存 MATLAB 变量的状态,或者save_state;如果您想跟踪所有更改,您甚至可以为所有命令添加前缀。当您想返回变量的先前状态时,您可以运行undo_index以找出上次保存状态的索引,然后您可以运行undo并输入由 给出的索引undo_index,或者任何较小的正整数以返回变量的早期状态. 第一个保存的状态文件将命名为saved_state_000001.mat,然后saved_state_000002.mat以此类推...请注意,save_state将所有内容保存到磁盘,因此如果您想在包含大量数据的循环中尝试此操作,则使用 SSD 或 RAM 磁盘可能是个好主意。另请注意,SavedStateFolder当您运行save_stateundo. 为避免这种情况,您可以使用硬编码的文件夹名称替换SavedStateFolderinsave.state.m和的所有实例undo.m,例如:

保存状态.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)));

撤消.m:

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

还要注意save_state,undo_indexundo假设除了,和文件SavedStateFolder之外没有其他文件。通过这种方式也可以找到要保存的文件数和运行索引,因此如果您删除了一些以前的文件,而没有例如。创建相同数量的空文件来替换它们,计数不匹配并且可能将状态保存在已经存在的已保存状态文件之上。...saved_state_*.matsaved_state_*.matsaved_state_*.matsave_state

于 2012-04-13T15:19:24.163 回答