【问题标题】:Set Individual Elements of Multidimensional Vectors in Racket在球拍中设置多维向量的单个元素
【发布时间】:2016-05-26 01:31:07
【问题描述】:

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

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

我搜索了球拍文档,只找到了通过创建新矩阵来设置元素的函数,thisthis 问题也是。

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

有什么办法可以解决?

【问题讨论】:

    标签: matrix vector racket


    【解决方案1】:

    (make-vector 4 (make-vector 4 0)) 等同于:

    (let ((x (make-vector 4 0)))
      (vector x x x x))
    

    (make-vector 4 0)只被调用一次,其值用于外向量的所有4个槽。

    您需要像(for/vector ((i 4)) (make-vector 4 0)) 这样的东西,它将为外部向量的每个元素调用(make-vector 4 0)(并创建一个不同的向量)。

    【讨论】:

    • 文档的Objects and Imperative Update 部分也是这样解释的。
    • @Daniel 我的回答解释了原因:您的所有列实际上都别名为同一个对象。我也提供了一个解决方案。
    • 所以我没有制作一个向量的向量,而是制作了一个引用同一向量的向量?
    • 那么向量是问题,设置元素的函数可以吗?
    • racket 说 for/vector 未定义,但感谢您,我设法解决了这个问题。
    【解决方案2】:

    另一种方法是使用矢量生成迭代器for/vector。我不确定语法是否比使用 thunk 更简洁,但从概念上讲,我觉得它更熟悉,也许更简单。

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

    与 Racket 不同的第三种选择是使用do.

    (define test
      (do ((vec (make-vector 4))
           (i 0 (+ i 1)))
          ((= i 4) vec)
        (vector-set! vec i (make-vector 4 0))))
    

    另一方面,有时有必要了解一下do,因为do 不需要为每种类型记住不同的命令,因为do 在向量、列表和散列上做了它所做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多