F#中的矩阵转置

时间:2015-10-01 15:23:40

标签: f# functional-programming

我正在尝试修改像这样的矩阵:

/ 1 2 3 \
\ 4 5 6 /

返回:

  / 1 4 \
  | 2 5 |
  \ 3 6 /
相反,它是在角落翻转我的矩阵。这是我到目前为止的代码:

Let rec matrixadjust = function
  | (_::_) : : as xss-> List.map List.head xss :: matrixadjust (List.map List.tail xss)
  | _ ->[];;

2 个答案:

答案 0 :(得分:2)

假设您的数据结构是列表,其中每个子列表代表一行,您可以这样做。基本上它每个源列表行循环一次,并在partial绑定中累积结果。自从进行列表累积后,它会反转值的顺序,因此您必须在最后的每一行上执行List.rev

let flip matrix = 
  match matrix with
  | [] -> []
  | x::xs ->
    let rec loop matrix partial = 
      match matrix with
      | [] -> partial
      | y::ys ->let newPartial = (y, partial) ||> List.map2(fun x y->x::y)
                loop ys newPartial
    let length = List.length x
    loop matrix (List.init length (fun _ -> [] ))
    |> List.map(fun x->x |> List.rev)

答案 1 :(得分:2)

我认为使用矩阵的最佳方法是使用Array2D data structure。您可以从数组数组构建一个Array2D,然后创建一个新的Array2D来完成您想要的任务:

let arrayOfArrays = [| [| 1; 2; 3 |]; [|4; 5; 6 |] |]
let array2d = Array2D.init 2 3 (fun row column -> arrayOfArrays.[row].[column])     
let newArray = Array2D.init (array2d |> Array2D.length2) (array2d |> Array2D.length1) (fun r c -> array2d.[c,r])