Clojure生成矩阵

4

我正在学习《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
也许这只是一个复制粘贴错误,但请注意,您对square-mat的调用与defn所期望的参数不同。 - cfrick
1个回答

2

查看定义clatrix/map-indexed。它接受一个三个参数的函数(行索引、列索引和该位置上的元素)和一个矩阵。

在内部函数(fn [i j n] (if (= i j) 1 n)中,n绑定的不是矩阵中行数的数量,而是该位置(i,j)上的值 - 这恰好总是零,因为init矩阵被初始化为零。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接