2017-10-12 6 views
4

私は、条件に基づいてドメインのサブセットを作成したいと思います。私はループをすることができますが、私はインラインifを使用できるかどうかを調べています。ChapelでインラインIF配列コンストラクタを実行するにはどうすればよいですか?

ちょうど配列dを再作成することは

var d = {1..8}; 
var e = [0.875, 0.625, 0.625, 1.0, 0.625, 0.875, 0.625, 0.625]; 
var p = 0.7; 

var vs = for i in d do i; 
writeln(" vs: ", vs); 

のように見えますが、私はvsdどこe[d] < pを抽出したいです。のようなアプローチはありますか?

vs = [i in d where e[i] < p] 
writeln(vs); // {2,3,5,7,8} 

答えて

3

これはあなたの望ましい結果を与える必要があります。

var vs = for i in d do 
      if e[i] < p then i; 

vsが配列ではなくドメインであることを。あなたが使用できるドメインをしたい場合は、あなたが連想ドメインを使用する必要があります。

var vs : domain(int); 
for i in d { 
    if e[i] < p then 
    vs.add(i); 
} 
+0

美しい作品、ベン:

var vs : domain(int) = for i in d do if e[i] < p then i; 

この例では、このようなものに変わります。 ** 1つのロケール(localhost)v/sにロードされた約10TBのデータセット(64ビットIEEE値)の関連ドメインを処理するために、そのような「組み込みイテレータ」**の実際のコストはどれくらいになるか8ノードの分散処理クラスタに移行する – user3666197

+1

「埋め込みイテレータ」が連想ドメインにインデックスを追加するシリアルループに変わることを明確にした例を追加しました。連想ドメインは、他の言語の「集合」と非常によく似ています。インデックスを追加するコストについての良い考えが得られればうれしいです。これは、並列安全性をオフにすることで、より高速化できます。var vs:domain(int、parSafe = false); – benharsh

関連する問題