fractal
fractal

Reputation: 105

Matrix transposition in F#

I'm trying to modify a matrix like this one:

/ 1 2 3 \
\ 4 5 6 /

to return:

  / 1 4 \
  | 2 5 |
  \ 3 6 /

Instead it is flipping my matrix by the corners. This is the code I have so far:

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

Upvotes: 3

Views: 1931

Answers (2)

user1229323
user1229323

Reputation:

I think that the best way to work with matrix is using the Array2D data structure. You can build an Array2D from an array of arrays and then create a new Array2D to acomplish what you want:

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

Upvotes: 4

N_A
N_A

Reputation: 19897

Assuming your data structure is a list of lists where each sub-list represents a row you could do it like this. Basically it loops once per source-list row and accumulates the result in the partial binding. Since its doing list accumulation, it reverses the order of the values so you have to do a List.rev on each row at the end.

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)

Upvotes: 3

Related Questions