2014-09-26 57 views
0

我正在處理大量數據,處理類型取決於正在處理的數據。最終目標是爲每個行的每個元素都有一個功能,可以有效執行。下面只是一個使用平均值劃分的例子,但我試圖找到一個可以應用任何函數的解決方案。定義數據特定的Clojure函數,可能與宏?

說我想讀入一個向量的向量的數字,並返回第一個數字除以其位置的平均數和第二個數字減去最小數的結果。

實施例:

輸入:

(def inputs 
[[1.0,1.0] 
[2.0,4.0] 
[3.0,9.0]]) 

平均值:

(def avgs 
[2.0,7.0]) 

Mininums:

(def mins 
[1.0,1.0]) 

輸出:

(def outputs 
[[0.50,0.00] 
[1.00,3.00] 
[1.50,8.00]]) 

指令:

(DEF平均的IDS [0]) (DEF subtr-ID爲[1])

天真的方法是查找除數對於每個位置:

(defn avg-elem [element position] 
    (/ element (nth avgs position))) 

(defn subtr-elem [element position] 
    (- element (nth mins position))) 

(mapv 
    #(map-indexed 
     (fn [elem idx] (if (is-avg-idx? idx) (avg-elem elem idx) (subtr-elem elem idx))) 
    %) 
inputs) 

我想什麼做的是以下幾點:

(fn [elem] (/ elem 2.0)) 
(fn [elem] (- elem 1.0)) 

並且具有某種函數將相應的函數應用於每行中的每個元素。

+0

我不清楚你的意思是「一種可以應用任何功能的解決方案」。 Clojure的序列處理原語沒有提供什麼?你能舉一個更好的例子嗎?說實話,這聽起來像是你在設計時沒有清楚地知道你的要求是什麼。 – Alex 2014-09-26 21:27:40

+0

本質上,我正在尋找處理矢量(矩陣)的矢量,如圖所示。當我收到矩陣時,我會收到每列的指令列表。每個指令對應一個函數。應用程序必須能夠靈活地在將來包含新的指令和功能。現在,我使用類似於天真的方法,而且效率很低。 – user1559027 2014-09-26 22:19:30

回答

1

我不知道你想做什麼,但這裏有一些方法來inputs矩陣中的每一列劃分到avgs向量的相應元素:

(mapv (partial mapv /) inputs (repeat avgs)) 

(mapv #(mapv/% avgs) inputs) 
+0

我的目標是爲每列定義一個函數。儘管您的解決方案能夠完成我已經制定的確切場景,但並未推廣到我可能希望在該列上執行的其他功能。我會更新說明。 – user1559027 2014-09-26 21:00:34

+0

@ user1559027推廣到其他函數,用其他函數替換'/'。 – Alex 2014-09-26 21:28:10

1

這是你在追求什麼?

(def row-fns (map (fn [avg] #(/ % avg)) avgs)) 
(mapv (fn [row] (mapv #(%1 %2) row-fns row)) inputs) 

用任何單參數函數列表替換row-fns

+0

如果每次處理某個元素時都採用這種方法來防止從avgs中查找所需的元素? 'row-fns'可以包含不同類型的函數嗎?看起來就是這樣。 – user1559027 2014-09-26 22:27:23