В ближайшем будущем, как эффективный способ вычислить среднее целых векторов - PullRequest
7 голосов
/ 21 ноября 2011

У меня есть:

(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))

Если данные достаточно велики (а у меня их много), есть ли лучший способ сделать это?
Помогает ли это вычислить * 1014?* заранее?
Помогает ли defn #(/ % (count m)) заранее?

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Вот довольно простой и простой способ сделать это:

(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)
7 голосов
/ 24 июня 2013

Начиная с 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 основывается на API-интерфейсе core.matrix, поэтому он также будет работать с другими более оптимизированными реализациями векторов и матриц - это, вероятно, будет лучшим вариантом, если вы выполняете много тяжелой матричной обработки.

5 голосов
/ 21 ноября 2011

Не зная, как использовать любой из заклинаний, вот как вы могли бы сделать это «с нуля».

(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...