clojure:初始化2d向量

时间:2015-12-22 22:00:06

标签: clojure clojurescript

在clojure中我使用以下函数初始化2d向量:

(defn vec2d [x y init]
  (vec (map 
         #(vec (map init (range x))) (range y))))

用法:

(def grid (vec2d 40 30 (fn [] "x")))

由于我是这门语言的新手,我问自己这是否是最直接的方式。有没有人想要优化这个?

3 个答案:

答案 0 :(得分:3)

假设您总是希望将向量的条目初始化为常量,以下是我的方法:

(defn vec2d
  "Return an x by y vector with all entries equal to val."
  [x y val]
  (vec (repeat y (vec (repeat x val)))))

答案 1 :(得分:2)

如果您希望能够根据坐标进行初始化,则可以执行此操作

(defn vec2d [sx sy f]
  (mapv (fn[x](mapv (fn[y] (f x y)) (range sx))) (range sy)))

如果你这样做,你可以拥有一个恒定的值

(vec2d 4 3 (constantly 2))
;; [[2 2 2 2] [2 2 2 2] [2 2 2 2]]

或根据坐标初始化,例如:

(vec2d 4 3 (fn[x y] (+ x y))) 
(vec2d 4 3 +)                         ;; or more concisely
;;[[0 1 2 3] [1 2 3 4] [2 3 4 5]]

答案 2 :(得分:1)

使用mapv并设置

(defn vec2d [x y init]
  (mapv #(mapv init (range x)) (range y)))

如果您想要初始化坐标:

(defn vec2d [x y init]
  (mapv (fn [y] (mapv #(init % y) (range x))) (range y))

如果您只想要所有单元格,嵌套它对于板生成也非常易读:

(defn vec2d [cols rows init]
  (for [x (range rows) y (range cols)]
    (init x y)))

或者如果你不介意seqs:

(defn vec2d [cols rows init]
  (for [x (range rows)]
    (for [y (range cols)]
      (init x y))))
相关问题