Let's use "Array".

Hi, Let's 配列


配列はLabVIEWの肝だ!

ほとんどの計測では、データが時系列的に入ってきます。それらのデータを平均化したり、他の特性値との対応をとったり、ピーク値を求めたり、目的に応じて様々な処理を行います。当然、それらの一まとまりのデータは共通の変数タイプになります。言い換えると、計測処理で扱うデータの多くは時系列であり、共通な変数タイプであるという特徴があります。

これは、データを配列で表現するための必要条件に近いものです。つまり、配列には、共通な変数タイプであることからまとめて処理を行うことができるので実効速度が早く、プログラムの見通しも良いという利点があります。一方、配列は途中にデータを追加したり削除したりする操作はメモリ内のデータの移動が必要となり速度的に不利と考えられます。しかし、時系列の場合はデータの順序が固定的であるため、そのような操作の頻度が少ないため、不利な点がカバーされています。

LabVIEWでは特に配列を扱うFunctionが豊富に用意されており、低レベルのプログラミングの必要性がほとんどありません。これは、プログラミングの労力を省いてくれるだけでなく、速度的にも大きなメリットがあります。配列をうまく使ったLabVIEW流アルゴリズムを磨きましょう。

配列はLabVIEWの肝だ!という結論は飛びすぎでしょうか?

さて、たわごとは横においてマニュアルで配列の項を見ますと、第8章に20ページにわたってわかりやすく説明されています。でも肝なんだから、はじめてマニュアルを手にした人にもっと目立つような工夫が欲しい!Build ArrayとIndex Arrayの扱いは少し寂しいものを感じます。

Build Array

Build Arrayは似たようなアイコンが多いですね。印刷が悪いと区別が付かないかもしれませんが、Build Arrayはどれでしょうか?

(Fig.1)

正解は1です。LVに慣れていて、ワイヤリングされていれば、全然間違えないと思いますが、この微妙な違いが機能上大きな違いになります。Build Arrayは成長したり変身したりしますから、見た目は上のアイコンの違いよりさらに大きな違いです。

(Fig.2)

同じアイコンから変形されたものとは思いにくいですね。ちなみにファンクションメニューで表示されているものは左端のアイコンです。LVを始めたばかりの人がそばにいたら、一言おせっかいしてあげましょう。放っておくと1日、2日気が付かないかもしれません。

入力には"Array"と"Element"がありますがわかりにくい命名ですからFunction Reference Manualを読まないとなかなかしっくりこないかもしれません。私の場合、今回初めてまじめに読みました。説明を和訳しますと以下のようです。

「初期的にはBuild Arrayの入力はすべてElementになっています。Array入力に変更するには入力上でポップアップメニューを表示させChange to Arrayを選択します。1次元配列を生成するためにはスカラー制御器はElement入力に、1次元配列制御器はArray入力に接続します。2次元配列を生成するためには1次元配列制御器はElement入力に、2次元配列制御器はArray入力に接続します。一般的には、n次元配列を生成するためにはArray入力には同じ次元であるn次元配列制御器を接続し、Element入力には1次元低い(n-1)次元配列制御器を接続します。したがって、すべてのElement入力に2次元配列を接続した場合には3次元配列を生成する。」

"Array"と"Element"の命名は出力側の配列を基準にしたものだったようです。こんな感じですね。

(Fig.3)

Index Array

配列からデータを取り出すFunctionです。どうもアイコンの成長方法のせいか、2次元3次元となっていくと、どこに接続すると列で、行で、ページでなどと迷ってしまいます。基本的にはワイアリングの途中で次元を変更するというのは、それ以前の構想に誤りがあったということですから大きな声では言えませんが、私の場合はよくあります。その辺の所を見てみましょう。

(A)は1D Arrayから6列目のデータを取り出すダイアグラムです。作業を進める中、諸々の事情により途中で気が変わって2D Arrayに変更することにしました。そこで、Index Arrayの左下をツールで引き延ばします。入力されているArrayと次元が一致していないため(B)のダイアグラムのようにBroken wireになってしまいます。ここで入力を2D Arrayに変えると(C)のように動作可能になります。今まで接続していた端子が列で、下が行というイメージが頭に浮かんできてしまいます。ところが、(D)のように接続すると第1列の第6行ですね。

本当はNIの本社にがんばってもらって、次元が増えるときのアイコンを変更して一番上に新しく端子が生まれたように見せて欲しいところです。もちろん接続しているワイヤーは、自動的に下に移動してもらいます。いかがでしょうかライマーさん?(日本NIの前社長です)

