相当于 Chapel 中 Octave 的 `meshgrid`
Equivalent of Octave's `meshgrid` in Chapel
Octave 提供了一个名为 meshgrid
的实用函数,它可以生成点字段。这在大规模模拟中非常有用,可以在某些点评估函数。使用 Chapels Domain
功能,可以分发网格。是否有提供此功能的库?
这不是完全通用的(或经过详细测试),但是对于原型来说怎么样
proc meshgrid(arrs : ?T ... ?nsize) where
isArray(T) && (nsize > 0)
{
const lo = arrs.indices.first;
// All elements have the same type T, so we only need to check that.
assert(arrs[lo].rank==1);
type retType = nsize*arrs[lo].eltType;
// Define the output domain
var tmp : nsize*range;
for ii in arrs.indices do (tmp(ii),) = arrs[ii].domain.dims();
var Dom = {(...tmp)};
var retval : [Dom] retType;
forall ijk in Dom {
for ii in lo.. #nsize do retval[ijk](ii) = arrs(ii)[ijk(ii)];
}
return retval;
}
这是一个例子
var x = [1,2,5];
var y = [2,1];
writeln(meshgrid(x,y));
产生
(1, 2) (1, 1)
(2, 2) (2, 1)
(5, 2) (5, 1)
我选择将索引保存为元组元素,因为就我使用它的方式而言这似乎是最自然的(考虑到 Chapel 推广)。
Octave 提供了一个名为 meshgrid
的实用函数,它可以生成点字段。这在大规模模拟中非常有用,可以在某些点评估函数。使用 Chapels Domain
功能,可以分发网格。是否有提供此功能的库?
这不是完全通用的(或经过详细测试),但是对于原型来说怎么样
proc meshgrid(arrs : ?T ... ?nsize) where
isArray(T) && (nsize > 0)
{
const lo = arrs.indices.first;
// All elements have the same type T, so we only need to check that.
assert(arrs[lo].rank==1);
type retType = nsize*arrs[lo].eltType;
// Define the output domain
var tmp : nsize*range;
for ii in arrs.indices do (tmp(ii),) = arrs[ii].domain.dims();
var Dom = {(...tmp)};
var retval : [Dom] retType;
forall ijk in Dom {
for ii in lo.. #nsize do retval[ijk](ii) = arrs(ii)[ijk(ii)];
}
return retval;
}
这是一个例子
var x = [1,2,5];
var y = [2,1];
writeln(meshgrid(x,y));
产生
(1, 2) (1, 1)
(2, 2) (2, 1)
(5, 2) (5, 1)
我选择将索引保存为元组元素,因为就我使用它的方式而言这似乎是最自然的(考虑到 Chapel 推广)。