【发布时间】:2011-11-24 00:48:13
【问题描述】:
我想出了这个:
(def kernel [0 1 1 2 3 3 0 0 0 0 0 0])
(def data [1 5 7 4 8 3 9 5 6 3 2 1 1 7 4 9 3 2 1 8 6 4])
(defn capped+ [a b c] (let [s (+ a b)] (if (> s c) c s)))
(defn *+ [a b]
(if (> (count a) (count b))
(reduce + (map-indexed (fn _ [i x] (* (a i) (b i))) b))
(reduce + (map-indexed (fn _ [i x] (* (a i) (b i))) a))))
(defn slide*i [d k]
(let [ki (into [] (reverse k)) kl (count k) dl (count d)]
(map-indexed
(fn [idx item]
(/ (*+ ki (subvec d idx (capped+ idx kl dl)))
(reduce + ki)))
d)))
(def s (slide*i data kernel))
这不是最优雅的代码,但它运行良好。 我其实想用它来平滑一些非常尖的!数据。
欢迎提出任何使这个更漂亮、更高效或更准确的建议(我个人并不关心尾巴不准确,因为在我的情况下我从不使用它)。
【问题讨论】:
标签: vector clojure linear-algebra convolution