我正在学习《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)))
在这个第二个函数中,我不理解这一部分(如果(= i j)那么1,否则n)。为什么是else n?n是大小。
init
矩阵是一个填充了零值的正方形矩阵,而对于单位矩阵,您需要将对角线(rowidx == columnidx)设置为1。因此它的作用是:map-indexed 返回一个新矩阵,从旧矩阵中应用 identity-fn 到每个[i j value-at-i-j]
,所以当i != j
时,它只保留0(因为所有值(n)都是0),而对于i == j
(对角线位置索引)返回1。 - leetwinski