2015-02-09 58 views
0

假设我有一个Clojure的矩阵A这样(格式化为清楚起见)更新矩阵Clojure中

[[1 4 3] 
[1 7 3] 
[1 8 3]] 

现在假设我想更新代替第一列中,由例如由两个因素相乘,使新的矩阵变成

[[2 4 3] 
[2 2 3] 
[2 8 3]] 

一个怎样Clojure中做到这一点?我曾尝试之类的东西assoc和类似的东西

(join-along 1 (* (slice A 1 0) 2) (select A [0 1 2] [2 3]))

当然,没有工作。如果矩阵有assoc这样的矩阵,那将是很好的。

(massoc A [rows] [columns] replacement-vector) 

或Python中的一些简单的像numpy

A[:,0]*2 = [[2 4 3] 
      [2 2 3] 
      [2 8 3]] 

感谢

+0

这更类似于'在Python语法numpy',而不是MATLAB。我只是挑剔。 – rayryeng 2015-02-09 20:23:52

回答

1

你应该看看clojure.core/matrix,看看它是否支持这样的操作。

下面是可能是你要找的东西。在应用函数后,将其更改为assoc是一个新值,而不是更新应该是微不足道的。

(defn mupdate-in 
    "Update all `coll' rows at `column' with `f'" 
    [coll column f & args] 
    (reduce #(apply update-in %1 [%2 column] f args) 
      coll 
      (range (count coll)))) 

一个例子:

(def m [[1 4 3] 
     [1 7 3] 
     [1 8 3]]) 

(mupdate-in m 0 * 2) 
;; [[2 4 3] 
;; [2 7 3] 
;; [2 8 3]] 

(mupdate-in m 2 + 10) 
;; [[1 4 13] 
;; [1 7 13] 
;; [1 8 13]]