基本上有这个:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
我想得到这个(垂直读/转90度):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
任何人都知道在f#中执行此操作的简单方法吗?
答案 0 :(得分:5)
我会通过转换为数组来实现 -
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])
答案 1 :(得分:4)
您需要的是矩阵换位。
最简单的方法是使用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"
另一种方法是in-place matrix transposition。它具有O(n)的复杂性,但需要可变数据。