Clojure生成矩阵

时间:2018-05-18 09:46:36

标签: matrix clojure

我要扔机器学习书的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是大小

1 个答案:

答案 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}}或其他方式),但该功能仍应有效。