首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包函数松弛算法

闭包函数松弛算法
EN

Stack Overflow用户
提问于 2016-09-21 14:59:40
回答 1查看 62关注 0票数 0

我正在尝试在Clojure中实现杂碎娃娃物理。该模型具有多维坐标序列x和距离约束矩阵M,是松弛算法的一个部分。

一般的想法是,如果矩阵条目M_ij与零不同,我必须修改坐标x_i和x_j,使它们的距离等于m_ij。假设每个x_n是一个2D/3D坐标,我知道如何进行正确的计算。

现在,由于M的每个条目影响两个坐标,我想不出用mapreduce正确地迭代坐标的方法。我也许可以将loop, recur的两个调用放在一起来模拟一个命令式,但我希望有更好的方法(特别是因为它会导致代码看起来非常混乱)。

您知道在过程中迭代二维矩阵和修改多个向量条目的函数式方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 16:52:14

我认为reduce-kv很好地抓住了这种模式的本质:

代码语言:javascript
复制
(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实现为稀疏矩阵。
  • 代码不会过滤出0值的距离,但这应该是微不足道的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39620108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档