交换二维向量的 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.
之类的工具
考虑这样的二维向量:
(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.