Matrix Clojure生成矩阵
我要扔掉机器学习的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
(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期望的参数不同)