如何将Clojure符号完全复制到新符号?

时间:2014-04-24 07:16:39

标签: performance matrix clojure immutability mutable

我有代码直接改变矩阵的性能。在我改变它之前,我希望得到一个完整的副本来存储在一个新的符号中,然后由突变过程使用。无论如何,我可以将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的解决方案适用于串行化为字符串的数据结构。如果有人对如何制定更一般的解决方案有想法,请回复,我会更新。

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:-2)

鉴于矩阵本身也是一个clojure数据结构怎么样

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

pr-str将数据结构转储为字符串,read-string将其计算回来。