我有一个维度为 '(3 3 2) 的数组,其名称为 test-array:
#3A(((0 0) (0 0.1) (0 0.3))
((1 0) (1 0.1) (1 0.3))
((2 0) (2 0.1) (2 0.3)))
请注意,数组中最内部的列表(排名 2)是点坐标,所以通常数组是
#3A(((x0 y0) (x0 y1) (x0 y2))
((x1 y0) (x1 y1) (x1 y2))
((x2 y0) (x2 y1) (x2 y2)))
现在我想使用这个数组中的元素来创建一个新数组。
在该数组的每一行(数组等级:0)上,我想从第一个 xy 坐标中减去第二个 xy 坐标,从第二个中减去第三个 xy 坐标。所以基本上我以参数形式寻找的结果是:
#3A(((x0-x0 y1-y0) (x0-x0 y2-y1))
((x1-x1 y1-y0) (x1-x1 y2-y1))
((x2-x2 y1-y0) (x2-x2 y2-y1))
是否有任何简单的直接函数或操作仅通过操作初始数组来做到这一点?
由于我不知道对此有任何直接操作,因此我只想从初始数组中制作一个列表:initial-contents
作为新数组的列表。因此,这种方法的最初目标是获取初始内容列表,即:
(((x0-x0 y1-y0) (x0-x0 y2-y1))
((x1-x1 y1-y0) (x1-x1 y2-y1))
((x2-x2 y1-y0) (x2-x2 y2-y1))
为此,我想到了一个使用dotimes
两次的代码(外循环数是行数,内循环数是列数):
(let ((result-1))
(dotimes (n (array-dimension test-array 0) result-1)
(setq result-1
(append result-1
(let ((result-2))
(dotimes (m (1- (array-dimension test-array 1)) result-2)
(setq result-2
(append result-2
(list (- (aref test-array n (1+ m) 0)
(aref test-array n m 0))
(- (aref test-array n (1+ m) 1)
(aref test-array n m 1)))))))))))
但这有一个问题,这也是问题的标题。显然,这种“参数化”方式(使用 n 和 m)为 CL 提供输入aref
是不受欢迎的:(aref test-array n m 0)
为什么会出现这样的问题?你能想到在循环中使用 aref 的任何其他方法,或者用另一种方法制作 :initial-contents 列表吗?
请注意,这是我实际问题的一种相对简单的形式,因为我拥有的实际初始数组的尺寸为 (21 16 2) 并且所有 xy 坐标都彼此不同。
答案将不胜感激...