【问题标题】:(elisp) Elements of vectors of vectors(elisp) 向量的元素
【发布时间】:2013-01-30 15:09:58
【问题描述】:

我构建了一个由向量​​组成的二维数组(矩阵):

(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 行第 3 列(0 索引)中的元素设置为 42,方法是将第 2 行替换为包含已更改元素的向量:

(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) 个条目)?

(我最初是写一个小程序来添加两个矩阵,表示为上面的向量的向量,并且遇到了同样的问题。我认为上面的精简示例可能会使问题更清楚。)

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    在第一种情况下,您将“外部”向量中的一个元素替换为另一个向量(而其他三个“内部”向量仍然都指向同一个元素)。在第二种情况下,您替换“内部”向量中的一个元素(并且根据您的示例,您只有一个内部向量重复四次。将向量初始化为不同 distinct 向量的一种简单方法是像这样:

    (let ((i 0) (new-vector (make-vector 4 nil))
     (while (< (progn (aset new-vector i (make-vector 5 0))
                      (incf i))
               (length new-vector)))
    

    抱歉,如果有任何错别字,是在原地写的。但是这个想法应该很简单,可以弄清楚。

    【讨论】:

    • 我不明白为什么两者都没有“替换外部向量中的元素”。如果我如上所述构造零垫,那么执行“(aset zero-mat 2 [0 0 0 42 0])”我将零垫的第二个元素设置为常数向量。如果我构造零垫,然后做“(setq vec(aref zero-mat 2))”,然后改变vec的一个元素,所有零垫的行改变---“你只有一个内部向量重复了四次”。但是 zero-mat 在这两种情况下都是以相同的方式构建的,那么为什么它的工作方式不一样呢?也许我应该问:向量是指针数组吗?
    • ...但我仍在考虑您的评论。我明白您在说什么:我感到困惑的一点是,在我看来,在这两种情况下,我“在另一个向量”在构建零矩阵。所以在这两种情况下,我确实“相同的元素重复了四次” - 所以我认为在这两种情况下,如果我改变那个“相同的元素重复四次”,无论是通过在常量向量中设置还是设置- 引用那个“相同元素”的东西,both 应该改变所有“四个”元素。抱歉有点慢。
    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多