MathNET.Numerics 中 Matlab unique() 的等效功能?
Equivalent functionality of Matlab unique() in MathNET.Numerics?
有没有等价于 Matlab 的 unique(A, 'rows')
(或 unique(A)
)的 MathNET.Numerics,其中 A
是 Matrix<double>
?
我在 MathNET.Numerics 库文档中进行了广泛搜索,但找不到任何类似此功能的内容。类似的功能是否已经存在?
回顾 Matlab 的文档:
C = unique(A,'rows') treats each row of A as a single entity and
returns the unique rows of A. The rows of the array C are in sorted
order.
没有任何内置内容,但您可以在矩阵的 Enumerable
行上使用 Linq
的 Distinct()
方法。给定一个 Matrix<double> x
,
var y = Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
写成 extension method:
public static Matrix<double> Unique(this Matrix<double> x) {
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
}
然后您可以将其称为:
var y = x.Unique();
这不会对行进行排序。如果需要,可以将其与 .
结合使用
public static Matrix<double> UniqueSorted(this Matrix<double> x, int sortByColumn = 0, bool desc = false) {
var uq = x.EnumerateRows().Distinct();
if (desc)
return Matrix<double>.Build.DenseOfRows(uq.OrderByDescending(row => row[sortByColumn]));
else
return Matrix<double>.Build.DenseOfRows(uq.OrderBy(row => row[sortByColumn]));
}
有没有等价于 Matlab 的 unique(A, 'rows')
(或 unique(A)
)的 MathNET.Numerics,其中 A
是 Matrix<double>
?
我在 MathNET.Numerics 库文档中进行了广泛搜索,但找不到任何类似此功能的内容。类似的功能是否已经存在?
回顾 Matlab 的文档:
C = unique(A,'rows') treats each row of A as a single entity and returns the unique rows of A. The rows of the array C are in sorted order.
没有任何内置内容,但您可以在矩阵的 Enumerable
行上使用 Linq
的 Distinct()
方法。给定一个 Matrix<double> x
,
var y = Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
写成 extension method:
public static Matrix<double> Unique(this Matrix<double> x) {
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
}
然后您可以将其称为:
var y = x.Unique();
这不会对行进行排序。如果需要,可以将其与
public static Matrix<double> UniqueSorted(this Matrix<double> x, int sortByColumn = 0, bool desc = false) {
var uq = x.EnumerateRows().Distinct();
if (desc)
return Matrix<double>.Build.DenseOfRows(uq.OrderByDescending(row => row[sortByColumn]));
else
return Matrix<double>.Build.DenseOfRows(uq.OrderBy(row => row[sortByColumn]));
}