Часовня: Можете ли вы переиндексировать домен на месте?
Великий человек однажды сказал, у меня есть матрица 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];
}
}