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
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.
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.
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.m
và undo.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_index
và undo
giả định rằng trong SavedStateFolder
không có tệp nào khác ngoại trừ .
, ..
và 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ó.
- 1. Hoàn tác lệnh git push trên github
- 2. Có lệnh nào để hoàn tác git init không?
- 3. TortoiseSVN - Hoàn tác hoàn nguyên
- 4. Hoàn tác một cú hg đẩy (backout?)
- 5. Hoàn tác lỗi git bisect
- 6. Có matplotlib đối tác của Matlab "stem3"?
- 7. Hoàn tác một git pull --rebase
- 8. Hoàn tác việc đẩy Mercurial
- 9. cách hoàn tác cam kết
- 10. Hoàn tác Git Clean
- 11. Hoàn tác [UIGestureRecognizer * requireGestureRecognizerToFail]
- 12. Hoàn tác triển khai - Thao tác DOM
- 13. Có lệnh nào để hoàn tác lệnh git flow init không?
- 14. Hoàn tác/hoàn tác nhanh cho trình chỉnh sửa bitmap khi bộ nhớ bị hạn chế?
- 15. Hoàn tác giàn giáo trong Rails
- 16. Thêm Hoàn thành (tương tác)
- 17. Cách hoàn tác bzr thêm
- 18. Hoàn tác hợp nhất git
- 19. Hoàn tác "quay lại cam kết này"
- 20. Hoàn tác SVN xóa ./* --force
- 21. Hoàn tác xóa trong GIT
- 22. hoàn tác/làm lại với xóa tầng
- 23. Cách hoàn tác svn xóa
- 24. Cập nhật SQL hoàn tác
- 25. Hoàn tác tạo chi nhánh trong Mercurial
- 26. Trình tương tác JavaScript hoàn thành
- 27. Trợ giúp Matlab, lệnh doc rất chậm
- 28. Git-Flow hoàn tác chi nhánh đã hoàn thành
- 29. Làm cách nào để hoàn tác một git svn dcommit?
- 30. Làm thế nào để hoàn tác một cuộn Git
+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