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
示例工作,因为输入数组可能专门化为整数。这很好。非常感谢。我喜欢它非常简单,易于实现,尽管功能更复杂。