Clojure 交换二维向量的x轴和y轴

Clojure 交换二维向量的x轴和y轴,clojure,clojurescript,Clojure,Clojurescript,考虑这样一个2d向量: (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)) 我只是在问自己,是否有一

考虑这样一个2d向量:

(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

您的函数重新定义了
向量
,将其编写为
(apply mapv vector v2d)
更为惯用

顺便问一下,你真的需要它是一个向量吗?生成向量序列的速度要快得多:
(apply map vector v2d)


此外,使用
时间
进行基准测试也不是很准确。最好使用。

之类的工具,这取决于您的应用程序,您可能会发现它很有用。它包括一个
转置
函数,该函数将执行与您的函数相同的操作。哇,这看起来非常有希望,我可能需要它,因此我要解决的下一个问题是如何将行或列中的单词写入2d向量。生成已实现的向量序列是否更快?