我正在尝试在Clojure中实现杂碎娃娃物理。该模型具有多维坐标序列x和距离约束矩阵M,是松弛算法的一个部分。
一般的想法是,如果矩阵条目M_ij与零不同,我必须修改坐标x_i和x_j,使它们的距离等于m_ij。假设每个x_n是一个2D/3D坐标,我知道如何进行正确的计算。
现在,由于M的每个条目影响两个坐标,我想不出用map或reduce正确地迭代坐标的方法。我也许可以将loop, recur的两个调用放在一起来模拟一个命令式,但我希望有更好的方法(特别是因为它会导致代码看起来非常混乱)。
您知道在过程中迭代二维矩阵和修改多个向量条目的函数式方法吗?
发布于 2016-09-21 16:52:14
我认为reduce-kv很好地抓住了这种模式的本质:
(reduce-kv (fn [x' [i j] d] ;; x' — accumulator (vector of coordinates)
;; [i j] — Matrix coordinates
;; d — Matrix value (distance)
(let [[x'ᵢ x'ⱼ] (update-distance (nth x' i)
(nth x' j)
d)]
(assoc x' i x'ᵢ j x'ⱼ)))
x ;; Initial coordinates
M) ;; Matrix几个注意事项:
update-distance根据初始坐标和距离计算新的一对坐标。assoc来“更新”x。因此,x应该是一个向量(任何结合都行,但向量似乎是自然的选择。M必须满足clojure.core.protocols/IKVReduce协议。如果没有,您可以提供一个实现,或者只需编写一个函数,生成适当的键值对并在其上使用reduce。另一种选择是使用持久映射将M实现为稀疏矩阵。https://stackoverflow.com/questions/39620108
复制相似问题