【发布时间】:2016-11-25 18:39:39
【问题描述】:
所以我有一些代码需要多维数组的一个子集,它的工作方式更像是获取矩阵的一个子部分,理想情况下它会像一个置换数组一样工作。
假设我有一些看起来像这样的东西
(defvar *a* (make-array '(3 3) :initial-contents
'((1 2 3) (2 3 1) (3 1 2))
我希望它可以通过数组*b* 访问
(defvar *b* (make-array '(2 2) :displaced-to *a* :displaced-index-offset
(array-major-row-index *a* '(1 1)))
这样*b* 将指向
#2a((3 1) (1 2))
而不是
#2a((3 1) (3 1))
我已经为自己编写了一个多维切片函数,它可以复制我想要的数组部分,但是不需要手动来回复制是理想的,在 vanilla common lisp 中有没有像这样工作的解决方案?
我了解置换多维数组的工作方式与(array-major-row-index) 直接相一致(即#2a((1 2 3) (2 3 4)) 具有行索引(0 1 2 3 4 5),因此维度'(2 2) 的置换数组'(1 0) 将指向#2a((2 3) (2 3)),所以我需要包装新数组,使其引用旧数组中的特定位置,但到目前为止我不知道如何捕获这样的引用。
我不完全确定是否有可能获得指向数组中位置的指针,所以如果可以清除它,我将不胜感激。
【问题讨论】:
-
你不能使用内置数组来做到这一点,而且置换数组在大多数实现(即 SBCL)中往往表现不佳。一个解决方案是将所有数据保存在一个大向量中,并简单地保存包含维度和步幅的小对象(即足够的信息来表示您想要的子集类型,以便您可以轻松地将(多维)索引转换为正确的索引进入向量)这是可能的,但您需要编写自己的函数来获取子集(或转置或其他)以及您自己的函数和 setf-expander 进行访问。
-
@DanRobertson 谢谢,这是另一个很好的理由来复制进出数组。
标签: multidimensional-array common-lisp