相当于 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 推广)。