2017-10-12 3 views
4

Je voudrais créer un sous-ensemble d'un domaine basé sur un conditionnel. Je pourrais faire une boucle, mais je cherche à voir si je peux utiliser un inline si.Comment faire un constructeur de tableau IF en ligne dans Chapel?

Il suffit de re-créer le tableau d ressemble

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); 

Cependant, je veux extraire le de[d] < p en vs. Y a-t-il une approche similaire?

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

Répondre

3

Cela devrait vous donner le résultat souhaité:

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

Notez que vs est un tableau et non un domaine. Si vous voulez un domaine que vous pouvez utiliser, vous devez utiliser un domaine associatif:

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

Cet exemple va se transformer en quelque chose comme ceci:

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

Une belle pièce, Ben. ** Quels sont les coûts réels d'un tel "itérateur incorporé" ** qui devraient être accumulés afin de traiter un domaine associatif pour environ un ensemble de données de 10 To (valeurs IEEE 64 bits) sur une seule locale (localhost) v/s chargé sur un cluster de traitement réparti à 8 nœuds? – user3666197

+1

Juste ajouté un exemple clarifiant que «l'itérateur incorporé» se transforme en une boucle en série qui ajoute des indices au domaine associatif. Un domaine associatif est très similaire à un «ensemble» dans d'autres langues, ce qui, espérons-le, vous donne une bonne idée du coût de l'ajout d'indices. Cela pourrait être rendu plus rapide en désactivant la sécurité parallèle: var vs: domain (int, parSafe = false); – benharsh