基本上有这个:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
我想得到这个(垂直阅读/旋转 90 度):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
有人知道在 f# 中这样做的简单方法吗?
基本上有这个:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
我想得到这个(垂直阅读/旋转 90 度):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
有人知道在 f# 中这样做的简单方法吗?
我会通过转换为数组来做到这一点 -
let arr = input |> List.map (List.toArray) |> List.toArray //a array of arrays
let out = Array2D.create size1 size2 (fun x y -> arr.[y].[x])
您需要的称为矩阵转置。
最简单的方法是使用FSharp.PowerPack;Microsoft.FSharp.Math.Matrix
模块有Transpose
方法。
如果您更喜欢自己的解决方案,这里有一个很好地结合了短代码和执行效率的解决方案:
let rec transpose = function
| (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
| _ -> []
// use
[[1; 2; 3]; [4; 5; 6]; [7; 8; 9]]
|> transpose
|> printfn "%A"
还有一种方法是就地矩阵转置。它的复杂度为 O(n),但需要可变数据。