得到一个矢量的间隔

时间:2009-10-23 21:02:00

标签: vector scheme

我想在Scheme中取一个向量的间隔。我知道有一个名为vector->values的过程,但似乎它分别返回每个元素,而我想将结果作为向量。我怎样才能做到这一点?

> (vector->values (vector 1 2 3 4 5) 0 3)
1
2
3

虽然我需要:

#(1 2 3)

5 个答案:

答案 0 :(得分:3)

如果你正在使用PLT,你可以通过几种简单的方法来实现这一目标:

(define (subvector v start end)
  (list->vector (for/list ([i (in-vector v start end)]) i)))

(define (subvector v start end)
  (build-vector (- end start) (lambda (i) (vector-ref v (+ i start)))))

(define (subvector v start end)
  (define new (make-vector (- end start)))
  (vector-copy! new 0 v start end)
  new)

最后一个可能是最快的。没有这种内置操作的原因是人们通常不这样做。当您在Scheme中处理向量时,通常这样做是因为您想要优化某些内容,因此返回向量和范围而不是分配新的更常见。

(如果你认为这很有用,请在PLT邮件列表上提出建议。)

答案 1 :(得分:2)

Scheme R6RS标准有 make-vector vector-ref vector-set! vector-length 。有了它,你可以编写自己的函数子向量,它似乎不是R6RS(!)的一部分。一些Scheme实现已经有类似 subvector 的东西了。

您也可以切换到Common Lisp,它在标准中提供SUBSEQ功能。

答案 2 :(得分:2)

以下是使用R6RS的便携式SRFI 43版本:

#!r6rs

(import (rnrs base)
        (prefix (srfi :43) srfi/43:))

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)

答案 3 :(得分:1)

#lang scheme
(define (my-vector-value v l h c)
  (if (and (>= c l) (< c h))
      (cons (first v) (my-vector-value (rest v) l h (add1 c)))
      empty))

(list->vector (my-vector-value (vector->list (vector 1 2 3 4 5)) 0 3 0))

隔都?是的,非常。但是只需要两分钟的时间来完成工作。

(我发现使用Scheme中的列表通常更容易)

答案 4 :(得分:0)

你想要subvector

(subvector (vector 1 2 3 4 5) 0 3)