Часовня: Можете ли вы переиндексировать домен на месте?

Великий человек однажды сказал, у меня есть матрица 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 является входом, я получаю ответный удар от компилятора. Какие-либо предложения?

2 ответа

Решение

Есть 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);

компилятор часовни должен возражать,
Документация является четкой и ясной по этому вопросу:

Обратите внимание, что запрос домена массива через .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];
   }
}
Другие вопросы по тегам