【问题标题】:Clojure Matrix equality, Clojure for Machine LearningClojure 矩阵等式,用于机器学习的 Clojure
【发布时间】:2018-05-19 12:54:40
【问题描述】:

我正在尝试理解这个功能:

(defn mat-eq
  "Checks if two matrices are equal"
  [A B]
   (and (= (count A) (count B))
        (reduce #(and %1 %2) (map = A B))))

“我们首先使用count和=函数比较两个矩阵的行长,然后使用reduce函数比较内部向量元素。”我不明白这部分:“本质上,reduce 函数重复应用一个函数,该函数接受两个参数给序列中的连续元素,并在序列中的所有元素都被应用函数减少时返回最终结果。” 有人可以解释这部分: (减少#(和%1 %2) (map = A B))

【问题讨论】:

  • 您在减少的哪一部分需要帮助?它给出的描述似乎很清楚。
  • 你能解释一下(地图= A B)吗?它返回什么?

标签: matrix clojure


【解决方案1】:

map 能够获取多个集合,而不仅仅是一个。

你可以通过运行类似的东西来查看这项工作

(map (fn [i x]
       (println i x))
     (range) ; The first collection
     ["A" "B" "C"]) ; The second collection

0 A
1 B
2 C
=> (nil nil nil)

上面的例子也可以简单写成

(map println (range) ["A" "B" "C"])

map 的集合数量决定了需要给映射函数多少参数。由于我这里给了map两个集合,所以映射函数需要带两个参数; ix 在这种情况下。

在您的示例中,map 也采用两个集合,AB。由于= 接受任意数量的参数,因此可以在这里使用它来检查一个集合中的每个元素是否与另一个集合中相同索引处的元素相同。

或者,换句话说

(mapv = [1 2 3] [1 2 4])

基本上是一样的

[(= 1 1)
 (= 2 2)
 (= 3 4)] ; Note that they differ here

返回[true true false]。最后一个是假的,因为每个集合的最后一个元素不匹配。

这是两个集合的成对相等检查。

【讨论】:

  • 好的,我现在很清楚了。你能用同样的方式解释吗(减少#(和%1 %2))?
  • @nenad 为此,我只想玩reduce,因为那里没有太多花哨的东西。我会说虽然可以/应该写成(every? identity。两者都只是检查集合中的每个元素是否都是真实的。在这种情况下,它会检查 map 返回的每个值是否为真。
  • @nenad 另外,我之所以回答这个问题是因为我认为我可以写一个很好的答案,但实际上,这个问题以及您最近提出的几个问题都非常广泛。请尝试缩小您的要求,以便提出更具体的问题。 reduce 和 map 的整个功能不是很具体,只需对两者进行一些练习即可回答。
  • @nenad 同样,%1 是最后一次迭代返回的 and%2 将成为集合的每个元素,就像 map 一样。减少[true false true]%1 将开始为真,然后你有(and true true),第二个真是%2,集合的第一个元素。因为and 在这种情况下返回true,所以在下一次迭代中%1 将再次为true。然后因为集合的第二个元素是假的,它会检查(and true false)。这将返回 false,因此 %1 将在下一次迭代中为 false。然后它会检查(and false true),这也是错误的
  • @nenad 作为一个可以解决问题的替代示例,请参见此处:gist.github.com/carcigenicate/9b33a4d567378081c70e9ef7792452a6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2019-04-05
  • 2011-02-22
相关资源
最近更新 更多