2

一位伟人曾经说过,我有一个矩阵A。但这一次她有一个朋友B。像 Montagues 和 Capulets 一样,他们有不同的领域。

// 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.domainis {1..10, 1..10}。由于 B 是一个输入,我会从编译器那里得到回击。有什么建议么?

4

2 回答 2

1

有一个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);
于 2017-09-01T00:12:51.840 回答
0

编译器必须反对,
文档对此很明确:

.domain请注意,通过方法或函数参数查询语法查询数组的域不会导致可以重新分配的域表达式。特别是,我们不能这样做:

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];
   }
}
于 2017-09-01T00:01:46.963 回答