2012-04-13 12 views
7

現在、MATLABで基本的な画像処理アプリケーションを開発中です。私は以前の状態の機能に元に戻すを実装する必要があります。私はネットを検索しました。uiundoですが、GUIの操作だけを元に戻します。元に戻す簡単なコマンドがありますか?ありがとう。MATLABはコマンドを取り消します

答えて

6

余裕がある場合は、すべてのプログラム状態を構造体に格納し、この構造体をcircular bufferにプッシュすることができます。バッファ内の要素数によって、元に戻すレベルの数が決まります。

+0

+1:良いアイデア。もう1つは、それぞれの操作の後にすべてをディスクに保存することですが、これは過度なことかもしれません:) – Anonymous

6

Command patternを使用して独自の複数レベル(または1レベル)の元に戻す必要があると思います。

これは、操作を実行して状態を復元するロジックを含むオブジェクトに操作をラップする必要があります。いいえ、銀の弾丸、勤勉が必要です。

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ディスクを使用するとよいでしょう。データ。また、またはundoを実行すると、SavedStateFolderという変数の以前の内容が失われることにも注意してください。これを回避するには、例えば、ハードコードされたフォルダ名とsave.state.mundo.mSavedStateFolderのすべてのインスタンスを置き換えることができます。

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には、.,..saved_state_*.matファイル。また、saved_state_*.matファイルの数と保存される実行中のインデックスはこのようにして見つかっています。したがって、たとえば、以前のsaved_state_*.matファイルを削除すると、同じ数の空のファイルを作成してそれらを置き換えると、カウントは一致せず、save_stateはすでに存在する保存済み状態ファイルの上に状態を保存する可能性があります。

関連する問題