我目前正在MATLAB上开发一个基本的图像处理应用程序。我必须实现撤消以前的状态功能。我搜索网有 uiundo ,但它只撤消GUI动作。是否有一个简单的撤消命令。谢谢。
答案 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磁盘可能是一个好主意你想在一个包含大量数据的循环中尝试这个。另请注意,当您运行SavedStateFolder
或save_state
时,名为undo
的变量的先前内容将丢失。为避免这种情况,您可以使用硬编码的文件夹名称替换SavedStateFolder
和save.state.m
中undo.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_state
,undo_index
和undo
假设在SavedStateFolder
中除.
,..
和{之外没有其他文件{1}}个文件。此外,还会以这种方式找到saved_state_*.mat
个文件的数量和要保存的运行索引,因此如果删除了以前的saved_state_*.mat
个文件而没有例如。创建相同数量的空文件来替换它们,计数不匹配,saved_state_*.mat
可能会将状态保存在已存在的已保存状态文件之上。