如何在clojure中组合两个向量元素的向量?

时间:2013-02-06 19:41:30

标签: list vector clojure

假设我有:

'[[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中执行此操作的优雅方法是什么?

4 个答案:

答案 0 :(得分:8)

(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]]]

答案 1 :(得分:4)

考虑将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]]]

答案 2 :(得分:3)

partitioninterleave将您带到那里,如seqs:

(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)))

如果出于某种原因需要将答案转换为嵌套向量,可能值得一看this question

答案 3 :(得分:2)

这是另一个实现:

(defn combine-vectors [& vecs]
  (apply map (partial map vector) vecs))

map替换为mapv以获取向量而不是延迟seqs。