基本的にこれを持っています:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
私はこれを手に入れたいです(縦に読む/ 90度回転させてください):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
f# でこれを行う簡単な方法を知っている人はいますか?
基本的にこれを持っています:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
私はこれを手に入れたいです(縦に読む/ 90度回転させてください):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
f# でこれを行う簡単な方法を知っている人はいますか?
私は配列に変換することによってそれを行います-
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])
必要なものは、行列転置と呼ばれます。
最も簡単な方法は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"
さらに別のアプローチは、インプレース行列転置です。O(n) の複雑さがありますが、変更可能なデータが必要です。