我目前正在 MATLAB 上开发一个基本的图像处理应用程序。我必须实现对先前状态功能的撤消。我在网上搜索了uiundo但它只撤消 GUI 操作。有没有简单的撤消命令。谢谢。
3 回答
在我看来,您必须使用命令模式来实现自己的多级(或单级)撤消。
这将要求您将操作包装到包含执行操作和恢复状态的逻辑的对象中。没有灵丹妙药,需要努力。
如果您有足够的内存可用,您可以将所有程序状态存储在一个结构中,然后将该结构推入一个循环缓冲区。缓冲区中元素的数量将决定撤消的级别数。
一般撤消会很复杂,但如果您只对保存 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_state
或undo
. 为避免这种情况,您可以使用硬编码的文件夹名称替换SavedStateFolder
insave.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_index
并undo
假设除了,和文件SavedStateFolder
之外没有其他文件。通过这种方式也可以找到要保存的文件数和运行索引,因此如果您删除了一些以前的文件,而没有例如。创建相同数量的空文件来替换它们,计数不匹配并且可能将状态保存在已经存在的已保存状态文件之上。.
..
saved_state_*.mat
saved_state_*.mat
saved_state_*.mat
save_state