我的计划是计算矩阵的行或列的算术平均值(矩阵/嵌套向量)。到目前为止,我已经能够计算矩阵中行的算术平均值,即
(defn arithmean [x]
(let [data x num (count data)]
(vec (apply map (fn [& items]
(/ (apply + items) num)) data))))
我更关心的是能够输入多个嵌套向量,类似于[x& args]进入上一个函数。但也有兴趣能够计算矩阵中各列的平均值。
答案 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]
对。 - 我将此作为练习留给读者。
你可能想看看这个图书馆和相关的图书馆(我不知道,但它看起来并不好)
答案 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)))))