如何在 Chapel 中创建参差不齐的数组
How to create a ragged array in Chapel
我正在尝试创建 "array of arrays" 所有不同的长度。例如
A = [[1 2 5 ]
[3 5]
[2 6 9]]
Chapel 是强类型的,我不知道如何声明和填充 A
。我第一次使用它是遍历 A
并找到一组独特的元素,如
[1 2 3 5 6 9]
所以看一个构造和使用的例子会很有用。谢谢!
我们称此功能为 "skyline" 数组或 "jagged" 数组。虽然 Chapel 目前不直接实现它,但使用记录很容易实现。例如,外层数组的每个元素可以是一条记录,记录对应的内层数组及其域:
record InnerArray {
var dom: domain(1); // starts out empty
var arr: [dom] int;
// Optional function: when printing an InnerArray, do not show the domain.
proc writeThis(c: channel) { c.write("["); c.write(arr); c.write("]"); }
}
proc initElem(ref dest: InnerArray, src: []) {
dest.dom = src.domain;
dest.arr = src;
}
var A: [1..3] InnerArray;
initElem(A[1], [1,2,5]);
initElem(A[2], [3,5]);
initElem(A[3], [2,6,9]);
// The default printout invokes writeThis on each element of A.
writeln(A);
// To iterate over all inner elements, need nested loops.
// If appropriate, either/both can be "forall".
for outer in A do
for inner in outer.arr do
writeln(inner);
我正在尝试创建 "array of arrays" 所有不同的长度。例如
A = [[1 2 5 ]
[3 5]
[2 6 9]]
Chapel 是强类型的,我不知道如何声明和填充 A
。我第一次使用它是遍历 A
并找到一组独特的元素,如
[1 2 3 5 6 9]
所以看一个构造和使用的例子会很有用。谢谢!
我们称此功能为 "skyline" 数组或 "jagged" 数组。虽然 Chapel 目前不直接实现它,但使用记录很容易实现。例如,外层数组的每个元素可以是一条记录,记录对应的内层数组及其域:
record InnerArray {
var dom: domain(1); // starts out empty
var arr: [dom] int;
// Optional function: when printing an InnerArray, do not show the domain.
proc writeThis(c: channel) { c.write("["); c.write(arr); c.write("]"); }
}
proc initElem(ref dest: InnerArray, src: []) {
dest.dom = src.domain;
dest.arr = src;
}
var A: [1..3] InnerArray;
initElem(A[1], [1,2,5]);
initElem(A[2], [3,5]);
initElem(A[3], [2,6,9]);
// The default printout invokes writeThis on each element of A.
writeln(A);
// To iterate over all inner elements, need nested loops.
// If appropriate, either/both can be "forall".
for outer in A do
for inner in outer.arr do
writeln(inner);