Matrix 设置球拍中多维向量的各个元素

Matrix 设置球拍中多维向量的各个元素,matrix,vector,racket,Matrix,Vector,Racket,对于一个大学项目,我必须用相当大的语言制作一个基于矩阵的游戏,矩阵被定义为多维向量。 我需要设置矩阵的单个元素,我的代码是: (require racket/vector) (define test (make-vector 4 (make-vector 4 0))) (define (matrix-set matrix row column value) (vector-set! (vector-ref matrix row) column value) ) (display tes

对于一个大学项目,我必须用相当大的语言制作一个基于矩阵的游戏,矩阵被定义为多维向量。 我需要设置矩阵的单个元素,我的代码是:

(require racket/vector)

(define test (make-vector 4 (make-vector 4 0)))

(define (matrix-set matrix row column value)
   (vector-set! (vector-ref matrix row) column value)
)
(display test)(newline)
(matrix-set test 0 0 1)
(display test)
并输出:

#(#(0 0 0 0) #(0 0 0 0) #(0 0 0 0) #(0 0 0 0))
#(#(1 0 0 0) #(1 0 0 0) #(1 0 0 0) #(1 0 0 0))
我搜索了racket文档,只找到了通过创建新矩阵来设置元素的函数和问题

为什么函数设置的是整个列而不是元素

如何解决此问题?

(生成向量4(生成向量4 0))
与以下内容相同:

(let ((x (make-vector 4 0)))
  (vector x x x x))
也就是说,
(make vector 4 0)
只调用一次,其值用于外部向量的所有4个插槽


您需要的是类似于
(for/vector((i4))(makevector40))
,它将为外部向量的每个元素调用
(makevector40)
(并创建一个不同的向量)。

另一种方法是使用向量生成迭代器。我不确定它的语法是否比使用thunks更干净,但从概念上讲,我觉得它更熟悉,也许更简单

(define test (for/vector ([i (range 4)])(make-vector 4 0)))

(matrix-set test 0 0 1)  ; '#(#(1 0 0 0) #(0 0 0 0) #(0 0 0 0) #(0 0 0 0))
第三种选择,不像球拍那样,是使用


另一方面,有时有必要了解一下
do
,因为
do
不需要为每种类型记忆不同的命令,因为
do
对向量、列表、,和散列。

这也是文档部分对它的解释。@Daniel我的回答解释了原因:您的所有列实际上都是同一个对象的别名。我还提供了一个解决方案。因此,我没有创建向量向量向量,而是创建了同一向量的引用向量?所以向量是问题所在,设置元素的函数是正确的?racket说for/vector没有定义,但多亏了你,我才成功地解决了这个问题。
(define test
  (do ((vec (make-vector 4))
       (i 0 (+ i 1)))
      ((= i 4) vec)
    (vector-set! vec i (make-vector 4 0))))