2

Chapel 中的expand命令返回一个新域。我想增加一个域,有点像

var d: domain(1) = {1..5};
writeln(d);
 --{1..5}
expand(d)(1);
writeln(d);
 --{1..6};
4

2 回答 2

3

expand从 Chapel 1.15开始,域上的方法没有就地选项。您需要将结果分配给expand所需的域:

var eDom = {1..5};
eDom = eDom.expand(1);
writeln(eDom); // {0..6}

这听起来不像expand是你想要的,因为expand会在每个维度的两个方向上增长域。要将一个索引添加到矩形域,您可以将域文字分配给您的域:

var rDom = {1..5};
const hi = rDom.last + 1;
rDom = {rDom.first..hi};
writeln(rDom); // {1..6}

对于不规则域,您可以使用以下add方法:

var aDom = {1, 3, 5, 7}; // an associative domain
aDom.add(9);
writeln(aDom.sorted()); // 1 3 5 7 9

请注意,您不能add在矩形域上使用该方法。这在Chapel 语言规范0.983版的第 19.8.6 节中定义。

于 2017-08-28T16:52:11.073 回答
1

一些关于扩展的在线实验domain

有些按记录工作,有些则没有:

var      d: domain(1) = {1..5};
writeln( d );                      // SET {1..5}
//      {1..5}

var      e: domain(1) = d.expand(1);
writeln( e );                      // OK, DOMAIN d == {1..5} EXTENDED ON BOTH ENDS INTO {0..6}
//      {0..6}

var      AonD: [d] int;
         AonD.push_back(1);
writeln( AonD.domain );            // OK, DOMAIN EXTENDED INDIRECTLY ON DESIRED END INTO {1..6}
//      {1..6}

// var      f: domain(1) = {1..5}; // NEW {1..5} - A NON-SHARED, NON-USED ( NON-MAPPED ) DOMAIN
//          f.add(6);              // FAILS v/s A PROMISE IN: http://chapel.cray.com/docs/master/builtins/internal/ChapelArray.html#ChapelArray.add
//          f  += 6;               // FAILS
// writeln( f );
于 2017-08-28T13:26:20.337 回答