【问题标题】:Map vector of vectors to vector of hashes in Clojure将向量的向量映射到 Clojure 中的哈希向量
【发布时间】:2011-12-12 19:36:08
【问题描述】:

我在二维空间中有一个点向量,例如:

[[0 0] [1 1] [2 2]]

并且需要计算某个点与向量中每个点之间的距离,以确定向量中的哪个点最接近我正在查询的点。我需要知道距离和最近点,所以我想要一个像这样的哈希向量:

[{:point [0 0] :dist 2.7} {:point [1 1] :dist 3.5} {:point [2 2] :dist 4.3}]

如何将前者转化为后者?我试过这样的事情:

(defn closest-point [point all-points]
    (map #({:point % :dist (distance point %)}) all-points))

但我得到一个错误:

(user=> ArityException Wrong number of args (0) passed to: PersistentArrayMap  clojure.lang.AFn.throwArity (AFn.java:437)

【问题讨论】:

    标签: clojure functional-programming


    【解决方案1】:

    #({...}) 扩展为 (fn [] ({....})),它会尝试不带任何参数地调用地图。

    试试这个:

    (defn closest-point [point all-points]
        (map (fn [p] {:point p :dist (distance point p)}) all-points))
    

    (defn closest-point [point all-points]
        (map #(hash-map :point % :dist (distance point %)) all-points))
    

    (defn dist-info
      [point p]
      {:point p :dist (distance point p)})
    
    (defn closest-point [point all-points]
        (map #(dist-info point %) all-points))
    

    【讨论】:

    • 约斯特,谢谢。我有一个复制和粘贴错误,它省略了我的哈希周围的#(),我现在在问题中解决了这个问题。您的第二个解决方案完美运行!如果您删除开头段落和第一个示例(不起作用),我会接受您的回答。
    【解决方案2】:

    如果您使用for 理解而不是map,这将更具可读性。另外,要实际选择最近的点,您可以使用min-key

    (defn closest-point [point all-points]
      (apply min-key :dist
             (for [p all-points]
               {:point p :dist (distance point p)})))
    

    【讨论】:

      【解决方案3】:

      如何在不从代码中删除任何内容并仅添加一个单词的情况下修复它:identity

      (defn closest-point [point all-points]
          (map #(identity {:point % :dist (distance point %)}) all-points))
      

      【讨论】:

        【解决方案4】:
        (defn closest-point [point all-points]
          (map #(hash-map :point % :dist (distance point %) ) all-points)                                                                 
        

        结果:-

        ({:point [0 0], :dist 2.7} {:point [1 1], :dist 3.5} {:point [2 2], :dist 4})
        

        【讨论】:

          猜你喜欢
          • 2022-01-09
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 2022-01-08
          • 2015-09-21
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多