我构建了一个由向量组成的二维数组(矩阵):
(setq zero-row [0 0 0 0 0])
=> [0 0 0 0 0]
(setq zero-mat (make-vector 4 zero-row))
=> [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
我将通过将第 2 行替换为包含已更改元素的向量,将第 2 行第 3 列(0 索引)中的元素设置为 42:
(aset zero-mat 2 [0 0 0 42 0])
=> [0 0 0 42 0]
zero-mat
=> [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 42 0] [0 0 0 0 0]]
有用。
接下来,我尝试构建一个函数,该函数采用这种方法在这样的二维数组中设置第 (i,j) 个元素:
(defun matrix-set (mat i j elt)
"Set the (i, j)-th element of mat to elt. mat is a vector of the row vectors. Indexing is 0-based in each component."
(let ((vect (aref mat i)))
(aset vect j elt)
(aset mat i vect)
mat))
但这不起作用:
(setq zero-row [0 0 0 0 0])
=> [0 0 0 0 0]
(setq zero-mat (make-vector 4 zero-row))
=> [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
(matrix-set zero-mat 2 3 42)
=> [[0 0 0 42 0] [0 0 0 42 0] [0 0 0 42 0] [0 0 0 42 0]]
看起来数组的所有行都链接到同一个向量,因此更改该向量会更改所有行。
所以有两个问题:(1)为什么在第二种情况下会发生这种情况,而不是第一种情况?(2) 我该如何解决这个问题(这样我就可以访问以这种方式表示的二维数组的第 (i, j) 个条目)?
(我最初是编写一个小例程来添加两个矩阵,表示为上述向量的向量,并且遇到了同样的问题。我认为上面的精简示例可能会使问题更清楚。)