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 是一个输入,所以我从编译器那里得到了反馈。有什么建议吗?
chapel 编译器必须反对,
文档对此明确且清楚:
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);
曾经有位伟人说过,我有一个矩阵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 是一个输入,所以我从编译器那里得到了反馈。有什么建议吗?
chapel 编译器必须反对,
文档对此明确且清楚:
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);