MATLAB撤消命令

时间:2012-04-13 11:42:02

标签: matlab undo

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

3 个答案:

答案 0 :(得分:6)

在我看来,您必须使用Command pattern实现自己的多级(或一级)撤消。

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

答案 1 :(得分:6)

如果您有足够的内存,可以将所有程序状态存储在结构中,然后将此结构推送到circular buffer。缓冲区中的元素数量将决定撤消的级别数。

答案 2 :(得分:2)

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

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 ')) ]); 

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

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 ')) ]);

另请注意,save_stateundo_indexundo假设在SavedStateFolder中除...和{之外没有其他文件{1}}个文件。此外,还会以这种方式找到saved_state_*.mat个文件的数量和要保存的运行索引,因此如果删除了以前的saved_state_*.mat个文件而没有例如。创建相同数量的空文件来替换它们,计数不匹配,saved_state_*.mat可能会将状态保存在已存在的已保存状态文件之上。