2014-04-24 65 views
0

我有代碼,直接改變性能矩陣。在我改變它之前,我想獲得一個完整的副本以存儲在一個新的符號中,然後這個新的符號被突變過程使用。無論如何,我可以將Clojure符號的內容複製到一個新符號中,以便第一個符號可以在不影響第二個符號的情況下進行變異?如何將Clojure符號完全複製到新符號?

這裏是我的失敗嘗試中的一種:

(var mat1 (clatrix/matrix (clatrix/ones 2 2))) 
(var mat1) 
(intern 'analyzer.core 'mat1 (clatrix/matrix (clatrix/ones 2 2))) 
mat1 
(intern 'analyzer.core 'mat2 mat1) 
mat2 
(clatrix/set mat1 0 0 2) 
mat1 
mat2 

,當然還有,這不起作用:

(def mat1 (clatrix/matrix (clatrix/ones 2 2) 
(def mat2 mat1) 

我也試圖(但不知道如果我在這裏做反正):

(def mat1 (clatrix/matrix (clatrix/ones 2 2) 
(def mat2 `mat1) 

(def mat1 (clatrix/matrix (clatrix/ones 2 2)) 
(def mat2 ~mat1) 

(def mat1 (clatrix/matrix (clatrix/ones 2 2)) 
(def mat2 (.dup mat1)) 

任何想法?

更新

我已經基準到目前爲止提出的問題的答案。我不確定線條的符號是什麼意思。 設置:

(def mat1 (clatrix/ones 1000 1000) ; Creates a 1000x1000 matrix of 1.0 in each element. 

從@Mars:

(criterium.core/bench (let [mat2 (clatrix/matrix mat1)])) 

benchmark1

從@JoG:

(criterium.core/bench (let [mat2 (read-string (pr-str mat1))])) 

benchmark2

對於更一般的情況

@ JoG的解決方案將適用於序列化爲字符串的數據結構。如果有人有關於如何制定更通用的解決方案的想法,請回復,我會更新它。

+0

圖書館是否支持瞬態?這是它通常在clojure中完成的方式。 – stonemetal

+0

@stonemetal我不確定它是否。它可以實現ISeq。如果您可以使用瞬態提供答案,那將是非常好的。 – user1559027

+1

我相信有趣的角色應該是希臘字母mu。 Criterium打印mu,後面跟着「s」微秒。你可以看到,在第一個列表中,標準偏差是以funny-char +「s」爲單位的,如果funny-char是mu,那麼標準偏差應該比平均值小很多,這樣纔有意義。當我運行基準測試時,第二個測試顯示以mu-s爲單位的平均值。 (但是正如你在JoG的回答中注意到的那樣,'read-string'方法不會產生正確的結果:'(='A(read-string(pr-str mat1))); ==> true' ) – Mars

回答

5

就再次使用matrix

(require '[clatrix.core :as clatrix]) 
; nil 

(def mat1 (clatrix/matrix [[1 1][1 1]])) 
; #'user/mat1 

(def mat2 (clatrix/matrix mat1)) 
; #'user/mat2 

mat1 
; A 2x2 matrix 
; ------------- 
; 1.00e+00 1.00e+00 
; 1.00e+00 1.00e+00 

(clatrix/set mat1 0 0 2) 
; #<DoubleMatrix [2.000000, 1.000000; 1.000000, 1.000000]> 

mat1 
; A 2x2 matrix 
; ------------- 
; 2.00e+00 1.00e+00 
; 1.00e+00 1.00e+00 

mat2 
; A 2x2 matrix 
; ------------- 
; 1.00e+00 1.00e+00 
; 1.00e+00 1.00e+00 
-2

鑑於矩陣本身也是Clojure的datastrucure約

(def copy (read-string (pr-str original))) 

PR-STR如何轉儲數據結構作爲一個字符串,讀取字符串評估回來。

+0

對不起,這個解決方案似乎不起作用。結果的類型是「Symbol」,而不是「clatrix.core.Matrix」。 – user1559027

+0

即使它起作用,爲了複製數據而序列化/反序列化字符串也不是慣用的。 – muhuk