Arrays 正在寻找在2D Lisp数组上映射函数的方法

Arrays 正在寻找在2D Lisp数组上映射函数的方法,arrays,common-lisp,Arrays,Common Lisp,所有地图功能,如mapcar,mapcan,mapc等,都需要列表作为其输入。我使用的是二维阵列,考虑到阵列的尺寸通常很大(有时为50000 x 1000),我不希望弄乱阵列的排列 我需要一种方法将类似于(logn)的函数应用于二维数组中的每个元素,并生成一个结果二维数组 非常感谢任何帮助或指导 使用AllegroCL(Common Lisp)您需要的是 大概是这样的: (defun数组映射(函数数组 &可选(retval(生成数组(数组维度数组))) “将函数应用于数组的每个元素

所有地图功能,如
mapcar
mapcan
mapc
等,都需要列表作为其输入。我使用的是二维阵列,考虑到阵列的尺寸通常很大(有时为50000 x 1000),我不希望弄乱阵列的排列

我需要一种方法将类似于
(logn)
的函数应用于二维数组中的每个元素,并生成一个结果二维数组

非常感谢任何帮助或指导


使用AllegroCL(Common Lisp)

您需要的是

大概是这样的:

(defun数组映射(函数数组
&可选(retval(生成数组(数组维度数组)))
“将函数应用于数组的每个元素。
返回新数组,或写入可选的第3个参数。“
(dotimes(i(数组总大小数组)retval)
(setf(世界其他主要地区检索一)
(funcall函数(行主aref数组i‘‘‘‘‘‘)’)
例如:

(定义参数a(生成数组’(23):初始内容’((123)(456)))
A.
==>#2A((1 2 3)(4 5 6))
(数组映射#'sqrt a)
==>#2A((1.4142135 1.7320508)(2.236068 2.4494898))
A.不会改变!
==>#2A((1 2 3)(4 5 6))
您还可以使用
数组映射
,类似于:

(数组映射#'1+a)
==>#2A((2 3 4)(5 6 7))
A.已修改,未分配新存储
==>#2A((2 3 4)(5 6 7))
注意数组映射将适用于任何数组维度,从向量到矩阵再到10d&c

练习:实现
数组多映射
接受任意数量参数和任意数量数组的函数,以便

(数组多映射#'+#A((1 2 3)(4 5 6))#A((11 22 33)(44 55 66)))
=>#A((12 24 36)(48 60 72))

PS。整个or值值得研究。

让用户为新数组指定元素类型可能会更好。@jkiiski:我考虑过,但决定不这样做。如果用户需要此级别的控制,他可以通过
retval
。从参数数组类型推断数组类型可能会阻止
sqrt
示例工作,因为输入数组可能专门化为整数。这很好。非常感谢。我喜欢它非常简单,易于实现,尽管功能更复杂。