How to sort a multidimensional ndslice?
9il
ilyayaroshenko at gmail.com
Tue Aug 18 04:07:56 UTC 2020
The following code just sorts each row:
------
/+dub.sdl:
dependency "mir-algorithm" version="~>3.9.24"
+/
import mir.ndslice;
import mir.ndslice.sorting;
import mir.algorithm.iteration: each;
void main() {
// fuse, not sliced if you use an array of arrays for argument
auto a = [[1, -1, 3, 2],
[0, -2, 3, 1]].fuse;
// make an index
a.byDim!0.each!(sort!larger);
import std.stdio;
writeln(a);
// [[3, 2, 1, -1], [3, 1, 0, -2]]
}
auto larger(C)(C u, C v) {
return u > v;
}
------
To reorder the columns data according to precomputed index:
------
/+dub.sdl:
dependency "mir-algorithm" version="~>3.9.24"
+/
import mir.ndslice;
import mir.series;
import mir.ndslice.sorting;
import mir.algorithm.iteration: each;
import mir.math.sum;
void main() {
// fuse, not sliced if you use an array of arrays for argument
auto a = [[1, -1, 3, 2],
[0, -2, 3, 1]].fuse;
// make an index
auto index = a.byDim!1.map!sum.slice;
auto s = index.series(a.transposed);
auto indexBuffer = uninitSlice!int(s.length);
auto dataBuffer = uninitSlice!int(s.length);
sort!larger(s, indexBuffer, dataBuffer);
import std.stdio;
writeln(a);
/// [[3, 2, 1, -1], [3, 1, 0, -2]]
}
auto larger(C)(C u, C v) {
return u > v;
}
-----
More information about the Digitalmars-d-learn
mailing list