Comme vous avez pu le constater, le module Trier ne prend actuellement en charge que les tableaux 1D.
Pour contourner ce problème, vous pouvez écrire un wrapper sort()
qui restructure vos données en un tableau de tableaux et trier dessus, si vous êtes prêt à accepter une pénalité en termes de performances, en raison de la création d'un temp- tableau et itérer sur deux fois.
Un exemple:
use Sort;
var A: [1..4, 1..2] real = ((60.0, 3.0), (675.0, 3.0), (1050.0, 4.0), (0.0, 0.0));
writeln('A:');
writeln(A);
sort2D(A, axis=2, reversed=true);
writeln('A sorted:');
writeln(A);
/* 2D sort wrapper using temp array */
proc sort2D(A: [?D] ?t, axis=1, reversed=false) {
const (rows, cols) = A.shape;
// array of arrays
var tmp: [D.dim(1)] [D.dim(2)] t;
for row in D.dim(1) {
tmp[row] = A[row, ..];
}
var cmp = new Comparator2D(axis, reversed);
sort(tmp, comparator=cmp);
for row in D.dim(1) {
A[row, ..] = tmp[row];
}
}
/* Comparator for arrays of arrays */
record Comparator2D {
const axis = 1,
reversed = false;
proc key(a) {
if reversed then
return -a[axis];
else
return a[axis];
}
}
ce Apparait est également abordée dans [ce billet] (https://github.com/chapel-lang/chapel/issues/5724) –