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