我对数值分析很感兴趣,最近开始与Common LISP发生恋情。我发现我的思维过程受到多年来更多命令式样式编程的强烈影响,所以我正在寻求开发更多lispy方法。我认为,这是LISP道路上的共同主题。
无论如何,通过CLTL2读取,表明可以在恒定时间内访问向量,而访问列表是在线性时间内完成的(第2.5.1节)。然后可以(setf (apply #'aref *some-vector* idx) new-value)
设置向量的一个位置。我的两部分问题是:
一个。有没有办法通过给出列表索引来获取数组的几个值,而不必遍历列表?例如,类似于(map 'array #'aref *some-array* idx-list)
的正确版本。
湾有没有办法以与上面相同的精神设置数组的某些元素的值?能够将函数(通过充分定义的map
或reduce
等)应用于从数组中提取的值列表(例如,采样和插值)是理想的。
我还要感谢任何关于一般数组操作和特别是数值计算的评论(指向教程或书籍的指针,一些邮件列表,常见的陷阱,何时使用列表或其他数据结构等)。
干杯。
答案 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)
)。