2017-09-12 2 views
2

Supposons que notre chéri A ressembleComment faire une boucle sur un tableau trié par une dimension dans Chapel?

60.0 3.0 
675.0 3.0 
1050.0 4.0 
0.0  0.0 

Je veux faire une boucle à travers les rangées dans l'ordre décroissant de la première colonne. Quelque chose comme ...

for r in sorted(A, by=A[1,], reverse=True) { 
    writeln(r); 
} 

Je voudrais

1050.0 4.0 
675.0 3.0 
60.0 3.0 
0.0  0.0 

La documentation Sort ne traite pas des tableaux 2D.

+0

ce Apparait est également abordée dans [ce billet] (https://github.com/chapel-lang/chapel/issues/5724) –

Répondre

1

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]; 
    } 
}