Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix Clojure中的就地矩阵运算_Matrix_Clojure - Fatal编程技术网

Matrix Clojure中的就地矩阵运算

Matrix Clojure中的就地矩阵运算,matrix,clojure,Matrix,Clojure,我以前问过一个相关的问题: 不幸的是,作为Clojure的新手,我现在更困惑了 基本上,在Python语法中,我想做的是使用矩阵A: 取A的行列式,称之为D,然后做 A[:,0] = A[:,0]*(D /abs(D)) 这是我想做的 A = A*(D**(-1./A.shape[0])) 但是,即使在仔细阅读core.matrix的功能时,也很难弄清楚Clojure是如何实现如此简单的功能的,即使有前面的问题的帮助 我[在clojure语法中]已经走了这么远: (join-along 1

我以前问过一个相关的问题:

不幸的是,作为Clojure的新手,我现在更困惑了

基本上,在Python语法中,我想做的是使用矩阵A:

取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]]>)
如果能够解决这一问题,那么这应该是一个简单的问题:

(* "A-updated-matrix" (pow (det A) (/ -1 (dimension-count A 0)))
我还可以想象,上述方法可能不是执行这些矩阵运算的最有效方法

更新:

所以clojure访问矩阵并将列向量作为行向量输出似乎是个问题

例如

然而,如果我们这样做

>(def i [[2] [3] [4]])
>(join-along 1 i a)
[[2 1 2 3] [3 4 5 6] [4 7 8 9]]

它很好用

不管其他细节如何,向量的就地更新不是没有丑陋和不安全的黑客的事情。如果需要实际的就地更新,请使用可变类型,如数组。遗憾的是,我无法告诉您core.matrix是否以及如何处理数组。@noisesmith是对的,Astrid。matrix允许您选择不同的底层实现。目前最完整的是持久性向量,即向量的正则克隆向量,它们是不可变的;ndarray,这是一个纯Clojure实现,支持可变矩阵;vectorz是一个Java实现,它也支持可变矩阵。您可以选择默认实现,例如,设置当前实现:vectorz,或在创建矩阵时添加:vectorz或:ndarray关键字,例如使用矩阵:ndarray[[1 2][3 4]]。如果您试图在矩阵中写入特定元素,请使用mset!可能是你需要的接线员。我不知道Python矩阵语法,所以我不知道您想要实现什么。您能用文字解释一下您想做什么,或者解释一下语法吗?关于最后两个代码示例:在core.matrix中,[[1 2 3]]表示行向量,[[1][2][3]]表示列向量,[1 2 3]是可以根据上下文解释为行或列向量的向量。沿着连接显然需要显式的行或列向量表示。
(* "A-updated-matrix" (pow (det A) (/ -1 (dimension-count A 0)))
>(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]]