在Clojure中就地更新矩阵

时间:2015-02-09 19:50:21

标签: matrix clojure

假设我有一个Clojure矩阵A(为清晰起见而格式化)

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

现在假设我想要更新第一列,例如:将它乘以因子2,以便新矩阵变为

[[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]]

由于

1 个答案:

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