如何在Clojure中修改矢量的一部分?

Chr*_*isR 9 clojure

我想知道我是否遗漏了一些涉及矢量操作的基本内容.假设我有以下内容:

(def xs [9 10 11 12 13]) 
(def idx [0 2]) 
(def values [1 3])
Run Code Online (Sandbox Code Playgroud)

如果我想[1 10 3 12 13]在Matlab中返回向量,我会写xs(idx) = values.在Clojure中,有没有一种原始的方法来实现这一目标?现在我正在使用以下功能:

(defn xinto [seq idx val]
  (apply assoc seq (interleave idx val)))
Run Code Online (Sandbox Code Playgroud)

谢谢.

ama*_*loy 8

这是一个有点尴尬,因为你已经分手了idx,并values为两个seqs,当他们在概念图索引到值.因此,如果您允许我对您的数据格式进行一些创意修改:

(def x [9 10 11 12 13]) 
(def changes {0 1, 2 3}) 

(defn xinto [v changes]
  (reduce (fn [acc [k v]]
            (assoc acc k v))
          v
          changes))

(xinto x changes) ;; gets the result you want
Run Code Online (Sandbox Code Playgroud)

如果您生成idxvalues以某种奇怪的方式将它们组合在一起并不方便,您可以稍后将它们分组(map list idx values),然后使用我的xinto实现.

  • @seh呃,我想你可以做到,但这似乎不值得努力.如果要生成的初始向量或更改集很小,则转换到瞬态或从瞬态转换所需的时间将超过使用1的增益. (3认同)