我对数值分析很感兴趣,最近我开始了一段与Common的恋情。我发现我的思维过程受到多年来更加命令式编程的强烈影响,因此我正在寻求一种更灵活的方法。我想,对于那些在LISP道路上的人来说,这是一个共同的主题。
无论如何,通过CLTL2读取,可以在恒定时间内访问向量,而访问列表是以线性时间(秒)完成的。2.5.1)。然后,我们可以(setf (apply #'aref *some-vector* idx) new-value)来设置一个向量的位置。我的两个问题是:
是否有一种方法可以通过提供列表索引来获得数组的多个值,而不必循环遍历列表?例如,类似于(map 'array #'aref *some-array* idx-list)的正确版本的东西。
是否有一种方法可以以与上面相同的精神设置数组中某些元素的值?最好能够应用一个函数(通过一个定义充分的map,或者reduce等等)。从数组中提取的用于采样和插值的值列表。
我还希望对数组操作,特别是数值计算(指向教程或书籍的指针、一些邮件列表、常见的陷阱、何时使用列表或其他数据结构等)发表意见。
干杯。
发布于 2013-11-22 09:58:27
一个。
您可以通过如下所示的索引映射来获取值:
(map 'vector #'(lambda (idx) (aref *some-array* idx)) idx-list)请注意,这只适用于一维数组。一个更多的一维版本应该是这样的:
(map 'vector #'(lambda (idx) (apply #'aref *some-array* idx)) idx-list)发布于 2013-11-22 06:20:53
b.您可以一次分配几个连续值:
(setf (subseq vector start end) values)发布于 2013-11-22 04:46:36
我不知道为什么要避免循环,因为像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仍然有效,因为它只检查许多元素,因为在给定的最短列表中(在本例中是'(1 2 3))。
https://stackoverflow.com/questions/20136760
复制相似问题