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

Sorting F#-对包含元组的矩阵进行排序,sorting,f#,matrix,tuples,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); (

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

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
,所以可能有更好的方法,但这似乎很有效:

let sortMatrix (m:Matrix<_>) =
  seq {
    for c in 0 .. (m.NumCols - 1) do
      let arr = [| for r in 0 .. (m.NumRows - 1) -> m.[r, c] |]
      arr |> Array.sortInPlaceBy (fun (_, b) -> -b : float) //(snd >> (~-))
      yield arr
  }
  |> Matrix.Generic.ofSeq 
  |> Matrix.Generic.transpose
让sortMatrix(m:矩阵)=
序号{
对于0中的c…(m.NumCols-1)do
设arr=[|对于0.(m.NumRows-1)->m[r,c]|]
arr |>Array.sortInPlaceBy(fun(|,b)->-b:float)/(snd>>(~-)
收益率
}
|>矩阵
|>矩阵.Generic.transpose

下面就是这样一个功能:

let sortByCol f (m:Matrix<'T>) = 
    let n = m.Transpose
    [for i = 0 to n.NumRows-1 do 
        yield [for j in n.Row(i) -> j] 
              |> List.sortBy f ]
    |> Matrix.Generic.ofList
    |> Matrix.Generic.transpose

更新:使按列排序功能通用。

根据我的经验,在使用数组(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])

let mutableSortByCol f(m:MatrixMy我的经验是计算表达式(seq{…})速度很慢,因此我不建议将其用于密集计算。但我没有测试这种情况下的速度,因此可能是错误的。我认为这可能是一种过于简单化的情况。通常计算的其他部分在开销方面会使
seq
相形见绌。我看到从基于列表或基于数组的方法切换到序列的方法时,速度有了巨大的提高lly取决于你在做什么。在这种情况下,我不能说它是否有效。我很快拼凑了它,由于我对
矩阵
缺乏经验,没有其他方法可以比较。谢谢,它非常有效!我不知道是否还有其他方法,如果有一天我找到另一种方法,我会让你知道的!谢谢lot@katter75:谢谢。我很高兴知道是否有更好的方法。@Daniel:只是想让你知道,这里由cfern提出的方法更快…很高兴知道;)太好了!实际上,它似乎要快得多!谢谢
matrix |> sortByCol (fun (_,b) -> -b)
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])
> 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)]]