sorting - F# - 对包含元组的矩阵进行排序

标签 sorting f# matrix tuples

我找不到对以下元组矩阵的列中包含的值进行排序的方法:

Matrix<float * float> =
  matrix [[(1.0, 145.0); (1.0, 45.0); (1.0, 130.0); (1.0, 30.0); (1.0, 130.0)]
          [(2.0, 45.0); (2.0, 45.0); (2.0, 30.0); (2.0, 30.0); (2.0, 30.0)]
          [(3.0, 130.0); (3.0, 30.0); (3.0, 145.0); (3.0, 45.0); (3.0, 130.0)]
          [(4.0, 30.0); (4.0, 30.0); (4.0, 45.0); (4.0, 45.0); (4.0, 30.0)]
          [(5.0, 130.0); (5.0, 30.0); (5.0, 130.0); (5.0, 30.0); (5.0, 145.0)]]

我想根据元组的第二个元素每列进行排序。例如这里的答案是:

   matrix [[(1.0, 145.0); (1.0, 45.0); (3.0, 145.0); (3.0, 45.0); (5.0, 145.0)]
          [(3.0, 130.0); (2.0, 45.0); (1.0, 130.0); (4.0, 45.0); (1.0, 130.0)]
          [(5.0, 130.0); (3.0, 30.0); (5.0, 130.0); (1.0, 30.0); (3.0, 130.0)]
          [(2.0, 45.0); (4.0, 30.0); (4.0, 45.0); (2.0, 30.0); (2.0, 30.0)]
          [(4.0, 30.0); (5.0, 30.0); (2.0, 30.0); (5.0, 30.0); (4.0, 30.0)]]

提前谢谢您!

最佳答案

根据我的经验,在使用数组(2D 和/或矩阵)时,我发现在内部使用数组通常是最快的方法。

例如,以可变方式组合 Daniel 和 Ankur 的方法:

let mutableSortByCol f (m:Matrix<'T>) =
    let columns = [| for c in 0 .. m.NumCols - 1 -> 
                         m.Column c |> Vector.Generic.toArray |]

    for c in 0 .. m.NumCols - 1 do 
        columns.[c] |> Array.sortInPlaceBy f

    Matrix.Generic.init (m.NumRows) (m.NumCols) (fun r c -> columns.[c].[r])

我将矩阵转换为列数组('a[][],而不是'a[,]),并对每列执行就地排序。之后,我用排序后的结果填充一个新的矩阵。请注意,原始矩阵保持不变:列数组由列向量的副本填充(Vector.toArray 创建一个新数组)。

这种方法速度更快,因为它不需要转置,对列进行适当的排序,并且不需要通过保持所有内容面向数组来与中间列表结构进行转换。我怀疑如果 Matrix 模块也支持与 'a[][] 之间的转换,它可能会变得更快,尽管它可能并不真正适合矩阵。

此外,如果您不知道:您可以利用 F# 的元组结构比较来按第二个元素降序、第一个元素升序排序:

示例:

> mutableSortByCol (fun (a,b) -> (-b,a)) M;;
val it : Matrix<float * float> =
  matrix [[(1.0, 145.0); (1.0, 45.0); (3.0, 145.0); (3.0, 45.0); (5.0, 145.0)]
          [(3.0, 130.0); (2.0, 45.0); (1.0, 130.0); (4.0, 45.0); (1.0, 130.0)]
          [(5.0, 130.0); (3.0, 30.0); (5.0, 130.0); (1.0, 30.0); (3.0, 130.0)]
          [(2.0, 45.0); (4.0, 30.0); (4.0, 45.0); (2.0, 30.0); (2.0, 30.0)]
          [(4.0, 30.0); (5.0, 30.0); (2.0, 30.0); (5.0, 30.0); (4.0, 30.0)]]

关于sorting - F# - 对包含元组的矩阵进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284809/

相关文章:

php - 我如何在 SilverStripe 3.1 中按字母顺序排序(但大写字母不是小写字母之前的一组)?

string - Delphi-如何实现按整数排序的整数和字符串排序表?

algorithm - 在 O(n log(log n)) 中对数组进行排序

visual-studio - 在 Visual Studio 中使用 F# 的 Xamarin Forms 应用程序

f# - 无法从 C# 类使用 F# 中的某些方法

f# - 在 F# 上从元组列表创建列表

Opencv Mat 添加奇怪的行为

python - 按内容的升序合并文本文件

algorithm - 内含 0 的极大方

r - 如何加快 data.table 中的逐行操作