2017-10-12 80 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); 

不過,我想提取d其中e[d] < pvs。有沒有像?

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 do 
         if e[i] < p then i; 

這個例子會變成這樣的事情:

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

個迷人的東西,奔。 **這種「嵌入式迭代器」**的實際成本是什麼?爲了在單個區域(本地主機)上加載關於10TB數據集(64位IEEE值)的關聯域,到8節點分佈式處理羣集上? – user3666197

+1

剛剛添加了一個例子,闡明'嵌入式迭代器'變成了一個串行循環,爲相關域添加索引。關聯域與其他語言中的「集合」非常相似,希望可以幫助您瞭解添加索引的成本。 var vs:domain(int,parSafe = false);這可以通過關閉並行安全性來加快速度。 – benharsh