NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

2D配列 削除部分の検索

解決済み
解決策を見る

 久々にLabviewを使っていますが以下で止まってしまいました。

 数万個の2D配列(座標です)を「配列から削除」関数を使い、削除後の配列から削除部分が他にないか検索して、存在すれば指標を返す、

(後にこの指標を用い削除)というようなviを作っています。また似たような質問の「2D配列検索」を作ってみて、上記関数を入れ込むと検出できなくなるります。

初歩的なミスと思い、少ないサンプル数でかつハイライトしてみたりしていろいろ試しましたがうまくいきません。最後の手段は配列をループで2行ずつ切り出して

比較(=、TRUE)と思ってますが、作動しない理由はなんでしょうか? よろしければご教授お願いいたします。

 

 

    

0 件の賞賛
メッセージ1/18
5,895件の閲覧回数

これをチェックして

メッセージ2/18
5,880件の閲覧回数

文章だけでは誤解があるかも知れないので、今使っているVIまたはブロックダイアグラムのスクリーンショットを添付して頂けると様々な方から意見をもらいやすいと思いますよ。

 

HatefさんのVIはいい感じですね。Kudos to you!

0 件の賞賛
メッセージ3/18
5,833件の閲覧回数

ありがとうございました
これは、IV の写真です

thi.jpg

0 件の賞賛
メッセージ4/18
5,827件の閲覧回数

Hatefさん、すみません、「誤解があるかも知れません」というのはbottaさん宛のメッセージでした。

 

Thank you for your screenshot, Fouladi-san!

0 件の賞賛
メッセージ5/18
5,815件の閲覧回数

>数万個の2D配列(座標です)

座標データはCSVファイルで保存?
(なんとなく)クラスタの1D配列で処理された方が良いような気がします。

 

0 件の賞賛
メッセージ6/18
5,786件の閲覧回数

  みなさまご回答申し訳ありません。

 乱数を作りながら走らせると、とても時間がかかるので

ランダム関数で1万個の座標を作って、実際どれくらいの座標の重複があるか試して、

一つ二つぐらいの重複なら、データを表示用に上記の検査した座標をそのまま使おうと

思っていました。まだ途中ですがvi添付しますのでよろしくお願いします。

0 件の賞賛
メッセージ7/18
5,779件の閲覧回数

こういうことでしょうかね・・・?

 

X     Y

1     2

2     3

3     4

1     2 ←これを検出して削除

4     5

5     6

1     2 ←これも検出して削除?

 

愚直なコードしか思いつかないですが。。。まずはこれで合っているかコメント頂けると有難く。

0 件の賞賛
メッセージ8/18
5,762件の閲覧回数
use delete from array and search again until it make -1
it means that there no search file
0 件の賞賛
メッセージ9/18
5,757件の閲覧回数

botta様の意図を正確に理解できているか自信がありませんが、添付していただいたVIと最初の質問文からbotta様の求める機能を推測して作ってみました。

 

指定した数のランダムな2次元座標を生成し、そこから重複するものを削除して出力しています。

 

以下が動作の流れです。

(1) Generate random coordinatesでランダムな2次元座標を生成しています。Number of coordinatesで生成する座標の数を、Coef.で乱数の範囲を指定します。このループはbotta様のVIを改良しています。ちなみに、添付していただいたVI(心臓5.2.vi)の数値3がNumber of coordinatesに、数値2がCoef.に相当します。

(2) While Loop中では、まずi番目の要素を取ってきます。空の配列ではない(=配列の終わりではない)場合には、FALSEケースを実行します。

(3) FALSEケースでは、Compare elementsループでi番目の要素とi+1番目から最後までの部分配列を比較します。基礎群の比較と条件付きトンネルを使って、同じ座標を持つ指標の配列を作成します。

(4) 部分配列を取り出す前の配列の指標に直すためにi+1を足し、Delete overlap elementsループで元の配列からそれらの要素を削除します。削除する毎に配列の長さが1つずつ短くなっていくので、iを引いています。

(5) (2)-(4)を繰り返して、(2)で空の配列を得たら(=配列の終わりにきたら)、Whileループが停止します。TRUEケースでは単にシフトレジスタ間をつないでいるだけです。

 

LabVIEW 14.0.1f3にて作成したVIも添付しておきます。

注意点ですが、(1)のループにおいて、添付VIではいくつかの精度が混在してややこしかったので全て倍長整数(I32)で作成しました。必要に応じて適宜変更してください。

 

目的のものはこちらでよろしいでしょうか。

 

Nonoverlap_array.png

0 件の賞賛
メッセージ10/18
5,747件の閲覧回数