2012-02-08 15 views
2

問題:私は、不規則な大きさのベクトルを持つ可能性がある既存のベクトルに合計する慣用的な方法を見つけたいと思います。セットアップを示す 不自然な例:Clojureで複数のベクトルを合計する慣習的な方法

=>(def collated-list [2 3 4 5 6 7 8]) 
=>(def lists-to-add (partition-all 3 collatedlist)) 
=>(def base-list [1 1 1]) 

を私はbase-listに壊れ照合リストを合計した結果が欲しい、例えば、最初の項目はように1 + 2 + 5 + 8可能となります。

私が試した何

は、私はいくつかの異なる方法でmapforループを試してみたが、私はVectorIntegerを追加しようとしているのいずれかの怠惰なシーケンシングとの問題や問題が発生しているようです。

これは私がClojureで初めて行った実験なので、ここでは関数の反復を間違って理解しています。

おかげで、すべての

+0

もRECを参照してください。 (Clojureで地図の振る舞いを変える)(http://stackoverflow.com/questions/9033678/changing-map-behaviour-in-clojure)。任意の関数、リストの数、およびパディング要素を持つ)。 –

答えて

4

まずリスト・ツー・アドオンもの長さのリストが含まれている場合、それははるかに容易になりますので、代わりにpartition-allpartitionを使用します。

(def lists-to-add (partition 3 3 '(0 0) collated-list)) 

そして、あなたが行うことができますmapと再帰を合計する:

(defn sum-lists [base-lists lists-to-add] 
    (reduce #(map + %1 %2) base-list lists-to-add)) 
+7

またはさらに簡単です(マップ+ベースリストのリストを追加する) –

+0

@RomanBataev nice! – liwp

+0

おかげでliwpと@Roman Bataevには、とてもシンプルなバージョンがあります。 – jamiei

0
; List of list 
(def lst (partition 5 (range 200))) 

; Base list 
(def base [1 1 1 1 1]) 

; Sum operation 
(apply map (fn [& args] (apply + args)) base lst) 
+0

不均一なサイズのベクトルでは正しく動作しません。また、(fn [&args](apply + args)の代わりに+を使用するだけで済みます) –

関連する問題