Matrix Clojure矩阵等式,机器学习的Clojure
我试图理解这个函数:Matrix Clojure矩阵等式,机器学习的Clojure,matrix,clojure,Matrix,Clojure,我试图理解这个函数: (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函数反复应用一个函数,该函数接受序列中连续元素的两个参数,并在序列中的所有
(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函数反复应用一个函数,该函数接受序列中连续元素的两个参数,并在序列中的所有元素都被应用函数缩减后返回最终结果
有人能解释一下这部分吗:
(reduce#(和%1%2)(map=ab))
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
指定了两个集合,所以映射函数需要使用两个参数;I
和x
在您的示例中,map
也采用两个集合,A
和B
。由于=
采用任意数量的参数,因此可以在此处使用它来检查一个集合中的每个元素是否与另一个集合中相同索引处的元素相同
或者换句话说
(mapv = [1 2 3] [1 2 4])
基本上和
[(= 1 1)
(= 2 2)
(= 3 4)] ; Note that they differ here
返回[true-false]
。最后一个为false,因为每个集合的最后一个元素不匹配
这是两个集合的成对相等检查。
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
指定了两个集合,所以映射函数需要使用两个参数;I
和x
在您的示例中,map
也采用两个集合,A
和B
。由于=
采用任意数量的参数,因此可以在此处使用它来检查一个集合中的每个元素是否与另一个集合中相同索引处的元素相同
或者换句话说
(mapv = [1 2 3] [1 2 4])
基本上和
[(= 1 1)
(= 2 2)
(= 3 4)] ; Note that they differ here
返回[true-false]
。最后一个为false,因为每个集合的最后一个元素不匹配
这是两个集合的成对相等性检查。你需要帮助减少的哪部分?它给出的描述似乎很清楚。你能解释一下(map=ab)吗?它返回了什么?你需要帮助减少的哪部分?它给出的描述似乎很清楚。你能解释一下(map=ab)吗?它返回了什么?好的,现在我很清楚了。你能用同样的方式解释一下吗(reduce#(和%1%2))?@nenad为此,我只想玩一下
reduce
,因为那里没有太多的新奇的东西。我会说,虽然这可以/应该写成(取而代之的是every?identity
。两者都只是检查集合中的每个元素是否真实。在这种情况下,它检查映射返回的每个值是否真实。@nenad同样,我回答了这个问题,因为我认为我可以写出一个好的答案,但实际上,这个问题以及您最近提出的几个问题都非常广泛。请尝试缩小您的提问范围,提出更具体的问题。reduce和map的整个功能不是很具体,可以通过两种功能的练习来回答。@nenad再次强调,%1
是上次迭代中返回的和。%2
将成为集合的每个元素,just不喜欢使用映射
。减少[true-false-true]
,%1
将以true开头,然后您就有了(和true-true)
,第二个true是集合的第一个元素%2
。因为在这种情况下和返回true,所以在下一次迭代中%1
将再次为true。然后因为集合的第二个元素为false,它将检查(和true-false)
。这将返回false,因此%1
在下一次迭代中将为false。然后它将检查(和false-true)
,这也是false@nenad作为另一个应该澄清问题的示例,请参见此处:。好的,我现在已经非常清楚了。您可以用同样的方式解释(reduce#(和%1%2))?@nenad为此,我只想玩一下reduce
,因为那里没有太多新奇的东西。我想说的是,这可以/应该写成(取而代之的是every?identity
。两者都只是检查集合中的每个元素是否真实。在这种情况下,它检查映射返回的每个值是否真实。@nenad同样,我回答了这个问题,因为我认为我可以写出一个好的答案,但实际上,这个问题以及您最近提出的几个问题都非常广泛。请尝试缩小您的提问范围,提出更具体的问题。reduce和map的整个功能不是很具体,可以通过两种功能的练习来回答。@nenad再次强调,%1
是上次迭代中返回的和。%2
将成为集合的每个元素,just不喜欢使用映射
。减少[true-false-true]
,%1
将以true开头,然后您就有了(和true-true)
,第二个true是集合的第一个元素%2
。因为在这种情况下和
返回true,所以在下一次迭代中%1
将再次为true。然后,因为集合的第二个元素为false,它将检查(和true false)
。这将