首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案中是否有两种不同长度向量的求和方法?

方案中是否有两种不同长度向量的求和方法?
EN

Stack Overflow用户
提问于 2022-04-19 11:51:18
回答 2查看 97关注 0票数 0

我是Lisp方言的初学者,我正在尝试实现一个函数sum-vector,它以两个数字向量作为参数,并返回一个向量与输入向量的对应元素之和。

我试过下面的代码,但是我想不出如何将两个不同长度的向量相加。这是我目前的代码

代码语言:javascript
复制
#lang scheme
(define sum-vector
  (lambda (vec-1 vec-2)
    (let* ((len (vector-length vec-1))
                                       
           (result (make-vector len)))
      (do ((index 0 (+ index 1)))
          ((= index len) result)
        (vector-set! result index
                     (+ (vector-ref vec-1 index)
                        (vector-ref vec-2 index)))))))

(sum-vector (vector 4 6 8 3) (vector 5 6 7))

当我运行上面的代码时,它非常适合具有相同长度的向量,例如(sum-vector (vector 4 6 8) (vector 5 6 7))返回#(9 12 15),我希望它对不同的长度类似工作,例如(sum-vector (vector 4 6 8 3) (vector 5 6 7))应该返回#(9 11 15 3),但是我不知道这样做的逻辑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-19 12:28:48

一个可能的解决方案是在每个向量中添加零,使其长度相等,然后使用vector-map

代码语言:javascript
复制
(define (zero-vector len)
  (make-vector len 0))

(define (append-zeros vec max-len)
  (vector-append vec (zero-vector (- max-len (vector-length vec)))))

(define (sum-vector v1 v2)
  (let ((max-len (max (vector-length v1)
                      (vector-length v2))))
    (vector-map +
                (append-zeros v1 max-len)
                (append-zeros v2 max-len))))

测试:

代码语言:javascript
复制
> (sum-vector (vector 1 2 3) (vector 1 2 3 4 5 6))
'#(2 4 6 4 5 6)
> (sum-vector (vector) (vector 1 2 3 4 5 6 7 8))
'#(1 2 3 4 5 6 7 8)
票数 2
EN

Stack Overflow用户

发布于 2022-04-22 02:36:44

另一种球拍特有的方式。

球拍有一个叫做理解的东西,它允许在容器上进行简单的迭代。特别是,for/vector返回结果的向量:

代码语言:javascript
复制
> (define v1 (vector 4 6 8 3))
> (define v2 (vector 5 6 7))
> (for/vector ([e1 v1] [e2 v2]) (+ e1 e2))
'#(9 12 15)

注意,得到的向量是被迭代的最短容器的长度。但是,您可以告诉它生成一个给定长度的向量:

代码语言:javascript
复制
> (for/vector #:length (vector-length v1) ([e1 v1] [e2 v2]) (+ e1 e2))
'#(9 12 15 0)

它用0填充额外的元素。将其与vector-copy!相结合,在给定的偏移量下,将一系列元素从一个向量复制到另一个向量,以便将额外的元素从较大的向量复制到较小的向量(如果它们的长度相同,则不做任何操作),您就可以得到:

代码语言:javascript
复制
(define (sum-vector v1 v2)
  (let ([sum-helper
         (lambda (short long)
           (let ([result (for/vector #:length (vector-length long)
                                     ([e1 short] [e2 long])
                                     (+ e1 e2))])
             (vector-copy! result (vector-length short)
                           long (vector-length short) (vector-length long))
             result))])
    (if (< (vector-length v1) (vector-length v2))
        (sum-helper v1 v2)
        (sum-helper v2 v1))))

示例:

代码语言:javascript
复制
> (sum-vector (vector 4 6 8 3) (vector 5 6 7))
'#(9 12 15 3)
> (sum-vector (vector 1 2 3) (vector 1 2 3 4 5 6))
'#(2 4 6 4 5 6)
> (sum-vector (vector) (vector 1 2 3 4 5 6 7 8))
'#(1 2 3 4 5 6 7 8)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71924497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档