【问题标题】:Equivalent functionality of Matlab unique() in MathNET.Numerics?MathNET.Numerics 中 Matlab unique() 的等效功能?
【发布时间】:2020-10-20 16:37:10
【问题描述】:

是否有 MathNET.Numerics 等效于 Matlab 的 unique(A, 'rows')(或 unique(A)),其中 AMatrix<double>

我在 MathNET.Numerics 库文档中进行了广泛搜索,但找不到与此功能类似的任何内容。类似的功能是否已经存在?

回忆 Matlab 的文档:

C = unique(A,'rows') 将 A 的每一行视为一个实体,并且 返回 A 的唯一行。数组 C 的行已排序 顺序。

【问题讨论】:

    标签: c# matlab mathnet-numerics


    【解决方案1】:

    没有内置任何内容,但您可以在矩阵行的Enumerable 上使用LinqDistinct() 方法。给定一个Matrix<double> x

    var y = Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
    

    Example

    写成extension method:

    public static Matrix<double> Unique(this Matrix<double> x) {
        return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().Distinct());
    }
    

    然后您可以将其称为:

    var y = x.Unique();
    

    这不会对行进行排序。如果需要,可以将其与 this answer 结合使用。

    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]));
    }
    

    Here's a big fiddle containing everything

    【讨论】:

    • unique() 的另一个方面是它也可以排序。我还需要在其中添加一个排序机制,否则这可行。
    • 添加起来相当简单,我修改了我的答案。我不是 Matlab 对矩阵排序的忠实粉丝,除非您明确指定不希望它排序,所以我喜欢为它们提供两个单独的函数。如果您希望在单个函数中使用它,这很容易做到。
    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多