8

リアルタイムでプロットする必要のある大きなデータセット(10 Hzデータ、つまり24時間あたり864kポイント)があります。アイデアは、ユーザーが非常に詳細な散布図にズームおよびパンできることです。

データはあまり連続的ではなく、スパイクがあります。データセットが非常に大きいため、プロットが更新されるたびにすべてのポイントをプロットすることはできません。

しかし、n番目のポイントごとにプロットすることもできません。そうしないと、大きいが短いスパイクなどの主要な機能を見逃してしまいます。

Matlabはそれを正しく行います。ゼロでいっぱいの864kベクトルを指定し、任意の1つのポイントを1に設定するだけで、ズームとパンを使用してリアルタイムで正しくプロットされます。

Matlabはどのようにそれを行いますか?

私のターゲットシステムはJavaなので、Swing/Java2Dでこのプロットのビューを生成します。

4

3 に答える 3

5

MATLABCentralのファイルを試してください。

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot-downsampled-plot

著者から:

このバージョンの「プロット」を使用すると、非常に多くの要素を含むデータを視覚化できます。大きなデータセットをプロットするとグラフィックが遅くなりますが、ほとんどの場合、プロットに表示されるすべての情報が必要になるわけではありません。画面には非常に多くのピクセルしかないため、画面にキャプチャされていない情報を目で検出することはできません。

この関数は、データをダウンサンプリングし、データのサブセットのみをプロットするため、メモリ要件が改善されます。プロットを拡大すると、より多くの情報が表示されます。外れ値が確実にキャプチャされるようにするために、いくつかの作業が行われます。

構文:

dsplot(x, y)  
dsplot(y)  
dsplot(x, y, numpoints)  

例:

x =linspace(0, 2*pi, 1000000);  
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x);  
dsplot(x,y1);
于 2009-02-03T20:02:39.123 に答える
2

Matlab がどのように行うのかはわかりませんが、Quadtreesから始めます。

すべてのデータ ポイントを四分木にダンプし、特定のズーム レベルでレンダリングするには、ピクセルのサイズに相当する領域に到達するまで四分木を下ります (表示されている領域と重なる領域から開始)。その領域の真ん中にピクセルを貼り付けます。

追加: OpenGL/JOGL で描画すると、描画が高速になります。特に、パンを予測し、表示リストなどに表示するポイントを構築できる場合は、新しいフレームに対して CPU の作業を行う必要がありません。

于 2009-02-03T20:05:15.997 に答える
0

10Hz データは、毎秒 10 フレームをプロットするだけでよいことを意味します。多くのゲームは、はるかに複雑なグラフィックで 100 fps を超えるため、簡単なはずです。

可能なデータ ポイントごとに毎秒 10 ピクセルをプロットすると、幅 600 ピクセルのウィジェットを使用して 1 分間分のデータを表示できます。600 番目から最後のサンプルまでのインデックスを保存すると、最新のデータだけを簡単に描画できるはずです。

10 秒ごとに新しいデータ ポイントがない場合は、補間されたデータ ポイントを挿入する方法を考え出す必要があります。次の 3 つの選択肢が思い浮かびます。

  1. 最後のデータポイントを繰り返します。
  2. 「空の」データポイントを挿入します。これにより、グラフにギャップが生じます。
  3. 次のデータポイントが到着するまでグラフを更新しないでください。次に、データポイント間の線形補間を使用して、一度に描画しなかったすべてのピクセルを挿入します。

アニメーションをスムーズにするには、ダブル バッファリングを使用します。ターゲット言語がキャンバス ウィジェットをサポートしている場合、おそらくダブル バッファリングをサポートしています。

元のデータ ポイントが連続していたとしても、ズームされたデータ ポイントは連続していないため、ズームする場合は上記と同じ 3 つの選択肢があります。

これは、Java での実装に役立つ場合があります。

于 2009-02-03T20:18:02.430 に答える