2015-12-22 212 views
1

我使用下面的函數來初始化一個二維矢量:的Clojure:Clojure中的初始化2D矢量

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

用法:

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

由於我是新來的語言,我問我自己如果這是最直接的做法。有沒有人有一個想法來優化這個?

+0

這是非常令人迷惑。你想要投入什麼?你想擺脫什麼? – jmargolisvt

+0

抱歉,代碼中出現錯誤。現在它已更新。 –

+0

如果您在2D結構上做了很多工作,您可能需要考慮core.matrix。 – Mars

回答

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))))) 
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]] 
具有恆定值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]] 
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))))