如何在 Chapel 中执行内联 IF 数组构造函数?

How to do an inline IF array constructor in 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);

但是,我想将 e[d] < p 中的 d 提取到 vs 中。有没有类似的方法?

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

这应该会给你想要的结果:

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