【发布时间】:2021-05-08 20:27:49
【问题描述】:
我有一个 5x5 矩阵(二维数组)
#2A((C C C C C)
(C C C C C)
(C C C C C)
(C C C C C)
(C C C C C))
和一个 3x3 矩阵
#2A((X X X)
(X X X)
(X X X))
我想将d 放入索引 1x1 处的m
(defvar *m* (make-array '(5 5) :initial-element 'C ))
(defvar *d* (make-array '(3 3)
:displaced-to *m*
:displaced-index-offset (array-row-major-index *m* 1 1)))
(dotimes (i 3)
(dotimes (j 3)
(setf (aref *d* i j) 'X)))
输出
#2A((C C C C C)
(C X X X X)
(X X X X X)
(C C C C C)
(C C C C C))
所需的输出
#2A((C C C C C)
(C X X X C)
(C X X X C)
(C X X X C)
(C C C C C))
如何尽可能实际地安排代码以获得所需的输出?该代码不需要使用二维数组或其函数。实际上最好不要使用二维数组,因为对于这个特殊问题,它们似乎不合适。我使用二维数组只是因为我认为它们具有解决此问题的适当功能。欢迎任何其他解决问题的方法。
系统:Windows 上的 CLisp
【问题讨论】:
-
你可以使用turtleware.eu/posts/Conformal-array-displacement.html,我无法给出正确答案,也许明天
-
@coredump 我刚刚看到你的评论(在我看不到任何答案或评论大约 6 小时后,我变得有点疏远了)这篇文章是正确的,它几乎给出了答案。实际上,我认为它有资格作为答案,直到我注意到它仅在 LispM 上起作用,所谓的保形阵列位移是可能的。在 Common Lisp 上实现相同功能的给定 hack 很好,但坦率地说,看起来有点复杂。不过,总而言之,很高兴知道。我感谢您的努力。