如何对Clojure中某些结构的多个向量求和
更简单的版本: 这项工作:如何对Clojure中某些结构的多个向量求和,clojure,Clojure,更简单的版本: 这项工作: user=> (map + [1 2 3] [4 5 6] [7 8 9]) (12 15 18) 这并不是: user=> (for [n (range 3)] [n (+ 1 n)]) ([0 1] [1 2] [2 3]) user=> (map + (for [n (range 3)] [n (+ 1 n)])) java.lang.ClassCastException 为什么? 我对clojure很陌生,所以这可能是一个新手的错误。在
user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
这并不是:
user=> (for [n (range 3)] [n (+ 1 n)])
([0 1] [1 2] [2 3])
user=> (map + (for [n (range 3)] [n (+ 1 n)]))
java.lang.ClassCastException
为什么?
我对clojure很陌生,所以这可能是一个新手的错误。在下面的代码中,我尝试将多个信号添加到一起。每个信号都包含一个向量(称为数据),我想进行分段加法。在REPL,类似这样的内容:
user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
我的代码如下所示:
(defrecord signal [x y data])
(defrecord sampling [t0 dt n])
(defn random-signal [x y sampling tstart tend]
(let [t0 (:t0 sampling)
dt (:dt sampling)
n (:n sampling)
random-or-zero (fn [i]
(let [t (+ t0 (* dt i))]
(if (and (>= t tstart) (< t tend)) (- (* 2 (rand)) 1) 0)))
data (vec (for [i (range n)] (random-or-zero i)))]
(signal. x y data)))
(defn add-signals [signals]
(let [s0 (nth signals 0)]
(signal. (:x s0) (:y s0) (vec (map + (for [s signals] (:data s)))))))
(let [s (sampling. 0 0.1 10)
r1 (random-signal 5 6 s 0.3 0.5)
r2 (random-signal 5 6 s 0 1)]
(prn r1)
(prn r2)
(prn (add-signals [r1 r2])))
我做错了什么?这行不通
(map + (for [n (range 3)] [n (+ 1 n)]))
因为现在您正在传递map,seq of seqs(一个seq而不是第一个示例中的3)
这等于,
(map + [[1 2 3] [4 5 6] [7 8 9]])
如果你这样做
(apply map + (for [n (range 3)] [n (+ 1 n)]))
它将评估
(map + [0 1] [1 2] [2 3])
原来我需要使用
apply
来处理for
的版本。是的,我知道,谢谢。我自己发布了答案,但被删除了。
(map + [0 1] [1 2] [2 3])