我正在尝试修改像这样的矩阵:
/ 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)
| _ ->[];;
答案 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])