交换二维向量的 x 和 y 轴

swap x and y axis of a 2d vector

考虑这样的二维向量:

(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

你的函数重新定义了vector,写成(apply mapv vector v2d)会更符合地道。

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

此外,time 的基准测试不是很准确。最好使用 Criterium.

之类的工具