私が持っているとしましょう:
'[[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」を使用して、関数を要素ごとに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]]]
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))
これからレイジー seq の代わりにベクトルを取得するには、 にmap
置き換えます。mapv