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.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) の複雑さがありますが、変更可能なデータが必要です。

于 2012-06-01T11:55:22.483 に答える