嵌套向量的算术平均值

时间:2014-01-24 20:36:04

标签: clojure

我的计划是计算矩阵的行或列的算术平均值(矩阵/嵌套向量)。到目前为止,我已经能够计算矩阵中行的算术平均值,即

(defn arithmean [x]
(let [data x num (count data)]
     (vec (apply map (fn [& items]
          (/ (apply + items) num)) data))))

我更关心的是能够输入多个嵌套向量,类似于[x& args]进入上一个函数。但也有兴趣能够计算矩阵中各列的平均值。

2 个答案:

答案 0 :(得分:1)

你有很多选择,如果你只是在你能做的时候做这个:

(defn mean [vals]
  (apply /
        (reduce (fn [[tally count] val]
                  [(+ tally val)
                   (+ count 1)])
                [0 0]
                vals)))

(defn col-mean [vec-of-vec col]
  (mean
    (map (fn [v]
           (nth v col))
         vec-of-vec)))

你也可以将这两个函数结合起来一次计算每列的平均值,当你遍历每一行时,每个col基本上保持[tally count]对。 - 我将此作为练习留给读者。

你可能想看看这个图书馆和相关的图书馆(我不知道,但它看起来并不好)

https://github.com/mikera/core.matrix

答案 1 :(得分:1)

将解决方案分层为小而清晰的功能。

  • 返回单个集合的mean
  • 的函数
  • 显示要收集的集合的函数,如果有多个集合。

功能......

(defn mean [cs] (/ (apply + cs) (count cs)))

...返回集合的平均值。

要获取集合集合的mean,请定义...

(defn means [css] (vec (map mean css)))

......虽然这可能太小而不值得命名。

矩阵(按照您的意思)是列向量的向量,因此列均值只是means

行的意思是

(fn [matrix] (means (transpose matrix)))

其中矩阵的转置由

给出
(defn transpose [matrix] (apply map vector matrix))

无论是全局定义这些函数(使用defn)还是本地(使用fn)或仅引用正文,都没有多大关系。

您可以独立调整解决方案层。例如,如果需要,以下是计算均值的更快但不太清晰的方法:

(defn mean [cs]
  (loop [remains cs, total 0, n 0]
    (if (empty? remains)
      (/ total n)
      (recur (next remains) (+ total (first remains)) (inc n)))))