假设我有:
'[[c c c]
  [y y y]
  [m m m]]
和
'[[r g b]
  [r g b]
  [r g b]]
我想拥有:
'[[[c,r] [c,g] [c,b]]
  [[y,r] [y,g] [y,b]]
  [[m,r] [m,g] [m,b]]]
在 clojure 中执行此操作的优雅方法是什么?
(def a '[[c c c]
         [y y y]
         [m m m]])
(def b '[[r g b]
         [r g b]
         [r g b]])
(mapv (partial mapv vector) a b) ;; will work with arbitrary number 
                                 ;; of equal sized arguments
;=> [[[c r] [c g] [c b]] [[y r] [y g] [y b]] [[m r] [m g] [m b]]]
考虑采用core.matrix 这样的东西。
它将非常高兴地将嵌套向量作为矩阵来操作,但如果您需要它,它还会做更强大的东西(例如,通过 JBLAS 支持加速的本机矩阵库)。它正在成为 Clojure 中用于矩阵计算的权威库/API。
在这种情况下,您可以简单地使用“emap”将函数元素应用于两个矩阵:
(use 'core.matrix)
(def cym '[[c c c]
           [y y y]
           [m m m]])
(def rgb '[[r g b]
           [r g b]
           [r g b]])
(emap vector cym rgb)
=> [[[c r] [c g] [c b]] 
    [[y r] [y g] [y b]] 
    [[m r] [m g] [m b]]]
partition并interleave带您到那里,如下所示:
(def a '[[c c c]
         [y y y]
         [m m m]])
(def b '[[r g b]
         [r g b]
         [r g b]])
(map (partial partition 2) (map interleave a b))
;=> (((c r) (c g) (c b)) 
;    ((y r) (y g) (y b))
;    ((m r) (m g) (m b)))
如果由于某种原因您需要将答案转换为嵌套向量,可能值得一看这个问题。
这是另一个实现:
(defn combine-vectors [& vecs]
  (apply map (partial map vector) vecs))
替换map为mapv从中获取向量而不是惰性序列。