首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以使数组中的几个元素得到aref和setf?

是否有一种方法可以使数组中的几个元素得到aref和setf?
EN

Stack Overflow用户
提问于 2013-11-22 03:59:15
回答 3查看 499关注 0票数 1

我对数值分析很感兴趣,最近我开始了一段与Common的恋情。我发现我的思维过程受到多年来更加命令式编程的强烈影响,因此我正在寻求一种更灵活的方法。我想,对于那些在LISP道路上的人来说,这是一个共同的主题。

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

是否有一种方法可以通过提供列表索引来获得数组的多个值,而不必循环遍历列表?例如,类似于(map 'array #'aref *some-array* idx-list)的正确版本的东西。

是否有一种方法可以以与上面相同的精神设置数组中某些元素的值?最好能够应用一个函数(通过一个定义充分的map,或者reduce等等)。从数组中提取的用于采样和插值的值列表。

我还希望对数组操作,特别是数值计算(指向教程或书籍的指针、一些邮件列表、常见的陷阱、何时使用列表或其他数据结构等)发表意见。

干杯。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-22 09:58:27

一个。

您可以通过如下所示的索引映射来获取值:

代码语言:javascript
复制
(map 'vector #'(lambda (idx) (aref *some-array* idx)) idx-list)

请注意,这只适用于一维数组。一个更多的一维版本应该是这样的:

代码语言:javascript
复制
(map 'vector #'(lambda (idx) (apply #'aref *some-array* idx)) idx-list)
票数 2
EN

Stack Overflow用户

发布于 2013-11-22 06:20:53

b.您可以一次分配几个连续值:

代码语言:javascript
复制
(setf (subseq vector start end) values)
票数 3
EN

Stack Overflow用户

发布于 2013-11-22 04:46:36

我不知道为什么要避免循环,因为像MAP这样的函数无论如何都必须循环。

但是,您可以使用MAP,与创建循环列表的函数相结合。

代码语言:javascript
复制
(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仍然有效,因为它只检查许多元素,因为在给定的最短列表中(在本例中是'(1 2 3))。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20136760

复制
相关文章

相似问题

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