交换2d向量的x轴和y轴

时间:2016-02-16 22:11:59

标签: clojure clojurescript

考虑像这样的二维矢量:

(def v2d [["a" "b" "c"]
          ["d" "e" "f"]
          ["g" "h" "i"]])

我需要交换x和v轴。所以需要将其转换为:

[["a" "d" "g"]
 ["b" "e" "h"]
 ["c" "f" "i"]]

我提出了这个解决方案:

(defn swap-xy [v2d]
  (apply mapv (fn [& args] (vec args)) v2d))

我只是在问自己是否有一个不必要的步骤。变量args的类型为:clojure.lang.PersistentVector$ChunkedSeq。这就是我必须通过使用函数vec再次将其转换为向量的原因。 可以避免转换吗?

这是关于质疑转换的一个小基准:

user=> (time (def x (apply (fn [& args] args) (range 10000000))))
"Elapsed time: 0.446455 msecs"
#'user/x
user=> (time (def x (apply (fn [& args] (vec args)) (range 10000000))))
"Elapsed time: 721.011768 msecs"
#'user/x

1 个答案:

答案 0 :(得分:3)

您的功能重新定义了vector,将其写为(apply mapv vector v2d)会更加惯用。

顺便说一下,你真的需要它成为一个载体吗?生成一系列向量要快得多:(apply map vector v2d)

此外,使用time进行基准测试并不十分准确。最好使用Criterium等工具。