Matrix Clojure生成矩阵

Matrix Clojure生成矩阵,matrix,clojure,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 :persist

我要扔掉机器学习的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)))
在第二个函数中,我不理解这部分(如果(=ij)大于1,则为n)。还有什么别的原因?n是
clatrix/map索引的大小。它采用三个参数(行索引、列索引和该位置的元素)和一个矩阵的函数

在内部函数
(fn[ij n](if(=ij)1n)
n
不与矩阵中的行数绑定,而是与位置(i,j)中的值绑定,该位置恰好始终为零,因为
init
矩阵是用零初始化的


看起来这本书使用了一个非常混乱的符号(因为
n
绑定到外部函数中矩阵的行数,最好命名内部函数
x
的第三个参数,或者以其他方式命名),但函数应该仍然可以工作。

据我所知,
init
矩阵是一个正方形,填充了零值,对于单位矩阵,需要将对角线(rowidx==columnidx)设置为1。所以它就是这样做的:映射索引从旧矩阵返回一个新矩阵,将单位fn应用于每个
[i j value-at-i-j]
,所以当
i!=j
时,它只剩下0(因为所有的值(n)都是0),而对于
i==j
(对角位置索引)返回1,这可能只是一个复制粘贴错误,但请注意,对square mat的调用的参数与defn期望的参数不同)