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))))