我要扔机器学习书的Clojure,我不理解一个函数的一部分。
(defn square-mat
"Creates a square matrix of size n x n whose
elements are all e. Accepts an option argument
for the matrix implementation"
[n e & {:keys [implementation]
:or {implementation :persistent-vector}}]
(let [repeater #(repeat n %)]
(matrix implementation (-> e repeater repeater))))
(defn id-mat
"Creates an identity matrix of n x n size"
[n]
(let [init (square-mat :clatrix n 0)
identity-f (fn [i j n]
(if (= i j) 1 n))]
(cl/map-indexed identity-f init)))
在第二个函数中,我不理解这个部分(if(= i j)而不是其他n)。为什么还要? n是大小
答案 0 :(得分:2)
clatrix/map-indexed
的{p> Look at the definition。它需要三个参数(行索引,列索引和该位置中的元素)和矩阵的函数。
在内部函数(fn [i j n] (if (= i j) 1 n)
中,n
不是矩阵中的行数,而是绑定到位置(i,j)中的值 - 恰好始终为零因为init
矩阵是用零初始化的。
看起来这本书使用了一个非常令人困惑的符号(因为n
与外部函数中矩阵中的行数绑定,所以最好命名内部函数的第三个参数{{ 1}}或其他方式),但该功能仍应有效。