02-26-2016 02:52 AM
久々にLabviewを使っていますが以下で止まってしまいました。
数万個の2D配列(座標です)を「配列から削除」関数を使い、削除後の配列から削除部分が他にないか検索して、存在すれば指標を返す、
(後にこの指標を用い削除)というようなviを作っています。また似たような質問の「2D配列検索」を作ってみて、上記関数を入れ込むと検出できなくなるります。
初歩的なミスと思い、少ないサンプル数でかつハイライトしてみたりしていろいろ試しましたがうまくいきません。最後の手段は配列をループで2行ずつ切り出して
比較(=、TRUE)と思ってますが、作動しない理由はなんでしょうか? よろしければご教授お願いいたします。
解決済! 解決策の投稿を見る。
02-26-2016 04:23 AM
これをチェックして
02-28-2016 01:19 AM
文章だけでは誤解があるかも知れないので、今使っているVIまたはブロックダイアグラムのスクリーンショットを添付して頂けると様々な方から意見をもらいやすいと思いますよ。
HatefさんのVIはいい感じですね。Kudos to you!
02-28-2016 03:09 AM
ありがとうございました
これは、IV の写真です
02-28-2016 08:12 AM - 編集済み 02-28-2016 08:13 AM
Hatefさん、すみません、「誤解があるかも知れません」というのはbottaさん宛のメッセージでした。
Thank you for your screenshot, Fouladi-san!
02-29-2016 01:14 AM
>数万個の2D配列(座標です)
座標データはCSVファイルで保存?
(なんとなく)クラスタの1D配列で処理された方が良いような気がします。
02-29-2016 02:49 AM
みなさまご回答申し訳ありません。
乱数を作りながら走らせると、とても時間がかかるので
ランダム関数で1万個の座標を作って、実際どれくらいの座標の重複があるか試して、
一つ二つぐらいの重複なら、データを表示用に上記の検査した座標をそのまま使おうと
思っていました。まだ途中ですがvi添付しますのでよろしくお願いします。
02-29-2016 07:49 AM
こういうことでしょうかね・・・?
X Y
1 2
2 3
3 4
1 2 ←これを検出して削除
4 5
5 6
1 2 ←これも検出して削除?
愚直なコードしか思いつかないですが。。。まずはこれで合っているかコメント頂けると有難く。
02-29-2016 08:32 AM
02-29-2016 11:06 AM
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)で作成しました。必要に応じて適宜変更してください。
目的のものはこちらでよろしいでしょうか。