在clojure中,什么是计算整数向量平均值的有效方法

时间:2011-11-20 23:19:29

标签: matlab clojure

我有:

(def data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])

我想平均这些(按要素获得):

[3 6 5 5 6]

就像在MATLAB中一样:

mean([1 3 4 7 9; 7 6 3 2 7; 1 9 8 6 2])

使用Incanter我可以做到:

(map #(/ % (count m)) (apply plus data))

如果数据相当大(而且我有很多),还有更好的方法吗? 事先计算(count m)是否有帮助?
事先defn#(/ % (count m))有帮助吗?

3 个答案:

答案 0 :(得分:7)

这是一个非常简洁的方法:

(def data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])

(defn average [coll] 
  (/ (reduce + coll) (count coll)))

(defn transpose [coll]
   (apply map vector coll))

(map average (transpose data))
=> (3 6 5 5 6)

答案 1 :(得分:7)

截至2013年,我的建议是只使用core.matrix.stats导入所有这些功能:

(mean [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])
=> [3.0 6.0 5.0 5.0 6.0]

core.matrix.stats构建于core.matrix API之上,因此它也可用于其他更优化的向量和矩阵实现 - 如果您正在进行大量的重矩阵处理,这可能是更好的选择。

答案 2 :(得分:5)

在不知道如何使用任何咒语的情况下,您可以“从头开始”执行此操作。

(let [data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]]
      num (count data)]
  (apply map (fn [& items]
               (/ (apply + items) num))
         data))

;=> (3 6 5 5 6)