matlab scatter3、plot3速度の矛盾
-
29-09-2019 - |
質問
これは、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を使用した個別プロット3:
>> 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
タイミングのコマンド - しかし、これは時代にほとんど違いをもたらしていません。
解決
実行に必要な時間の主な違い scatter3
と plot3
その事実から来ています plot3
しばしばコンパイルされています scatter3
解釈されます(関数を編集するときにわかるように)。もしも scatter3
編集された場合、速度の差は小さくなります。
ループでプロットするのに必要な時間と一度にプロットするのに必要な時間の主な違いは、軸に子供としてプロットにハンドルを追加することです(の出力を見てください get(gca,'Children')
)、そしてあなたはしたがって、ループ内で複雑な配列を栽培しています。さらに、一度だけでなくいくつかの関数を頻繁に呼び出しているため、関数のオーバーヘッドから呼び出しが発生します。
軸の制限の再計算はここでは問題ではありません。走ったら
for i = 1:10000
plot3(X(i), Y(i), Z(i), 'o');
drawnow;
end
Matlabは、すべての反復で図を更新する(そしてこれは非常に遅い)、軸の制限はまったく変化しないことがわかります(デフォルトの軸の制限は0と1です)。ただし、軸の制限が異なって開始されたとしても、これらのデータに収束するために多くの反復は必要ありません。省略することと比較してください hold on
, 、すべてのステップで軸が再計算されるため、プロットが長くなります。
なぜこれらの異なる機能があるのですか? scatter3
さまざまなマーカーサイズのポイントと単一のハンドルの下の色でポイントをプロットできますが、ループが必要で、各ポイントのハンドルを取得できます。 plot3
, 、これは速度の点でだけでなく、記憶の点でも費用がかかります。ただし、異なるポイント(またはポイントのグループ)と個別にやり取りする必要がある場合は、それぞれに個別の凡例エントリを追加する必要がある場合は、個別にオンとオフにすることができるようにする必要があります。 plot3
ループでは、最良の(遅い)ソリューションである場合があります。
他のヒント
より高速なアプローチの場合は、この3番目のオプションを検討します(低レベルの関数ラインを直接使用します)。
line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)
プロットのパフォーマンスの問題を議論する記事を次に示します。
さて、各ポイントの色を制御したい場合は、プロットを個別に呼び出す必要があるため、バルク散布量が高速になります。
また、あなたが電話していないので、あなたのタイミング情報が正確であるかどうかはわかりません drawnow
, 、したがって、実際の描画は後に行われる可能性があります toc
.
要約すれば:
plot3
多くの異なる場所で同じマーカーを描くため、最速ですscatter3
マーカーのサイズと色(許可されます)が各ポイントで変化するため、多くの異なるマーカーを描画します。- ループでの呼び出しは非常に遅いです。なぜなら、引数の解析などが繰り返し行われなければならないため、さらにポイントがプロットに追加されると、軸を再計算する必要がある必要があるため