1

基本上有这个:

[
[1;2;3];
[4;5;7];
[8;9;0];
]

我想得到这个(垂直阅读/旋转 90 度):

[
[1;4;8];
[2;5;9];
[3;7;0];
]

有人知道在 f# 中这样做的简单方法吗?

4

2 回答 2

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])
于 2012-06-01T11:23:04.583 回答
4

您需要的称为矩阵转置

动力单元

最简单的方法是使用FSharp.PowerPackMicrosoft.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),但需要可变数据。

于 2012-06-01T11:55:22.483 回答