0

Figure に凡例を表示する必要がある Matlab コードがある場合、実行時間が大幅に増加することに気付きました。
次に例を示します。

clear all
close all
clc

% legend test
x = [0:1:100];
y = x.^(3.123);

figure('Name', 'X-Y and X-X plot')
plot(x,y)
hold all
plot(x,x)
legend('1', '232')

実行時間は 1.1 秒です。行のない同じコードlegend('1', '232')の実行時間は 0.4 秒です。単純な凡例が実行時間をこれほど長くするのは非常に奇妙だと思います。
プロファイラーを使用すると、主に時間の増加に関与する関数が呼び出されることがわかりましたgraphics/private/texmex。自己時間は 0.12 秒で、4 回呼び出されます。凡例を作成しない場合、この関数は呼び出されません。

図の凡例を生成しながら、コードを高速化する方法はありますか?

Mac OS 10.8.3 で 64 ビットの Matlab 2012b を実行しています。

関数を使用しset(0, DefaultTextInterpreter, 'none')て例のコードを実行すると、によって呼び出され、などによって呼び出されます...:texmextex>localCallTeXParserscribe.legend.methods>strsize

graphics/private/texmex
tex>localCallTeXParser
scribe.legend.methods>strsize
scribe.legend.methods>getsizeinfo
scribe.legend.methods>getsize
scribe.legend.methods
scribe.legend.legend
4

2 に答える 2

3

私は自分のプロジェクトで同じ問題を抱えていました。スライダーを使用していくつかのライン プロットをすばやく動的に更新したかったのですが、凡例をアクティブにすると、パフォーマンスが大幅に低下することに気付きました。

ここで問題の解決策を見つけました - http://undocumentedmatlab.com/blog/plot-performance/

2番目にリストされたパフォーマンスハックから、次の行を追加しました

set(gca,'LegendColorbarListeners',[]);

setappdata(gca,'LegendColorbarManualSpace',1);
setappdata(gca,'LegendColorbarReclaimSpace',1);

私のコードに。言及されたコードの最初の行でエラー メッセージが表示されたので、上で取り消しました。とにかく、他の 2 行のコードにより、凡例が存在しない場合と同じように、凡例を使用してプロットをすばやく更新できました。

于 2013-07-05T16:16:24.773 に答える
1

TeX インタープリターを使用しているように聞こえますlegend(少なくとも、そのようにtexmex聞こえます)。その場合、あなたは試すことができます

legend({'1', '232'}, 'Interpreter', 'none');

これにより、TeX インタープリターが無効になるため、パフォーマンスが向上する可能性があります。関数の速度で問題を経験したことがないlegendので、おそらくプロットや MATLAB のインストール/バージョンに固有のものであることに注意してください。

編集:上記は最初にTeXインタープリターで凡例を描画し、次にそれを無効にして再度描画すると感じています。凡例を描画する前、またはおそらく図を描画する前に、次のことを試してください (MATLAB が既定のプロパティを実際の図 / 軸 / 凡例にプロモートする時点が不明です)。

set(0, 'DefaultTextInterpreter', 'none');
于 2013-04-02T10:46:18.810 に答える