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