8

私が持っているとしましょう:

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

4 に答える 4

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]]]
于 2013-02-06T21:25:04.117 に答える
4

このようなものにはcore.matrixを採用することを検討してください。

ネストされたベクトルを行列として非常にうまく操作しますが、必要に応じてはるかに強力な機能も実行します(たとえば、JBLASを介した高速化されたネイティブ行列ライブラリのサポート)。これは、Clojureでのマトリックス計算のための最も信頼のおけるライブラリ/APIになりつつあります。

この場合、単に「emap」を使用して、関数を要素ごとに2つの行列に適用できます。

(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]]]
于 2013-02-07T01:03:27.687 に答える
3

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

何らかの理由で答えをネストされたベクトルに変換する必要がある場合は、この質問を見る価値があるかもしれません。

于 2013-02-06T20:27:17.013 に答える
2

別の実装を次に示します。

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

これからレイジー seq の代わりにベクトルを取得するには、 にmap置き換えます。mapv

于 2013-02-06T20:58:31.273 に答える