之前我问了一个相关的问题:
Update matrix in-place in Clojure
不幸的是,作为Clojure的新手,我现在更加困惑了。
基本上我在Python语法中想要做的就是使用矩阵A
:
[[1 4 3]
[1 7 3]
[1 8 3]]
取A
的决定因素,将其称为D
,然后执行
A[:,0] = A[:,0]*(D /abs(D))
我想做什么
A = A*(D**(-1./A.shape[0]))
但即使在仔细阅读core.matrix
的功能时,即使在上一个问题的帮助下,也很难弄清楚在Clojure中如何完成一些非常简单的事情。
我已经有了这个[在clojure语法中]:
(join-along 1 (* (slice A 1 0) (/ (det A) (abs (det A)))) (select A [0 1 2] [1 2]))
然后如何在不更改存储的情况下就地更新?目前收到错误消息:
Unidentified exception when trying to call procedure join-along with arguments (1 [1.0 4.0 7.0] #<NDWrapper [[2 3] [5 6] [8 9]]>)
然而这有效:
>(def t1 [[1 1] [2 2] [3 3]])
>(def t2 [[9] [9] [9]])
>(join-along 1 t2 t1)
[[9 1 1] [9 2 2] [9 3 3]]
如果可以解决这个问题,那么它应该只是一个问题:
(* "A-updated-matrix" (pow (det A) (/ -1 (dimension-count A 0)))
另外我可以想象上面的内容可能不是执行这些矩阵运算的最有效方法。
更新:
因此,它似乎是clojure访问矩阵的问题,并将列向量输出为行向量。
E.g。
>(def a [[1 2 3] [4 5 6] [7 8 9]])
>(def t2 (get-column a 0)) ; Gets first column
>(join-along 1 t2 a)
Unidentified exception when trying to call procedure join-along with arguments (1 [1 4 7] [[1 2 3] [4 5 6] [7 8 9]])
但是,如果我们这样做
>(def i [[2] [3] [4]])
>(join-along 1 i a)
[[2 1 2 3] [3 4 5 6] [4 7 8 9]]
它工作正常。