using MathNet.Numerics.LinearAlgebra;
public static class Extensions {
public static Matrix<double> UniqueSorted(this Matrix<double> x, int sortByColumn = 0, bool desc = false) {
var uq = x.EnumerateRows().Distinct();
return Matrix<double>.Build.DenseOfRows(uq.OrderByDescending(row => row[sortByColumn]));
return Matrix<double>.Build.DenseOfRows(uq.OrderBy(row => row[sortByColumn]));
public static Matrix<double> Unique(this Matrix<double> x) {
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
public static Matrix<double> SortRows(this Matrix<double> x, int sortByColumn = 0, bool desc = false) {
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().OrderByDescending(row => row[sortByColumn]));
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().OrderBy(row => row[sortByColumn]));
public static void Print(this Matrix<double> x) {
for (int i = 0; i < x.RowCount; i++)
for (int j = 0; j < x.ColumnCount; j++)
public static void Main(string[] args)
System.Random random = new System.Random();
Matrix<double> x = Matrix<double>.Build.Dense(10, 3);
for (int i = 0; i < x.RowCount; i++)
double r = random.NextDouble();
for (int j = 1; j < x.ColumnCount; j++) {
x[i, j] = random.NextDouble();
Console.WriteLine("\nSorted by column 0:");
var z = x.SortRows(0, true);
Console.WriteLine("\nSorted by column 0, descending:");
for (int i = 0; i < 4; i++) {
a.SetRow(9 - i, x.Row(i));
Console.WriteLine("\nMatrix with duplicates:");
Console.WriteLine("\nRemoved duplicates:");
var c = a.UniqueSorted(0);
Console.WriteLine("\nRemoved duplicates & sorted:");