我有代碼,直接改變性能矩陣。在我改變它之前,我想獲得一個完整的副本以存儲在一個新的符號中,然後這個新的符號被突變過程使用。無論如何,我可以將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)]))
從@JoG:
(criterium.core/bench (let [mat2 (read-string (pr-str mat1))]))
對於更一般的情況
@ JoG的解決方案將適用於序列化爲字符串的數據結構。如果有人有關於如何制定更通用的解決方案的想法,請回復,我會更新它。
圖書館是否支持瞬態?這是它通常在clojure中完成的方式。 – stonemetal
@stonemetal我不確定它是否。它可以實現ISeq。如果您可以使用瞬態提供答案,那將是非常好的。 – user1559027
我相信有趣的角色應該是希臘字母mu。 Criterium打印mu,後面跟着「s」微秒。你可以看到,在第一個列表中,標準偏差是以funny-char +「s」爲單位的,如果funny-char是mu,那麼標準偏差應該比平均值小很多,這樣纔有意義。當我運行基準測試時,第二個測試顯示以mu-s爲單位的平均值。 (但是正如你在JoG的回答中注意到的那樣,'read-string'方法不會產生正確的結果:'(='A(read-string(pr-str mat1))); ==> true' ) – Mars