7

これは、MATLAB が同じものをプロットするのに非常に異なる時間がかかる方法と、その理由についてです。

3D 空間で 10000 ポイントを生成します。

X = rand(10000, 1);
Y = rand(10000, 1);
Z = rand(10000, 1);

次に、4 つの異なる方法のいずれかを使用してこれをプロットし、次のようなプロットを作成しました。

代替テキスト

公平性を確保するために、すべての図を閉じて、実行ごとにワークスペースをクリアしました。

scatter3 を使用した一括プロット:

>> tic; scatter3(X, Y, Z); drawnow; toc
Elapsed time is 0.815450 seconds.

scatter3 を使用した個々のプロット:

>> tic; hold on;
for i = 1:10000
    scatter3(X(i), Y(i), Z(i), 'b');
end
hold off; drawnow; toc
Elapsed time is 51.469547 seconds.

plot3 を使用した一括プロット:

>> tic; plot3(X, Y, Z, 'o'); drawnow; toc
Elapsed time is 0.153480 seconds.

plot3 を使用した個々のプロット:

>> tic; hold on
for i = 1:10000
    plot3(X(i), Y(i), Z(i), 'o');
end
drawnow; toc
Elapsed time is 5.854662 seconds.

MATLAB が「長い」ルーチンの舞台裏でこれほど時間がかかるのは何ですか? それぞれの方法を使用する利点と欠点は何ですか?

編集: Ben Voigt からのアドバイス (回答を参照) のおかげdrawnowで、タイミングにコマンドを含めましたが、これは時間にほとんど違いをもたらしませんでした。

4

3 に答える 3

6

scatter3実行に必要な時間と、解釈されている間にコンパイルさplot3れるという事実に起因する主な違い(関数を編集するときにわかるように)。同様にコンパイルされた場合、速度差は小さくなります。plot3scatter3scatter3

ループでプロットするのに必要な時間と一度にプロットするのに必要な時間の主な違いは、軸の子としてプロットにハンドルを追加することです(の出力を見てget(gca,'Children')ください)。したがって、複雑になります。ループ内の配列。これは私たち全員が遅いことを知っています。さらに、1回だけではなく複数の関数を頻繁に呼び出しているため、関数のオーバーヘッドからの呼び出しが発生します。

ここでは、軸の制限の再計算は問題になりません。実行した場合

for i = 1:10000
    plot3(X(i), Y(i), Z(i), 'o');
    drawnow;
end

これにより、Matlabは反復ごとに数値を更新します(これはかなり遅くなります)。これにより、軸の制限がまったく変更されないことがわかります(デフォルトの軸の制限は0と1であるため)。ただし、軸の制限が異なる方法で開始された場合でも、これらのデータに収束するために多くの反復を行う必要はありません。軸はすべてのステップで再計算されるため、を省略するhold onと、プロットに時間がかかります。

なぜこれらの異なる機能があるのですか?scatter3異なるマーカーサイズと色のポイントを単一のハンドルでプロットできますが、ループが必要で、を使用して各ポイントのハンドルを取得できますplot3。これは、速度だけでなくメモリの点でもコストがかかります。ただし、異なるポイント(またはポイントのグループ)を個別に操作する必要がある場合(それぞれに個別の凡例エントリを追加したい場合、それらを個別にオンまたはオフにできるようにしたい場合などplot3)、ループで使用することができます最良の(遅いですが)解決策になります。

于 2010-11-06T00:59:12.357 に答える
6

より高速なアプローチについては、この 3 番目のオプションを検討してください (低レベル関数 LINE を直接使用します)。

line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)

プロットのパフォーマンスの問題について説明しているいくつかの記事を次に示します。

于 2010-11-06T01:39:02.120 に答える
4

各ポイントの色を制御したい場合は、プロットを個別に呼び出す必要があるため、一括散乱の方が高速です。

また、 を呼び出していないため、タイミング情報が正確かどうかわかりません。drawnow実際の描画は の後に行われる可能性がありtocます。

要約すれば:

  • plot3多くの異なる場所で同じマーカーを描画するため、最速です
  • scatter3マーカーのサイズと色はポイントごとに (許可されている) 異なるため、多くの異なるマーカーを描画します。
  • 引数の解析などを繰り返し実行する必要があるため、ループでの呼び出しは非常に遅く、さらにプロットにポイントが追加されると、軸を再計算する必要があります
于 2010-11-06T00:23:21.713 に答える