[英]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,我們稱之為data1
, data2
, linear model 1
和linear model 2
。 數據線在顏色和內容上都是獨立的,而線性模型具有相同的外觀並且連接到相應的數據線。
我希望有一個只有三個條目的圖例: data1
, data2
和linear model
。 到目前為止,沒問題。
我還希望有三個切換按鈕,用於切換軸和圖例上四條線的可見性。 按鈕是:
data1
,用於切換data1
和linear model 1
數據行的可見性。 data2
,用於切換data2
和linear model 2
數據線的可見性。 linear model
,用於切換linear model 1
和linear 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.