Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs (elisp)向量的向量元素_Emacs_Elisp - Fatal编程技术网

Emacs (elisp)向量的向量元素

Emacs (elisp)向量的向量元素,emacs,elisp,Emacs,Elisp,我构建了一个二维数组(矩阵),由向量向量组成: (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])

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

(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)-th元素:

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


(我最初编写了一个小程序来添加两个矩阵,表示为如上所述的向量向量,但遇到了相同的问题。我认为上面的简化示例可能会使问题更清楚。)

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

(let ((i 0) (new-vector (make-vector 4 nil))
 (while (< (progn (aset new-vector i (make-vector 5 0))
                  (incf i))
           (length new-vector)))
(let((i0)(新向量(使向量4为零))
(同时(<(程序(设置新向量i(使向量5为0))
(麻管局一)
(新向量的长度)

很抱歉,如果有任何拼写错误,我正在写。但是这个想法应该足够简单,可以解决它。

我不明白为什么两者都不“替换外向量中的元素”。如果我像上面那样构造zero mat,那么就这样做”(aset zero mat 2[0 0 0 42 0])我将zero mat的第二个元素设置为一个常量向量。如果我构造zero mat,则执行“(setq vec(aref zero mat 2))”,然后更改vec的一个元素,zero mat的所有行都会更改----“只有一个内部向量被复制了四次”.但zero mat在这两种情况下都是以相同的方式构建的,所以为什么不以相同的方式工作呢?也许我应该问:向量是指针数组吗?…但我仍然在思考你的评论。我理解你的意思:我困惑的是,在这两种情况下,我似乎都是在构造零矩阵时,“将同一向量存储在另一个向量中四次”。因此,在这两种情况下,我确实“将同一元素重复四次”-因此我认为,在这两种情况下,如果我改变“将同一元素重复四次”,无论是在一个常量向量中进行设置,还是在引用该“同一元素”的对象中进行设置,两者都应更改所有“四”元素。抱歉,速度太慢。