dictionary - Lisp:多维数组逐元素操作

标签 dictionary lisp multidimensional-array loops

在 Common Lisp 中将逐元素操作应用于多维数组的“正确”构造是什么?

以下示例应该有助于说明我正在尝试做的事情:

A) 假设我想将数组的每个元素增加一个:

0 1 2    1 2 3
3 4 5 -> 4 5 6
6 7 8    7 8 9

B) 假设我想添加 2 个数组:

1 2   -1 -1    0 1
3 4 + -2 -2 -> 1 2
5 6   -3 -3    2 3

C) 假设我想按元素查找几个数组中的最大元素:

max( 0 1 , 4 -1 , 0 0 ) -> 4 1
     2 3   0  0   8 1      8 3

基本上我想我正在寻找某种“arraymap”函数,它可以像这样使用:(arraymap f A1 A2 ... An),其中 f 将 n 个参数作为input,和Ai是大小相同的数组。

在上面的例子中,它会像这样使用:

一个)

(setq M #2A((0 1 2) (3 4 5) (6 7 8)))
(arraymap #'incf M)

乙)

(setq M #2A((1 2) (3 4) (5 6)))
(setq N #2A((-1 -1) (-2 -2) (-3 -3)))
(arraymap #'+ M N)

C)

(setq M #2A((0 1) (2 3)))
(setq N #2A((4 -1) (0 0)))
(setq O #2A((0 0) (8 1)))
(arraymap #'max M N O)

我已经尝试了一些使用 map 和 loop 的构造,但它似乎不起作用,因为多维数组不是序列类型。

最佳答案

有四种方法可以做到这一点:

  • 根据数组维度编写一个 ARRAY-MAP 函数并对其进行迭代。

  • 使用 ROW-MAJOR-AREF ,它将数组视为向量。

  • 使用置换的一维数组进行运算。

使用置换数组的示例:

(defun array-map (function &rest arrays)
  "maps the function over the arrays.
   Assumes that all arrays are of the same dimensions.
   Returns a new result array of the same dimension."
  (flet ((make-displaced-array (array)
           (make-array (reduce #'* (array-dimensions array))
                       :displaced-to array)))
    (let* ((displaced-arrays (mapcar #'make-displaced-array arrays))
           (result-array (make-array (array-dimensions (first arrays))))
           (displaced-result-array (make-displaced-array result-array)))
      (declare (dynamic-extent displaced-arrays displaced-result-array))
      (apply #'map-into displaced-result-array function displaced-arrays)
      result-array)))

使用它:

CL-USER 3 > (array-map #'1+ #2A((0 1 2) (3 4 5) (6 7 8)))

#2A((1 2 3) (4 5 6) (7 8 9))

CL-USER 4 > (array-map #'+ #2A((1 2) (3 4) (5 6)) #2A((-1 -1) (-2 -2) (-3 -3)) )

#2A((0 1) (1 2) (2 3))
  • 使用内部的、特定于实现的操作来进行高效的数组操作。

关于dictionary - Lisp:多维数组逐元素操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4116069/

相关文章:

lisp - 使用相对路径加载文件

lisp - Common Lisp : first returns first, 但 last 返回最后一个列表——嗯?

c++ - 如何从具有 userID 和 pageID 的大型日志文件中查找最常访问的 3 个网页序列

vb6 - Scripting.Dictionary 的RemoveAll() 方法是否首先释放其所有元素?

arrays - Lisp 变量未绑定(bind)

c - C9 9's "restrict"关于指向指针的指针的语义是什么?

algorithm - 如何在2d数组中搜索从左到右和从上到下排序的数字?

python - 尝试将二维列表重新排列为不同的二维列表

c++ - 值类型在map中的地址

javascript - Maps 如何在 JavaScript 中对对象引用进行哈希处理?