2012-04-13 720 views
7

我目前正在MATLAB上開發一個基本的圖像處理應用程序。我必須執行撤銷到以前的狀態功能。我搜索的網絡有uiundo但它只是撤銷GUI操作。有一個簡單的命令來撤消。謝謝。MATLAB撤消命令

回答

6

如果你有足夠的內存空間,你可以將所有的程序狀態存儲在一個結構體中,然後將這個結構體推送到circular buffer。緩衝區中元素的數量將決定撤消級別的數量。

+0

+1:好主意。另一個是每次操作後將所有內容保存到磁盤,儘管這可能是一個過度殺傷:) – Anonymous 2012-04-13 13:37:10

6

在我看來,你將不得不通過使用Command pattern來實現你自己的多級(或一級)撤消。

這將要求您將操作包裝到包含執行操作和恢復狀態的邏輯的對象中。沒有銀彈,需要努力工作。

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磁盤,數據。還要注意,當您運行save_stateundo時,名爲SavedStateFolder的變量的先前內容會丟失。爲了避免這種情況,可以更換的SavedStateFolder所有實例save.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_state,undo_indexundo假設在SavedStateFolder中除.,之外沒有其他文件0和saved_state_*.mat文件。也可以通過這種方式找到saved_state_*.mat文件的數量和要保存的運行索引,因此如果刪除了一些以前的saved_state_*.mat文件,例如沒有。創建相同數量的空文件以替換它們,計數不匹配,並且save_state可能會將狀態保存在已存在的已保存狀態文件之上。