有没有办法将aref和setf数组中的几个元素?

时间:2013-11-22 03:59:15

标签: common-lisp scientific-computing

我对数值分析很感兴趣,最近开始与Common LISP发生恋情。我发现我的思维过程受到多年来更多命令式样式编程的强烈影响,所以我正在寻求开发更多lispy方法。我认为,这是LISP道路上的共同主题。

无论如何,通过CLTL2读取,表明可以在恒定时间内访问向量,而访问列表是在线性时间内完成的(第2.5.1节)。然后可以(setf (apply #'aref *some-vector* idx) new-value)设置向量的一个位置。我的两部分问题是:

一个。有没有办法通过给出列表索引来获取数组的几个值,而不必遍历列表?例如,类似于(map 'array #'aref *some-array* idx-list)的正确版本。

湾有没有办法以与上面相同的精神设置数组的某些元素的值?能够将函数(通过充分定义的mapreduce等)应用于从数组中提取的值列表(例如,采样和插值)是理想的。

我还要感谢任何关于一般数组操作和特别是数值计算的评论(指向教程或书籍的指针,一些邮件列表,常见的陷阱,何时使用列表或其他数据结构等)。

干杯。

3 个答案:

答案 0 :(得分:3)

湾您可以一次分配多个连续值:

(setf (subseq vector start end) values)

答案 1 :(得分:2)

一个。

您可以映射以获取索引值,如下所示:

(map 'vector #'(lambda (idx) (aref *some-array* idx)) idx-list)

请注意,这仅适用于一维数组。一个超过一维的版本看起来像这样:

(map 'vector #'(lambda (idx) (apply #'aref *some-array* idx)) idx-list)

答案 2 :(得分:0)

我不确定你为什么要避免循环,因为像MAP之类的函数必须循环。

但您可以将MAP与创建循环列表的函数结合使用,例如

(defun cycle (x)
   (let ((result (list x)))
      (setf (cdr result) result)
    result))

(defun multiple-aref (array indices)
   (map 'vector #'aref (cycle array) indices))

(multiple-aref '#(a b c d e f g) '(1 3 5))

=> #(B D F)

(cycle array)创建无限列表(array array array array ...)。但是MAP仍然有效,因为它只检查了许多元素,因为它给出了 shortest 列表(在本例中为'(1 2 3))。