我使用下面的函數來初始化一個二維矢量:的Clojure:Clojure中的初始化2D矢量
(defn vec2d [x y init]
(vec (map
#(vec (map init (range x))) (range y))))
用法:
(def grid (vec2d 40 30 (fn [] "x")))
由於我是新來的語言,我問我自己如果這是最直接的做法。有沒有人有一個想法來優化這個?
我使用下面的函數來初始化一個二維矢量:的Clojure:Clojure中的初始化2D矢量
(defn vec2d [x y init]
(vec (map
#(vec (map init (range x))) (range y))))
用法:
(def grid (vec2d 40 30 (fn [] "x")))
由於我是新來的語言,我問我自己如果這是最直接的做法。有沒有人有一個想法來優化這個?
下,你會總是希望向量的條目初始化爲常數的假設,這裏是我會怎麼做:如果你希望能夠根據初始化
(defn vec2d
"Return an x by y vector with all entries equal to val."
[x y val]
(vec (repeat y (vec (repeat x val)))))
座標,你可以這樣做
(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]]
具有恆定值10
或初始化根據座標,說:
(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]]
使用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))))
這是非常令人迷惑。你想要投入什麼?你想擺脫什麼? – jmargolisvt
抱歉,代碼中出現錯誤。現在它已更新。 –
如果您在2D結構上做了很多工作,您可能需要考慮core.matrix。 – Mars