2017-09-12 5 views
2

は、私が最初の列の降順で行をループしたくチャペルで1次元でソートされた配列をループする方法は?

60.0 3.0 
675.0 3.0 
1050.0 4.0 
0.0  0.0 

のように私たちの最愛のAが見えたとします。以下のような何か...

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

私は

1050.0 4.0 
675.0 3.0 
60.0 3.0 
0.0  0.0 

Sortドキュメントは、2D配列に対応していませんしたいと思います。

+0

は、これはまた、[このチケット(https://github.com/chapel-lang/chapel/issues/5724)で説明されて表示されます –

答えて

1

ご覧のとおり、ソートモジュールは現在、1Dアレイのみをサポートしています。

この問題を回避するには、sort()ラッパーを作成して、データを配列の配列に再構成して並べ替えることができます。パフォーマンス上のペナルティを受け入れる場合は、それを2回繰り返します。

この例:

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]; 
    } 
} 
関連する問題