mapcar
,mapcan
,mapc
等所有地图功能都需要列表作为输入。我正在使用2D数组,并且考虑到通常较大的尺寸(有时为50,000 x 1,000),我宁愿不要弄乱我的阵列的等级。
我需要一种方法将类似(log n)
的函数应用于2D数组中的每个元素,并生成一个生成的2D数组。
非常感谢任何帮助或指示。
使用AllegroCL(Common Lisp)
答案 0 :(得分:7)
您需要的是
的组合这样的事情:
(defun array-map (function array
&optional (retval (make-array (array-dimensions array))))
"Apply FUNCTION to each element of ARRAY.
Return a new array, or write into the optional 3rd argument."
(dotimes (i (array-total-size array) retval)
(setf (row-major-aref retval i)
(funcall function (row-major-aref array i)))))
示例:
(defparameter a (make-array '(2 3) :initial-contents '((1 2 3) (4 5 6))))
a
==> #2A((1 2 3) (4 5 6))
(array-map #'sqrt a)
==> #2A((1 1.4142135 1.7320508) (2 2.236068 2.4494898))
a ; does not change!
==> #2A((1 2 3) (4 5 6))
您还可以使用与map-into
类似的array-map
:
(array-map #'1+ a a)
==> #2A((2 3 4) (5 6 7))
a ; modified, no new storage is allocated
==> #2A((2 3 4) (5 6 7))
注意 array-map
适用于任何数组维度,从向量到矩阵到10d& c。
练习:实现array-multi-map
接受任意数量的参数和任意数量的数组的函数,以便
(array-multi-map #'+ #A((1 2 3) (4 5 6)) #A((11 22 33) (44 55 66)))
==> #A((12 24 36) (48 60 72))
<强> PS 即可。整个CLHS Chapter 15 Arrays或CLtL2 Chapter 17 Arrays值得研究。