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