Chapel:你能重新索引一个域吗?

Chapel: Can you re-index a domain in place?

曾经有位伟人说过,我有一个矩阵A。不过这次她有一个朋友B。就像蒙太古家族和凯普莱特家族一样,他们有不同的领域。

// A.domain is { 1..10, 1..10 }
// B.domain is { 0.. 9, 0.. 9 }

for ij in B.domain {
  if B[ij] <has a condition> {
    // poops
    A[ij] = B[ij];
  }
}

我的猜测是我需要重新索引以便 B.domain{1..10, 1..10}。因为 B 是一个输入,所以我从编译器那里得到了反馈。有什么建议吗?

编译器必须反对,
文档对此明确且清楚:

Note that querying an array's domain via the .domain method or the function argument query syntax does not result in a domain expression that can be reassigned. In particular, we cannot do:

VarArr.domain = {1..2*n};

如果 <has_a_condition> 是非干预且没有副作用的,则表达意愿的解决方案可能会使用类似于这种纯连续的域运算符-域,索引翻译:

forall ij in B.domain do {
   if <has_a_condition> {
      A[ ij(1) + A.domain.dims()(1).low,
         ij(2) + A.domain.dims()(2).low
         ] = B[ij];
   }
}

有一个 reindex 数组方法可以完成此操作,您可以为结果创建一个 ref 以防止创建新数组:

var Adom = {1..10,1..10},
    Bdom = {0..9, 0..9};

var A: [Adom] real,
    B: [Bdom] real;

// Set B to 1.0
B = 1;

// 0-based reference to A -- note that Bdom must be same shape as Adom
ref A0 = A.reindex(Bdom);

// Set all of A's values to B's values
for ij in B.domain {
  A0[ij] = B[ij];
}

// Confirm A is now 1.0 now
writeln(A);