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

List 在clojure中如何组合两个向量的元素级向量?,list,vector,clojure,List,Vector,Clojure,假设我有: '[[c c c] [y y y] [m m m]] 及 我想要: '[[[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]

假设我有:

'[[c c c]
  [y y y]
  [m m m]]

我想要:

'[[[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]])

(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
,从中获取向量,而不是惰性序列。

考虑采用类似的方法

(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]]]
它可以非常愉快地将嵌套向量作为矩阵进行操作,但如果您需要它,它还可以提供更强大的功能(例如,通过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]]]

嗨,Mike,(使用'core.matrix)告诉我:java.io.FileNotFoundException:在classpathcore.matrix上找不到core/matrix\uuu init.class或core/matrix.clj是非常前沿的。。。你可以尝试将[net.mikera/core.matrix“0.0.11”]添加到你的
项目.clj
。噢,我刚刚学到了两件新东西,我也觉得自己像个十足的白痴。谢谢亚历克斯!!据我所知,
for
不会对多个集合进行元素级迭代,它会以最快的速度嵌套多个集合的迭代
for
也返回一个惰性seq,尽管我认为原则上可以创建一个类似于
mapv
(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]]]