2016-04-19 5 views
0

私は経由して、インデックスと要素を示すタプルのリストから通常のリストを形成してきたO'CamlOCamlリストモジュールのみを使ってリストの行列リストを作成するには?

を使用して行列を形成するために、どのように思っていた:私はやってみたかった

List.map (fun (idx, x) -> x) list 

これは、再帰またはループを使用しない行列に対してです。ただ、高階関数とList.module

:それは最速の方法ではないかもしれませんが、私はあなたのアプローチがうまくいくと思う

+0

あなたの機能はあなたの言うことをしていないようです。要素を無視してインデックスのリストを作成します。行列に関してあなたが求めていることは明確ではありません。トリプル(index1、index2、element)のリストがあると言っていますか?インデックスが0(つまり)から始まり、密になることを保証していますか?彼らは秩序あるでしょうか? –

+0

@JeffreyScofield私はちょうどそれを修正しました、それはタイプミスでした。私の悪い。そして、はい、私はトリプル(index1、index2、要素)のリストを取得しようとしています。行列を転置しようとする私のアプローチは次のとおりです。1.各要素にフラグを付けるか、それを表す数値をmapiで渡します。2.マトリックスを位置の情報を与えるタプルの大きなリストに集約します3.タプルのリストを繰り返し、行列を改変するために@を使って行列をアセンブルしてください。 – Crowning

+0

数日前に誰かが[リストのリストとして表された行列を転置する方法を尋ねました](http:// stackoverflow。 com/questions/36672807/combined-a-column-of-ocaml)を参照してください。 –

答えて

2

(コンテキストは私が行列を与えられた行列を転置しようとしています)。

インデックスと要素のセットからリスト(またはリストのリスト)を作成する単純な関数はありません。インデックスが持つすべての値(重複、値の欠落、順序の乱れなど)のために、そのような関数のクリーンでシンプルな定義を行うのは難しいです。

私は欠けているステップは、トリプルのリストを希望の順序にソートすることだと思います。 Listモジュールにはソート関数があるので、これはおそらくあなたの制限によって許されています。

元々、元の順序は最初のインデックスと2番目のインデックスでソートされます。だから、転置を取得するには、2番目のインデックスと1番目のインデックスでソートします。

あなたが正しい順序を決めたら、List.fold_leftまたはList.fold_rightを使ってリストの最終リストを組み立てることができます。

List.fold_leftを使用してリストを3つのグループに再フォーマットする関数です。これは、あなたが欲しい機能はありませんが、それは近いかもしれません:

let bythrees l = 
    let iby (cur, prev, n) x = 
     if n mod 3 = 2 then ([], (x :: cur) :: prev, n + 1) 
     else (x :: cur, prev, n + 1) 
    in 
    let (_, res, _) = List.fold_left iby ([], [], 0) l in 
    res 

ここであなたがそれを実行したときに、それがどのように見えるかです:

# bythrees [1;2;3;4;5;6;7;8;9];; 
- : int list list = [[9; 8; 7]; [6; 5; 4]; [3; 2; 1]] 

出力は、まだいくつかの作業が必要ですが、これはあなたができる示しリストのリストをこのように作成します。

関連する問題