代码之家  ›  专栏  ›  技术社区  ›  RufLife

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

  •  2
  • RufLife  · 技术社区  · 9 年前

    所有地图功能如下 mapcar , mapcan , mapc 等需要列表作为输入。我正在使用2D数组,考虑到数组的大小通常很大(有时为50000 x 1000),我不希望弄乱数组的秩。

    我需要一种方法来应用如下函数 (log n) 并生成结果2D数组。

    非常感谢您的帮助或指导。

    使用AllegroCL(通用Lisp)

    1 回复  |  直到 9 年前
        1
  •  7
  •   sds Niraj Rajbhandari    9 年前

    (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))
    

    array-map 类似 map-into

    (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))
    

    那个 阵列映射 将适用于任何数组维度,从向量到矩阵,再到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))
    

    附言 .整体 CLHS Chapter 15 Arrays CLtL2 Chapter 17 Arrays