web-dev-qa-db-ja.com

MATLABでのリアルタイムプロット

私はMATLABを初めて使用し、いくつかの計算のリアルタイムプロットを表示しようとしていました。 Nサイズのベクトルがあり、一度にmの値を処理します(たとえば、m = N/4)なので、最初のm値をプロットし、2番目のm値が計算されたらすぐに、最初のプロットを置き換えます。

私のアプローチは次のとおりです。

for i=1:N,
  ...
  //compute m
  ...
  plot(m);
end;

ただし、すべてのループでプロットの更新に失敗し、すべてのループが終了してデータをプロットするのを待ちます。私の質問は、plotの代わりに別の関数を使用する必要がありますか、それとも各ループに遅延を追加できますか?

毎回再プロットするのではなく、プロットを更新するために私が気付いていない方法があるに違いないと思います。

12
kirbuchi

DRAWNOWへの呼び出しを追加して、プロットを強制的に更新することができます。 リファレンスページ を参照してください。 DRAWNOWを使用すると、グラフィックイベントキューがフラッシュされ、コールバックなどが実行される可能性があることに注意してください。

11
Edric

Edricが言及 のように、 drawnow の呼び出しの後に plot コマンドを含めることをお勧めします。グラフィックの更新を強制します。ただし、プロット全体を毎回再作成する必要がない、プロットをアニメーション化するためのはるかに効率的でスムーズな方法があります。プロットを初期化し、プロットオブジェクトに handle をキャプチャしてから、 set コマンドを使用してループ内のそのオブジェクトのプロパティを変更するだけです。次に例を示します。

hLine = plot(nan);         % Initialize a plot line (which isn't displayed yet
                           %   because the values are NaN)
for i = 1:N                % Loop N times
  ...
  % Compute m here
  ...
  set(hLine, 'YData', m);  % Update the y data of the line
  drawnow                  % Force the graphics to update immediately
end

さらに、ループの前とplotの呼び出しの後、次の場合は、 軸の制限 などの数の 軸のプロパティ を設定できます。軸を固定したままにし、プロットされる新しいベクトルmごとに外観を変更しないようにします。

32
gnovice