とりあえずは、コンパネのIndex Displayと同じ順序と覚えておいてIndexを増減させて実際に動く方向で確認するか、一番下が列と覚えてしまうかすると良いでしょう。2次元は大丈夫でも3次元ぐらいになるとうろたえることがあります。

(Fig.4)

2D Sort

さて、この辺で実用的なVIをひとつ創ってみましょう。2次元の配列は表計算ソフトのようなもので、取り込んだデータを表計算タイプのファイル形式で保存してデータの操作を表計算ソフトで行うこともできます。もちろん、LabVIEWでも一通りのデータ操作ができます。はじめに書いたように配列を扱うFunctionが豊富に用意されており不自由はあまり感じないはずです。ただ、無くてはならない2次元のソートがないのが困った、困った。1次元のものはありますが、2次元はどこを探しても見つかりませんでした。

(Fig.5)

このVIの入力は2次元配列(Array IN)とソートするときに参照する列番号(Column)とソート順(Sort Order)の3つです。出力はソート済みの2次元配列(Array OUT)です。

行でソートしたいときにはTranspose 2D Arrayで転置してからソートします。

ソートのアルゴリズムは多種多様のものが考案されているので、参考にするために1冊買いこんできました。しかし、最も有力なクイックソートは意外に手順が複雑で、戦意喪失状態に陥りました。100列のデータの場合660回ぐらい列の移動が必要になるので、2次元のままソート処理をするとアルゴリズムとしては高速でもかなり時間がかかりそうです。

そこで考えたのがLabVIEW流アルゴリズム/あるものを使え!です。ダイアグラムを見ながら手順を追ってみてください。

1)入力の2次元配列(Array IN)の大きさを調べ、同じ大きさの配列(Array OUT)を作ります。

2)キーとなる列を抜き出す。--配列A(1次元)

3)Sort 1D Arrayで抜き出した列をソートする。--配列B(1次元)

4)配列Aから順に要素を取り出し、Search 1D Arrayを使って配列Bの何番目にあるか調べます。

5)Array INから対応する行を取り出し、4)で調べた結果に対応するArray OUTの行を入れ換える。

ここで問題になるのは、キー列に同じ数字が含まれている場合です。Search 1D Arrayは要素0からチェックして最初に見つけた要素番号を返します。たとえば、3個同じ数字があったときには毎回先頭の要素番号を返します。対象の配列は幸いにしてソートされていますので同じ数字は連続的に集まっています。そこでチェックボックス代わりのブーリアンアレイを用意し、一度使われた要素番号にチェックを入れることにします。Search 1D Arrayからえられた要素番号のブーリアン要素がチェックされていれば次のブーリアン要素を調べ、チェックされていないブーリアン要素の要素番号を見つけます。

6)ソート順が降順の場合は昇順でソートした後で、Reverse 1D Arrayを使って降順にします。

簡単で手抜きのような気がするかもしれませんが、なかなか高速にソートしてくれます。もっと早いVIを作られた方は、是非発表してください。どんなときに使うかは人によって違うと思いますが、よく例に出されるのは、クラスの生徒の5教科のテストテスト結果を総合順位でソートする、といったものです。x,y 座標の中にある多数の点の中からある点に最も近い点を選ぶ、といったときには必須です。

以上で自己流の配列の解説を終わりにします。知っている人は知っているという内容で恐縮ですが、始めたばかりの人のとっかかりになれば幸いです。

--------------------------------------------------------------------

手元には2年半前のLV3.0.1用のマニュアル( ユーザーマニュアル; P/N 320651-01、 Function Reference Manual; P/N 320535-01、 Analysis VI Reference Manual; 320538-01 )しかありませんので、ひょっとしたら大幅に改善されているかも?(注意;文中の引用は上記によっています。)


2年前にLabVIEWユーザー会で発表させてもらったものです。時間はたってしまいましたが、LV4でも大きな変更はありませんでしたので、ほぼ無修正で再録しました。最後の2次元ソートのVIは "Love! LabVIEW" (http://www.tk.airnet.ne.jp/quattro/)のVIライブラリで提供されている"2次元アレイ高速ソート"の方が高速なので実際に使用するときはそちらの方がお勧めです。

98.05.31 大橋 康司

ohashi@mac.email.ne.jp


戻る