2012-04-12 49 views
11

Tôi có một số chương trình viết bằng Matlab mà tôi cần phải chạy nhiều lần đối với một số lý do (gỡ lỗi, thử nghiệm với đầu vào khác nhau, vv ...)Disable lô trong Matlab

Nhưng, có rất nhiều của đồ thị đó được vẽ bởi các chương trình và các chức năng khác nhau của nó như vậy mỗi khi tôi chạy chương trình, tôi phải đợi cho tất cả các đồ thị được hiển thị, rất khó chịu và tốn thời gian (đặc biệt là khi bạn đang làm việc với một máy tính xách tay nhỏ). Sau khi chương trình được thực hiện, tôi đóng chúng bằng close all.

Vì vậy, câu hỏi của tôi là:

Có cách nào để vô hiệu hóa tất cả các thửa/nhân vật/đồ thị trong Matlab? hoặc trong các tùy chọn hoặc bằng cách thực thi một mã nhất định như disable plotenable plot để đảm bảo rằng không có số liệu nào được hiển thị.

Tôi biết rằng tôi chỉ có thể duyệt mã và nhận xét phần vẽ đồ thị, nhưng tôi không muốn quên để bỏ ghi chú.

Trả lời

13

Hãy thử một số sự kết hợp của hai lệnh:

set(gcf,'Visible','off')    % turns current figure "off" 
set(0,'DefaultFigureVisible','off'); % all subsequent figures "off" 

Điều thứ hai, nếu bạn đặt nó ở gần đầu của chương trình của bạn, có thể làm các trick cho bạn. Tất nhiên, nó vẫn đang tạo ra các ô, có thể là không mong muốn đối với các vấn đề về thời gian tính toán và/hoặc RAM.

Đây là lý do cổ điển để tránh Matlab khi có thể. Nó thúc đẩy thiết kế lập trình kém. Để giải quyết vấn đề này một cách chính xác, bạn nên tạo một cái gì đó cho phép bạn "lật một chuyển đổi" ở mức cao nhất của chương trình của bạn và kiểm soát xem các ô hiển thị hoặc không hiển thị. Có lẽ nó thậm chí có phân cấp của tùy chọn hiển thị/không hiển thị để bạn có thể chọn các loại ô khác nhau làm/không hiển thị tùy thuộc vào chẩn đoán bạn đang chạy.

Lý tưởng nhất, bạn muốn tạo "lật chuyển đổi" này thành lớp có quyền truy cập vào chức năng hiển thị và ô của các đối tượng khác. Nhưng vì hướng đối tượng tương tác rất cồng kềnh trong Matlab, nên thường không đáng để phát triển một giải pháp như vậy, và hầu hết mọi người không nghĩ về khía cạnh thiết kế này ngay từ đầu của dự án của họ.

Matlab sẽ khuyến khích người nào đó giải quyết vấn đề này bằng cách tạo các biến cờ như "isPlotVisible" hoặc thứ gì đó và tạo các hàm luôn chấp nhận các cờ như vậy. Tôi đồng ý đây là một thiết kế tồi.

+0

ah, hay. Không biết về những thứ đó. – Richante

+0

Điều tương tự cũng sẽ làm việc trong Octave, điều này đáng chú ý vì âm mưu là một trong những cách mà Octave thường khác với chức năng đồng bộ của Matlab. – ely

+2

'set (0, 'DefaultFigureVisible', 'off');' chỉ là hoàn hảo! Nó cải thiện đáng kể hiệu suất của chương trình. Nó giống như nó đã dành nhiều thời gian hơn để tạo ra các cửa sổ cho các con số hơn là thực sự tính toán thực sự. – Mesop

3

Bạn có thể chạy matlab từ dòng lệnh với:

matlab -nojvm 

nhưng sau đó bạn không nhận được GUI ở tất cả. Ngoài ra, bạn có thể viết một tệp 'plot.m':

function h = plot(varargin) 
    h = []; 
end 

không làm gì cả. Nếu điều này nằm trong thư mục làm việc (hoặc ở một nơi khác gần đầu đường dẫn), thì cốt truyện sẽ gọi hàm của bạn thay vì âm mưu 'thực'. Bạn sẽ cần phải làm tương tự từ bất kỳ chức năng đồ thị nào khác mà bạn gọi.

Cách gần nhất tôi biết là 'tắt âm mưu' sẽ là thư mục của các chức năng như vậy mà bạn có thể thêm vào đường dẫn để tắt âm mưu và xóa để bật.

+1

Giải pháp sáng tạo +1, mặc dù nó thật kinh khủng (INTENTIONALLY ẩn MATLAB nội trang?) –

+0

yup và thậm chí tệ hơn vì gần đây tôi đã chastised ai đó đưa ra câu trả lời [làm cho Doug Hull khóc] (http: //blogs.mathworks) .com/videos/2010/03/08/top-10-MATLAB-code-practice-that-make-me-cry /) – Richante

+0

Tôi đã thấy điều đó. ;) –

0

Các phương pháp trước đây là tốt, nhưng một thói quen dễ dàng và tốt để thực hiện là sử dụng "on/off parameter".Vì vậy, về cơ bản, ở phần đầu của mã của bạn, bạn có thể thêm một cái gì đó như:

DisplayFigure = 1; %1 = display, 0 = no display 

Sau đó, thêm "if DisplayFigure == 1 ... end" cho tất cả các lệnh liên quan âm mưu của bạn, nơi các lệnh nên được bên trong câu lệnh if (các ... trên). Do đó bạn thậm chí sẽ không tính toán các ô, điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian và trí nhớ. Bạn chỉ cần thay đổi giá trị của biến "DisplayFigure" thành lô hoặc không phải là số liệu.