簡體   English   中英

為什么MATLAB的圖例功能如此之慢,以及如何優化?

[英]Why is MATLAB's legend function so slow, and how to optimize?

問題

在我寫的GUI中,我意識到我的代碼性能中最大的瓶頸是創建/更新圖例。

目前,我在每次更新GUI時刪除並重新創建圖例,因為用戶需要能夠調整圖例中的內容。 我正在通過調整LINEHANDLE.Annotation.LegendInformation.IconDisplayStyle的設置來切換圖例中的內容,並使用legend('off');legend('show');更新圖例legend('off');legend('show');

測試

以下代碼片段顯示, legend調用主要受到對legend>make_legend的調用的限制,並且完全獨立於圖例內容。

close all

n=50; % number of plot lines
S=rand(n); % data
legs=cellstr(char(26*rand(n,10)+97)); % legend entries

profile on %start profiler
plot(S)
legend(legs{:})
profile viewer % view call stats

是否有更好的方法來更新圖例內容而不刪除它,因此強制它在娛樂時重新調用make_legend

此外,我想知道為什么一般的legend是如此緩慢和具有如此奇怪的行為。

目的

我在這里添加一些信息以避免XY問題 我正在嘗試做的最小例子是:

我正在構建一個繪制四行的GUI,我們稱之為data1data2linear model 1linear model 2 數據線在顏色和內容上都是獨立的,而線性模型具有相同的外觀並且連接到相應的數據線。

我希望有一個只有三個條目的圖例: data1data2linear model 到目前為止,沒問題。

我還希望有三個切換按鈕,用於切換軸和圖例上四條線的可見性。 按鈕是:

  • data1 ,用於切換data1linear model 1數據行的可見性。
  • data2 ,用於切換data2linear model 2數據線的可見性。
  • linear model ,用於切換linear model 1linear model 2數據線的可見性。

試圖解決方案

我的第一種方法是首先只將三個句柄傳遞給legend ,然后讓按鈕回調根據上面的內容調整線對象的visibility屬性。

這將創建禁用第一數據線和相應的線性模型時的圖例項問題linear model也清空了,因為它是連接到特定的線對象,即使對方依然可見。

我當前的工作方法是手動設置所有行的DisplayName屬性,然后按鈕回調調整每行Annotation.LegendInformation.IconDisplayStyle屬性。 根據文檔 ,用戶然后需要調用legend來強制更新。

但是這沒有實現,查看legend.m的代碼很明顯,此選項僅返回當前圖例對象而不進行任何其他操作。 因此我被迫稱為legend('off');legend('show'); 它會觸發(慢速)創建新的圖例對象。

這當前有效,但使用profile我可以看到,圖例創建是我的計算時間的一半,並且在較慢的筆記本電腦上使用GUI時對用戶體驗有相當大的影響。 我已經確保我的代碼運行legend('off');legend('show'); 只有它真的必須。

問題是,這里的任何用戶是否能夠調用matlab.graphics.illustration.Legend的不可讀但可訪問的類方法來觸發現有對象的更新而不強制它刪除和重新創建。 從而做了MATHWORKS文檔聲稱在legend實現的內容(盡管它不是)。

或者,我願意找到一種不同的方式來更改當前圖例有效跟蹤的線對象。

您可以嘗試直接更改圖例對象的屬性。 請訪問http://www.mathworks.com/help/matlab/ref/legend-properties.html以獲取屬性列表。 圖例對象可以通過以下方式訪問:

% Assign the output of legend to a variable. Do this only once at creation.
l = legend(<some arguments>); 

% Example: change the location of the legend to 'north'
l.Location = 'north'; 

我認為這就是你要求的,但我不確定任何效率提升。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM