2012-04-13 37 views
7

Tôi hiện đang phát triển một ứng dụng xử lý hình ảnh cơ bản trên MATLAB. Tôi phải triển khai hoàn tác về trạng thái trước đó tính năng. Tôi đã tìm kiếm trên mạng có uiundo nhưng nó chỉ hoàn tác các tác vụ GUI. Có một lệnh đơn giản để hoàn tác. Cảm ơn.MATLAB hoàn tác một lệnh

Trả lời

6

Nếu bạn có nhiều bộ nhớ để rảnh, bạn có thể lưu trữ tất cả trạng thái chương trình của bạn trong một cấu trúc và sau đó đẩy cấu trúc này vào một circular buffer. Số lượng các phần tử trong bộ đệm sẽ xác định số lượng các mức hoàn tác.

+0

+1: ý tưởng hay.Một số khác là lưu mọi thứ vào đĩa sau mỗi thao tác, mặc dù điều này có thể là quá mức cần thiết :) – Anonymous

6

Dường như với tôi rằng bạn sẽ phải triển khai hoàn tác nhiều cấp (hoặc một cấp) của riêng bạn bằng cách sử dụng Command pattern.

Điều này sẽ yêu cầu bạn bao bọc các hoạt động của mình vào các đối tượng chứa logic để thực hiện tác vụ và khôi phục trạng thái. Không có viên đạn bạc, công việc khó khăn cần thiết.

2

undo chung sẽ trở nên phức tạp, nhưng nếu bạn chỉ quan tâm đến tiết kiệm tình trạng biến MATLAB và trở về trạng thái lưu, điều này có thể là một giải pháp khả thi:

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

Sau đó, bạn có thể sử dụng save_state để lưu trạng thái của biến MATLAB hoặc thậm chí bạn có thể tiền tố tất cả các lệnh của mình với save_state; nếu bạn muốn theo dõi tất cả các thay đổi. Khi bạn muốn quay trở lại trạng thái trước đó của các biến, bạn có thể chạy undo_index để tìm chỉ mục của trạng thái đã lưu cuối cùng và sau đó bạn có thể chạy undo và nhập chỉ mục được cung cấp bởi undo_index, hoặc bất kỳ số nguyên dương nhỏ hơn nào để quay lại phiên bản cũ hơn trạng thái của các biến. Tệp trạng thái đã lưu đầu tiên sẽ có tên là saved_state_000001.mat, sau đó saved_state_000002.mat và cứ thế ... Lưu ý rằng save_state lưu mọi thứ vào đĩa, do đó, sử dụng ổ đĩa SSD hoặc RAM có thể là ý tưởng hay nếu bạn muốn thử điều này trong một vòng lặp dữ liệu. Cũng lưu ý rằng nội dung trước đó của biến được gọi là SavedStateFolder bị mất khi bạn chạy save_state hoặc undo. Để tránh điều này, bạn có thể thay thế tất cả các trường hợp của SavedStateFolder trong save.state.mundo.m với tên thư mục mã hóa cứng, ví dụ:

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

Cũng lưu ý rằng save_state, undo_indexundo giả định rằng trong SavedStateFolder không có tệp nào khác ngoại trừ ., ..saved_state_*.mat tệp. Ngoài ra số lượng các tệp saved_state_*.mat và chỉ mục đang chạy được lưu được phát hiện theo cách này, vì vậy nếu bạn xóa một số tệp saved_state_*.mat trước đó mà không cần ví dụ. tạo số lượng tệp rỗng bằng nhau để thay thế chúng, số lượng không khớp và save_state có thể lưu trạng thái ở trên cùng của tệp trạng thái đã lưu hiện có.