potass' blog

ポタシウムのことが書いてないブログ。

LabView で逐次更新する XY プロット

LabView で逐次更新する XY プロットをしたい場合はループの中にプロットの関数入れてそこにそれまでのデータを入力すればいい。その場合、データはもとの配列に「配列連結追加」関数を使って追加していくケースが多いと思う。

ただ、大規模なプログラムのパフォーマンスとメモリに関する問題 - National Instruments にあるように要素が大きい配列に対して「配列連結追加」関数で追加していくとメモリ的に問題が起こりうるとのこと。解決策としては十分大きな初期配列を作ってそれに「配列置換」関数を使って要素を追加していけばいいのだが、0 で初期化するとフロントパネルで (0, 0) という点が生まれてしまい、非常に見づらくなってしまう。

と、悩んでたところ Solved: 配列連結追加を使用せずにXYグラフの表示更新 - NI Community にあるように NaN で初期化しちゃえば OK ということを知った。実装は次のようにすればいい。
f:id:potass:20141206022953p:plain
▲ 上の方法が推奨となる「配列置換」型の逐次更新。下がよくある「配列連結追加」型の逐次更新。予め想定される大きさ+α分の初期配列を用意することが重要。

さて、出てきた1次元配列を最後 CSV 等にしてファイルへ出力したいとき、末尾にある大量の NaN が邪魔になるのでリサイズを行う。
f:id:potass:20141206023002p:plain
▲ 末尾の要素から NaN と等しいか比較して等しくなくなったら先頭からその要素までの部分配列を吐き出す。

リサイズが終わったら LabView での CSV 出力 - potass' blog にある手順で出力しちゃえばいい。

参考になるもの

NaN で初期化すると XY プロットで表示されないよということをこれで知った。

研究室で使う程度の VI は比較的小規模だが予期せぬバグを産まないためにも最適化を心がけるのは重要。これらに気をつけてやっていきたい。