gpt4 book ai didi

arrays - 创建具有切换行和列的数组的影子数组

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:34 25 4
gpt4 key购买 nike

我正在尝试找到一种方法来创建具有切换行和列的数组的副本。
我想通过设置从影子数组到原始数组的指针来做到这一点,以便 item[2 1] 指向 item[1 2]。

使用指针的效果是,当原始数组发生变化时,阴影数组也将反射(reflect)该变化。

到目前为止,我想出了对数组中的每个项目使用长度为 1 的置换数组。
它有效,但结果是一个带有数组的数组。
我的问题是,有没有更好的方法来做到这一点?
有没有办法通过阴影数组使用setf来设置原始数组中的值?

到目前为止我的代码:

(defun shadow-column-array (array)
(let* ((colsize (second (array-dimensions array)))
(rowsize (first (array-dimensions array)))
(b (make-array (list colsize rowsize))))
(dotimes (i rowsize b)
(dotimes (j colsize)

(setf (aref b j i)
(make-array 1
:displaced-to array
:displaced-index-offset (+ (* i rowsize) j)))))))

一些输出:

*a* => #2A((0.0 0.1 0.2) (1.0 1.1 1.2) (2.0 2.1 2.2))  

(setq b (shadow-column-array (*a*))

*b* => #2A((#(0.0) #(1.0) #(2.0)) (#(0.1) #(1.1) #(2.1)) (#(0.2) #(1.2) #(2.2)))

列的置换数组现在是

 col1 => #(#(0.0) #(1.0) #(2.0))    
col2 => #(#(0.1) #(1.1) #(2.1))
col3 => #(#(0.2) #(1.2) #(2.2))

最佳答案

使原始数组的每个元素都成为“对单元格的引用”。然后创建一个具有相同单元格但元素相反的阴影数组。更改单元格中的值将更改数组内容。

(defun make-celled-array (m n init)
(let ((array (make-array (list m n))))
(dotimes (i m)
(dotimes (j n)
(setf (aref array i j) (list init)))) ; (list init) makes a 'cell'
array))
(defun celled-array-ref (array m n)
(car (aref array m n)))
(defsetf celled-array-ref (array m n) (val)
`(setf (car (aref ,array ,m ,n)) ,val))

(defun shadow-celled-array (ca)
(let ((m (array-dimension ca 1)) ; swapped
(n (array-dimension ca 0)))
(let ((array (make-array (list m n))))
(dotimes (i m)
(dotimes (j n)
(setf (aref array i j) (aref ca j i)))) ; swapped
array)))

使用:

* (defvar a1 (make-celled-array 2 4 1))
A1

* (setf (celled-array-ref a1 0 3) 10)
10

* a1
#2A(((1) (1) (1) (10)) ((1) (1) (1) (1)))

* (defvar a2 (shadow-celled-array a1))
A2

* a2
#2A(((1) (1)) ((1) (1)) ((1) (1)) ((10) (1)))

* (celled-array-ref a2 3 0)
10

* (setf (celled-array-ref a2 3 0) 100)
100

* (celled-array-ref a1 0 3)
100

关于arrays - 创建具有切换行和列的数组的影子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com