Update matrix in-place in Clojure

白昼怎懂夜的黑 提交于 2019-12-13 12:42:56

问题


Suppose I have a Clojure matrix A as such (formatted for clarity)

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

Now suppose I want to update the first column in place, by e.g. multiplying it by a factor of two, so that the new matrix becomes

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

How would one do this in clojure? I have tried things like assoc and stuff like

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

Naturally that did not work. It would be great if there was something like assoc for matrices e.g.

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

or something simple like numpy in Python:

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

Thanks


回答1:


You should look into clojure.core/matrix and see if it supports operations like this.

Here is something that may be what you're looking for. It should be trivial to change this to assoc a new value rather than updating after applying a function.

(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))))

An example:

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


来源:https://stackoverflow.com/questions/28418058/update-matrix-in-place-in-clojure

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!